@@ -1312,6 +1312,13 @@ static int snd_ctl_elem_add(struct snd_ctl_file *file,
err = snd_ctl_add(card, kctl);
if (err < 0)
return err;
+ info->id = kctl->id;
+ /*
+ * We cannot fill any field for the number of elements added by this
+ * operation because there're no specific fields. The usage of 'owner'
+ * field for this purpose may cause any bugs to userspace applications
+ * because the field originally means any applications lock it.
+ */
down_write(&card->controls_rwsem);
card->user_ctl_count++;
@@ -1321,12 +1328,20 @@ static int snd_ctl_elem_add(struct snd_ctl_file *file,
}
static int snd_ctl_elem_add_user(struct snd_ctl_file *file,
- struct snd_ctl_elem_info __user *_info, int replace)
+ struct snd_ctl_elem_info __user *_info,
+ int replace)
{
struct snd_ctl_elem_info info;
+ int err;
+
if (copy_from_user(&info, _info, sizeof(info)))
return -EFAULT;
- return snd_ctl_elem_add(file, &info, replace);
+ err = snd_ctl_elem_add(file, &info, replace);
+ if (err < 0)
+ return err;
+ if (copy_to_user(_info, &info, sizeof(info)))
+ return -EFAULT;
+ return 0;
}
static int snd_ctl_elem_remove(struct snd_ctl_file *file,
currently some members related identical information are not fiiled in returned parameter of SNDRV_CTL_IOCTL_ELEM_ADD. This is not better for userspace application. This commit copies information to returned value. Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> --- sound/core/control.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-)