diff options
author | Juergen Kreileder <jk@blackdown.de> | 2006-02-20 18:28:00 -0800 |
---|---|---|
committer | Chris Wright <chrisw@sous-sol.org> | 2006-03-01 14:36:35 -0800 |
commit | 46cadda8ed7d32f0435699b3c2cfe5973785b4c1 (patch) | |
tree | 7a56eeba4156125b8109d5688f9889cb82bab5bf /sound | |
parent | fd01ab8d4018937a01cbc221e7a006bcde24c87f (diff) |
[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 <jk@blackdown.de>
Cc: Jaroslav Kysela <perex@suse.cz>
Acked-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Chris Wright <chrisw@sous-sol.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/core/control_compat.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/sound/core/control_compat.c b/sound/core/control_compat.c index 207c7de5129c..6784528bb1a2 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; } |