From: Juergen Kreileder Date: Tue, 21 Feb 2006 02:28:00 +0000 (-0800) Subject: [PATCH] Fix snd-usb-audio in 32-bit compat environment X-Git-Tag: v2.6.15.5~19 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=46cadda8ed7d32f0435699b3c2cfe5973785b4c1;p=thirdparty%2Fkernel%2Fstable.git [PATCH] Fix snd-usb-audio in 32-bit compat environment I'm getting oopses with snd-usb-audio in 32-bit compat environments: control_compat.c:get_ctl_type() doesn't initialize 'info', so 'itemlist[uinfo->value.enumerated.item]' in usbmixer.c:mixer_ctl_selector_info() might access random memory (The 'if ((int)uinfo->value.enumerated.item >= cval->max)' doesn't fix all problems because of the unsigned -> signed conversion.) Signed-off-by: Juergen Kreileder Cc: Jaroslav Kysela Acked-by: Takashi Iwai Signed-off-by: Andrew Morton Signed-off-by: Chris Wright Signed-off-by: Greg Kroah-Hartman --- diff --git a/sound/core/control_compat.c b/sound/core/control_compat.c index 207c7de5129cb..6784528bb1a2a 100644 --- a/sound/core/control_compat.c +++ b/sound/core/control_compat.c @@ -164,7 +164,7 @@ struct sndrv_ctl_elem_value32 { static int get_ctl_type(snd_card_t *card, snd_ctl_elem_id_t *id, int *countp) { snd_kcontrol_t *kctl; - snd_ctl_elem_info_t info; + snd_ctl_elem_info_t *info; int err; down_read(&card->controls_rwsem); @@ -173,13 +173,19 @@ static int get_ctl_type(snd_card_t *card, snd_ctl_elem_id_t *id, int *countp) up_read(&card->controls_rwsem); return -ENXIO; } - info.id = *id; - err = kctl->info(kctl, &info); + info = kzalloc(sizeof(*info), GFP_KERNEL); + if (info == NULL) { + up_read(&card->controls_rwsem); + return -ENOMEM; + } + info->id = *id; + err = kctl->info(kctl, info); up_read(&card->controls_rwsem); if (err >= 0) { - err = info.type; - *countp = info.count; + err = info->type; + *countp = info->count; } + kfree(info); return err; }