Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ccb8774a authored by Takashi Iwai's avatar Takashi Iwai Committed by Greg Kroah-Hartman
Browse files

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



[ 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: 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.de


Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent d9251dd7
Loading
Loading
Loading
Loading
+7 −7
Original line number Original line Diff line number Diff line
@@ -189,9 +189,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 &&
@@ -211,7 +210,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;
@@ -707,7 +707,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;
@@ -807,7 +807,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++) {
@@ -839,7 +839,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 */
+12 −4
Original line number Original line Diff line number Diff line
@@ -66,8 +66,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;
@@ -401,8 +405,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;
+2 −0
Original line number Original line Diff line number Diff line
@@ -68,6 +68,8 @@ struct snd_usb_audio {
	struct usb_host_interface *ctrl_intf;	/* the audio control interface */
	struct usb_host_interface *ctrl_intf;	/* the audio control interface */
};
};


#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...) \