]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ALSA: usb-audio: Add error checks for usb_driver_claim_interface() calls
authorTakashi Iwai <tiwai@suse.de>
Tue, 6 Apr 2021 11:35:34 +0000 (13:35 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 14 May 2021 07:50:33 +0000 (09:50 +0200)
[ Upstream commit 5fb45414ae03421255593fd5556aa2d1d82303aa ]

There are a few calls of usb_driver_claim_interface() but all of those
miss the proper error checks, as reported by Coverity.  This patch
adds those missing checks.

Along with it, replace the magic pointer with -1 with a constant
USB_AUDIO_IFACE_UNUSED for better readability.

Reported-by: coverity-bot <keescook+coverity-bot@chromium.org>
Addresses-Coverity-ID: 1475943 ("Error handling issues")
Addresses-Coverity-ID: 1475944 ("Error handling issues")
Addresses-Coverity-ID: 1475945 ("Error handling issues")
Fixes: b1ce7ba619d9 ("ALSA: usb-audio: claim autodetected PCM interfaces all at once")
Fixes: e5779998bf8b ("ALSA: usb-audio: refactor code")
Link: https://lore.kernel.org/r/202104051059.FB7F3016@keescook
Link: https://lore.kernel.org/r/20210406113534.30455-1-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
sound/usb/card.c
sound/usb/quirks.c
sound/usb/usbaudio.h

index fc7c359ae215a7c93fb982d5e6d2e6d944d40576..258b81b39917759db0369468b90f27e68095617b 100644 (file)
@@ -182,9 +182,8 @@ static int snd_usb_create_stream(struct snd_usb_audio *chip, int ctrlif, int int
                                ctrlif, interface);
                        return -EINVAL;
                }
-               usb_driver_claim_interface(&usb_audio_driver, iface, (void *)-1L);
-
-               return 0;
+               return usb_driver_claim_interface(&usb_audio_driver, iface,
+                                                 USB_AUDIO_IFACE_UNUSED);
        }
 
        if ((altsd->bInterfaceClass != USB_CLASS_AUDIO &&
@@ -204,7 +203,8 @@ static int snd_usb_create_stream(struct snd_usb_audio *chip, int ctrlif, int int
 
        if (! snd_usb_parse_audio_interface(chip, interface)) {
                usb_set_interface(dev, interface, 0); /* reset the current interface */
-               usb_driver_claim_interface(&usb_audio_driver, iface, (void *)-1L);
+               return usb_driver_claim_interface(&usb_audio_driver, iface,
+                                                 USB_AUDIO_IFACE_UNUSED);
        }
 
        return 0;
@@ -864,7 +864,7 @@ static void usb_audio_disconnect(struct usb_interface *intf)
        struct snd_card *card;
        struct list_head *p;
 
-       if (chip == (void *)-1L)
+       if (chip == USB_AUDIO_IFACE_UNUSED)
                return;
 
        card = chip->card;
@@ -993,7 +993,7 @@ static int usb_audio_suspend(struct usb_interface *intf, pm_message_t message)
        struct usb_mixer_interface *mixer;
        struct list_head *p;
 
-       if (chip == (void *)-1L)
+       if (chip == USB_AUDIO_IFACE_UNUSED)
                return 0;
 
        if (!chip->num_suspended_intf++) {
@@ -1024,7 +1024,7 @@ static int __usb_audio_resume(struct usb_interface *intf, bool reset_resume)
        struct list_head *p;
        int err = 0;
 
-       if (chip == (void *)-1L)
+       if (chip == USB_AUDIO_IFACE_UNUSED)
                return 0;
 
        atomic_inc(&chip->active); /* avoid autopm */
index 5ab2a4580bfb24d92202564481cc610130a3e693..bddef8ad5778340bfe1cddac5103aee404e64096 100644 (file)
@@ -55,8 +55,12 @@ static int create_composite_quirk(struct snd_usb_audio *chip,
                if (!iface)
                        continue;
                if (quirk->ifnum != probed_ifnum &&
-                   !usb_interface_claimed(iface))
-                       usb_driver_claim_interface(driver, iface, (void *)-1L);
+                   !usb_interface_claimed(iface)) {
+                       err = usb_driver_claim_interface(driver, iface,
+                                                        USB_AUDIO_IFACE_UNUSED);
+                       if (err < 0)
+                               return err;
+               }
        }
 
        return 0;
@@ -390,8 +394,12 @@ static int create_autodetect_quirks(struct snd_usb_audio *chip,
                        continue;
 
                err = create_autodetect_quirk(chip, iface, driver);
-               if (err >= 0)
-                       usb_driver_claim_interface(driver, iface, (void *)-1L);
+               if (err >= 0) {
+                       err = usb_driver_claim_interface(driver, iface,
+                                                        USB_AUDIO_IFACE_UNUSED);
+                       if (err < 0)
+                               return err;
+               }
        }
 
        return 0;
index 9667060ff92be8bf72eb3caf9102ba8d633470b7..e54a98f4654902e97edf8876aec31a0cb1d64b68 100644 (file)
@@ -63,6 +63,8 @@ struct snd_usb_audio {
        struct media_intf_devnode *ctl_intf_media_devnode;
 };
 
+#define USB_AUDIO_IFACE_UNUSED ((void *)-1L)
+
 #define usb_audio_err(chip, fmt, args...) \
        dev_err(&(chip)->dev->dev, fmt, ##args)
 #define usb_audio_warn(chip, fmt, args...) \