[alsa-devel] [PATCH 3/4] ctl: fill identical information to return value when adding userspace elements

Takashi Iwai tiwai at suse.de
Sat Apr 11 17:41:04 CEST 2015


At Sat, 11 Apr 2015 17:41:04 +0900,
Takashi Sakamoto wrote:
> 
> 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. When failing to copy
> into userspace, the added elements are going to be removed. Then, no
> applications can lock these elements between adding and removing because
> these are already locked.
> 
> Signed-off-by: Takashi Sakamoto <o-takashi at sakamocchi.jp>

Applied, thanks.


Takashi

> ---
>  sound/core/control.c | 22 +++++++++++++++++++++-
>  1 file changed, 21 insertions(+), 1 deletion(-)
> 
> diff --git a/sound/core/control.c b/sound/core/control.c
> index a750846..ccb1ca2 100644
> --- a/sound/core/control.c
> +++ b/sound/core/control.c
> @@ -1214,6 +1214,7 @@ static int snd_ctl_elem_add(struct snd_ctl_file *file,
>  	unsigned int access;
>  	long private_size;
>  	struct user_element *ue;
> +	unsigned int offset;
>  	int err;
>  
>  	if (!*info->id.name)
> @@ -1316,6 +1317,15 @@ static int snd_ctl_elem_add(struct snd_ctl_file *file,
>  	err = snd_ctl_add(card, kctl);
>  	if (err < 0)
>  		return err;
> +	offset = snd_ctl_get_ioff(kctl, &info->id);
> +	snd_ctl_build_ioff(&info->id, kctl, offset);
> +	/*
> +	 * Here 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 PID of a process
> +	 * which locks the element.
> +	 */
>  
>  	down_write(&card->controls_rwsem);
>  	card->user_ctl_count++;
> @@ -1328,9 +1338,19 @@ 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 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))) {
> +		snd_ctl_remove_user_ctl(file, &info.id);
> +		return -EFAULT;
> +	}
> +
> +	return 0;
>  }
>  
>  static int snd_ctl_elem_remove(struct snd_ctl_file *file,
> -- 
> 2.1.0
> 


More information about the Alsa-devel mailing list