[alsa-devel] [PATCH] ALSA: usb-audio: fix endianness bug in snd_nativeinstruments_*

Daniel Mack zonque at gmail.com
Fri Apr 5 20:53:24 CEST 2013


Eldad Zack <eldad at fogrefinery.com> wrote:

>The usb_control_msg() function expects __u16 types and performs
>the endianness conversions by itself.
>However, in three places, a conversion is performed before it is
>handed over to usb_control_msg(), which leads to a double conversion
>(= no conversion):
>* snd_usb_nativeinstruments_boot_quirk()
>* snd_nativeinstruments_control_get()
>* snd_nativeinstruments_control_put()
>
>Caught by sparse:
>
>sound/usb/mixer_quirks.c:512:38: warning: incorrect type in argument 6
>(different base types)
>sound/usb/mixer_quirks.c:512:38:    expected unsigned short [unsigned]
>[usertype] index
>sound/usb/mixer_quirks.c:512:38:    got restricted __le16 [usertype]
><noident>
>sound/usb/mixer_quirks.c:543:35: warning: incorrect type in argument 5
>(different base types)
>sound/usb/mixer_quirks.c:543:35:    expected unsigned short [unsigned]
>[usertype] value
>sound/usb/mixer_quirks.c:543:35:    got restricted __le16 [usertype]
><noident>
>sound/usb/mixer_quirks.c:543:56: warning: incorrect type in argument 6
>(different base types)
>sound/usb/mixer_quirks.c:543:56:    expected unsigned short [unsigned]
>[usertype] index
>sound/usb/mixer_quirks.c:543:56:    got restricted __le16 [usertype]
><noident>
>sound/usb/quirks.c:502:35: warning: incorrect type in argument 5
>(different base types)
>sound/usb/quirks.c:502:35:    expected unsigned short [unsigned]
>[usertype] value
>sound/usb/quirks.c:502:35:    got restricted __le16 [usertype]
><noident>
>
>Signed-off-by: Eldad Zack <eldad at fogrefinery.com>

Acked-by: Daniel Mack <zonque at gmail.com>

Thanks for catching this!


Daniel

>---
> sound/usb/mixer_quirks.c | 4 ++--
> sound/usb/quirks.c       | 2 +-
> 2 files changed, 3 insertions(+), 3 deletions(-)
>
>diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
>index 497d274..ebe9144 100644
>--- a/sound/usb/mixer_quirks.c
>+++ b/sound/usb/mixer_quirks.c
>@@ -509,7 +509,7 @@ static int snd_nativeinstruments_control_get(struct
>snd_kcontrol *kcontrol,
> 	else
> 		ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), bRequest,
> 				  USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
>-				  0, cpu_to_le16(wIndex),
>+				  0, wIndex,
> 				  &tmp, sizeof(tmp), 1000);
> 	up_read(&mixer->chip->shutdown_rwsem);
> 
>@@ -540,7 +540,7 @@ static int snd_nativeinstruments_control_put(struct
>snd_kcontrol *kcontrol,
> 	else
> 		ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), bRequest,
> 				  USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
>-				  cpu_to_le16(wValue), cpu_to_le16(wIndex),
>+				  wValue, wIndex,
> 				  NULL, 0, 1000);
> 	up_read(&mixer->chip->shutdown_rwsem);
> 
>diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
>index a2ac004..68e9220 100644
>--- a/sound/usb/quirks.c
>+++ b/sound/usb/quirks.c
>@@ -499,7 +499,7 @@ static int
>snd_usb_nativeinstruments_boot_quirk(struct usb_device *dev)
> {
> 	int ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
> 				  0xaf, USB_TYPE_VENDOR | USB_RECIP_DEVICE,
>-				  cpu_to_le16(1), 0, NULL, 0, 1000);
>+				  1, 0, NULL, 0, 1000);
> 
> 	if (ret < 0)
> 		return ret;




More information about the Alsa-devel mailing list