Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma
[linux-2.6-microblaze.git] / sound / core / control_compat.c
index 02df1d7..1d708aa 100644 (file)
@@ -22,24 +22,22 @@ struct snd_ctl_elem_list32 {
 static int snd_ctl_elem_list_compat(struct snd_card *card,
                                    struct snd_ctl_elem_list32 __user *data32)
 {
-       struct snd_ctl_elem_list __user *data;
+       struct snd_ctl_elem_list data = {};
        compat_caddr_t ptr;
        int err;
 
-       data = compat_alloc_user_space(sizeof(*data));
-
        /* offset, space, used, count */
-       if (copy_in_user(data, data32, 4 * sizeof(u32)))
+       if (copy_from_user(&data, data32, 4 * sizeof(u32)))
                return -EFAULT;
        /* pids */
-       if (get_user(ptr, &data32->pids) ||
-           put_user(compat_ptr(ptr), &data->pids))
+       if (get_user(ptr, &data32->pids))
                return -EFAULT;
-       err = snd_ctl_elem_list(card, data);
+       data.pids = compat_ptr(ptr);
+       err = snd_ctl_elem_list(card, &data);
        if (err < 0)
                return err;
        /* copy the result */
-       if (copy_in_user(data32, data, 4 * sizeof(u32)))
+       if (copy_to_user(data32, &data, 4 * sizeof(u32)))
                return -EFAULT;
        return 0;
 }