Commit 5fb45414 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: usb-audio: Add error checks for usb_driver_claim_interface() calls

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: default avatarcoverity-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: b1ce7ba6 ("ALSA: usb-audio: claim autodetected PCM interfaces all at once")
Fixes: e5779998 ("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.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 53cc2643
...@@ -181,9 +181,8 @@ static int snd_usb_create_stream(struct snd_usb_audio *chip, int ctrlif, int int ...@@ -181,9 +181,8 @@ static int snd_usb_create_stream(struct snd_usb_audio *chip, int ctrlif, int int
ctrlif, interface); ctrlif, interface);
return -EINVAL; return -EINVAL;
} }
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;
} }
if ((altsd->bInterfaceClass != USB_CLASS_AUDIO && if ((altsd->bInterfaceClass != USB_CLASS_AUDIO &&
...@@ -203,7 +202,8 @@ static int snd_usb_create_stream(struct snd_usb_audio *chip, int ctrlif, int int ...@@ -203,7 +202,8 @@ static int snd_usb_create_stream(struct snd_usb_audio *chip, int ctrlif, int int
if (! snd_usb_parse_audio_interface(chip, interface)) { if (! snd_usb_parse_audio_interface(chip, interface)) {
usb_set_interface(dev, interface, 0); /* reset the current 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; return 0;
...@@ -862,7 +862,7 @@ static void usb_audio_disconnect(struct usb_interface *intf) ...@@ -862,7 +862,7 @@ static void usb_audio_disconnect(struct usb_interface *intf)
struct snd_card *card; struct snd_card *card;
struct list_head *p; struct list_head *p;
if (chip == (void *)-1L) if (chip == USB_AUDIO_IFACE_UNUSED)
return; return;
card = chip->card; card = chip->card;
...@@ -992,7 +992,7 @@ static int usb_audio_suspend(struct usb_interface *intf, pm_message_t message) ...@@ -992,7 +992,7 @@ static int usb_audio_suspend(struct usb_interface *intf, pm_message_t message)
struct usb_mixer_interface *mixer; struct usb_mixer_interface *mixer;
struct list_head *p; struct list_head *p;
if (chip == (void *)-1L) if (chip == USB_AUDIO_IFACE_UNUSED)
return 0; return 0;
if (!chip->num_suspended_intf++) { if (!chip->num_suspended_intf++) {
...@@ -1022,7 +1022,7 @@ static int __usb_audio_resume(struct usb_interface *intf, bool reset_resume) ...@@ -1022,7 +1022,7 @@ static int __usb_audio_resume(struct usb_interface *intf, bool reset_resume)
struct list_head *p; struct list_head *p;
int err = 0; int err = 0;
if (chip == (void *)-1L) if (chip == USB_AUDIO_IFACE_UNUSED)
return 0; return 0;
atomic_inc(&chip->active); /* avoid autopm */ atomic_inc(&chip->active); /* avoid autopm */
......
...@@ -55,8 +55,12 @@ static int create_composite_quirk(struct snd_usb_audio *chip, ...@@ -55,8 +55,12 @@ static int create_composite_quirk(struct snd_usb_audio *chip,
if (!iface) if (!iface)
continue; continue;
if (quirk->ifnum != probed_ifnum && if (quirk->ifnum != probed_ifnum &&
!usb_interface_claimed(iface)) !usb_interface_claimed(iface)) {
usb_driver_claim_interface(driver, iface, (void *)-1L); err = usb_driver_claim_interface(driver, iface,
USB_AUDIO_IFACE_UNUSED);
if (err < 0)
return err;
}
} }
return 0; return 0;
...@@ -426,8 +430,12 @@ static int create_autodetect_quirks(struct snd_usb_audio *chip, ...@@ -426,8 +430,12 @@ static int create_autodetect_quirks(struct snd_usb_audio *chip,
continue; continue;
err = create_autodetect_quirk(chip, iface, driver); err = create_autodetect_quirk(chip, iface, driver);
if (err >= 0) if (err >= 0) {
usb_driver_claim_interface(driver, iface, (void *)-1L); err = usb_driver_claim_interface(driver, iface,
USB_AUDIO_IFACE_UNUSED);
if (err < 0)
return err;
}
} }
return 0; return 0;
......
...@@ -61,6 +61,8 @@ struct snd_usb_audio { ...@@ -61,6 +61,8 @@ struct snd_usb_audio {
struct media_intf_devnode *ctl_intf_media_devnode; struct media_intf_devnode *ctl_intf_media_devnode;
}; };
#define USB_AUDIO_IFACE_UNUSED ((void *)-1L)
#define usb_audio_err(chip, fmt, args...) \ #define usb_audio_err(chip, fmt, args...) \
dev_err(&(chip)->dev->dev, fmt, ##args) dev_err(&(chip)->dev->dev, fmt, ##args)
#define usb_audio_warn(chip, fmt, args...) \ #define usb_audio_warn(chip, fmt, args...) \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment