aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorNicolas Boichat <drinkcat@chromium.org>2016-01-18 08:35:01 -0500
committerTakashi Iwai <tiwai@suse.de>2016-01-18 08:39:13 -0500
commit9586495dc3011a80602329094e746dbce16cb1f1 (patch)
tree2d4f530337ac3bf67efaa8c4828a26be2849904b /sound
parent43c54b8c7cfe22f868a751ba8a59abf1724160b1 (diff)
ALSA: seq: Fix snd_seq_call_port_info_ioctl in compat mode
This reverts one hunk of commit ef44a1ec6eee ("ALSA: sound/core: use memdup_user()"), which replaced a number of kmalloc followed by memcpy with memdup calls. In this case, we are copying from a struct snd_seq_port_info32 to a struct snd_seq_port_info, but the latter is 4 bytes longer than the 32-bit version, so we need to separate kmalloc and copy calls. Fixes: ef44a1ec6eee ('ALSA: sound/core: use memdup_user()') Signed-off-by: Nicolas Boichat <drinkcat@chromium.org> Cc: <stable@vger.kernel.org> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound')
-rw-r--r--sound/core/seq/seq_compat.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/sound/core/seq/seq_compat.c b/sound/core/seq/seq_compat.c
index 81f7c109dc46..65175902a68a 100644
--- a/sound/core/seq/seq_compat.c
+++ b/sound/core/seq/seq_compat.c
@@ -49,11 +49,12 @@ static int snd_seq_call_port_info_ioctl(struct snd_seq_client *client, unsigned
49 struct snd_seq_port_info *data; 49 struct snd_seq_port_info *data;
50 mm_segment_t fs; 50 mm_segment_t fs;
51 51
52 data = memdup_user(data32, sizeof(*data32)); 52 data = kmalloc(sizeof(*data), GFP_KERNEL);
53 if (IS_ERR(data)) 53 if (!data)
54 return PTR_ERR(data); 54 return -ENOMEM;
55 55
56 if (get_user(data->flags, &data32->flags) || 56 if (copy_from_user(data, data32, sizeof(*data32)) ||
57 get_user(data->flags, &data32->flags) ||
57 get_user(data->time_queue, &data32->time_queue)) 58 get_user(data->time_queue, &data32->time_queue))
58 goto error; 59 goto error;
59 data->kernel = NULL; 60 data->kernel = NULL;