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: 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:b1ce7ba619
("ALSA: usb-audio: claim autodetected PCM interfaces all at once") Fixes:e5779998bf
("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>
This commit is contained in:
parent
53cc2643c1
commit
5fb45414ae
@ -181,9 +181,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 &&
|
||||
@ -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)) {
|
||||
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;
|
||||
@ -862,7 +862,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;
|
||||
@ -992,7 +992,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++) {
|
||||
@ -1022,7 +1022,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 */
|
||||
|
@ -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;
|
||||
@ -426,8 +430,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;
|
||||
|
@ -61,6 +61,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...) \
|
||||
|
Loading…
Reference in New Issue
Block a user