ALSA: x86: Handle the error from hdmi_audio_probe() properly
authorTakashi Iwai <tiwai@suse.de>
Tue, 31 Jan 2017 07:29:56 +0000 (08:29 +0100)
committerTakashi Iwai <tiwai@suse.de>
Fri, 3 Feb 2017 16:22:46 +0000 (17:22 +0100)
The error from hdmi_audio_probe() wasn't handled properly, and it may
leave some resources leaked or mapped.  Fix it and also clean up the
error paths.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/x86/intel_hdmi_lpe_audio.c

index 18a2ae6796b80695be3403f1f82f66d4c3e3e25a..0c11d82eb99bfc19a1b8db9cd4e1eda387e52e37 100644 (file)
@@ -422,16 +422,14 @@ static int hdmi_lpe_audio_probe(struct platform_device *pdev)
                        NULL);
        if (ret < 0) {
                dev_err(&hlpe_pdev->dev, "request_irq failed\n");
-               iounmap(mmio_start);
-               return -ENODEV;
+               goto error_irq;
        }
 
        /* alloc and save context */
        ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
        if (ctx == NULL) {
-               free_irq(irq, NULL);
-               iounmap(mmio_start);
-               return -ENOMEM;
+               ret = -ENOMEM;
+               goto error_ctx;
        }
 
        ctx->irq = irq;
@@ -454,15 +452,16 @@ static int hdmi_lpe_audio_probe(struct platform_device *pdev)
 
        if (pdata == NULL) {
                dev_err(&hlpe_pdev->dev, "%s: quit: pdata not allocated by i915!!\n", __func__);
-               kfree(ctx);
-               free_irq(irq, NULL);
-               iounmap(mmio_start);
-               return -ENOMEM;
+               ret = -ENOMEM;
+               goto error_probe;
        }
 
        platform_set_drvdata(pdev, ctx);
 
        ret = hdmi_audio_probe(pdev, &ctx->had);
+       if (ret < 0)
+               goto error_probe;
+
        dev_dbg(&hlpe_pdev->dev, "hdmi lpe audio: setting pin eld notify callback\n");
 
        /* The Audio driver is loading now and we need to notify
@@ -483,6 +482,14 @@ static int hdmi_lpe_audio_probe(struct platform_device *pdev)
        spin_unlock_irqrestore(&pdata->lpe_audio_slock, flag_irq);
 
        return ret;
+
+ error_probe:
+       kfree(ctx);
+ error_ctx:
+       free_irq(irq, NULL);
+ error_irq:
+       iounmap(mmio_start);
+       return ret;
 }
 
 /**