diff mbox series

ALSA: pcm: Fix missing fixup call in compat hw_refine ioctl

Message ID 20230829134344.31588-1-tiwai@suse.de (mailing list archive)
State Accepted
Commit 358040e3807754944dbddf948a23c6d914297ed7
Headers show
Series ALSA: pcm: Fix missing fixup call in compat hw_refine ioctl | expand

Commit Message

Takashi Iwai Aug. 29, 2023, 1:43 p.m. UTC
The update of rate_num/den and msbits were factored out to
fixup_unreferenced_params() function to be called explicitly after the
hw_refine or hw_params procedure.  It's called from
snd_pcm_hw_refine_user(), but it's forgotten in the PCM compat ioctl.
This ended up with the incomplete rate_num/den and msbits parameters
when 32bit compat ioctl is used.

This patch adds the missing call in snd_pcm_ioctl_hw_params_compat().

Reported-by: Meng_Cai@novatek.com.cn
Fixes: f9a076bff053 ("ALSA: pcm: calculate non-mask/non-interval parameters always when possible")
Cc: <stable@vger.kernel.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 sound/core/pcm_compat.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

Comments

Takashi Sakamoto Aug. 29, 2023, 1:52 p.m. UTC | #1
Hi,

On Tue, Aug 29, 2023 at 03:43:44PM +0200, Takashi Iwai wrote:
> The update of rate_num/den and msbits were factored out to
> fixup_unreferenced_params() function to be called explicitly after the
> hw_refine or hw_params procedure.  It's called from
> snd_pcm_hw_refine_user(), but it's forgotten in the PCM compat ioctl.
> This ended up with the incomplete rate_num/den and msbits parameters
> when 32bit compat ioctl is used.
> 
> This patch adds the missing call in snd_pcm_ioctl_hw_params_compat().
> 
> Reported-by: Meng_Cai@novatek.com.cn
> Fixes: f9a076bff053 ("ALSA: pcm: calculate non-mask/non-interval parameters always when possible")
> Cc: <stable@vger.kernel.org>
> Signed-off-by: Takashi Iwai <tiwai@suse.de>
> ---
>  sound/core/pcm_compat.c | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)

Indeed. I did overlook PCM compat layer. The branch for hw refine compat
ioctl should call the fixup, while the branch for hw params has no need
since the helper function call the fixup.

Reviewed-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>

> diff --git a/sound/core/pcm_compat.c b/sound/core/pcm_compat.c
> index 42c2ada8e888..c96483091f30 100644
> --- a/sound/core/pcm_compat.c
> +++ b/sound/core/pcm_compat.c
> @@ -253,10 +253,14 @@ static int snd_pcm_ioctl_hw_params_compat(struct snd_pcm_substream *substream,
>  		goto error;
>  	}
>  
> -	if (refine)
> +	if (refine) {
>  		err = snd_pcm_hw_refine(substream, data);
> -	else
> +		if (err < 0)
> +			goto error;
> +		err = fixup_unreferenced_params(substream, data);
> +	} else {
>  		err = snd_pcm_hw_params(substream, data);
> +	}
>  	if (err < 0)
>  		goto error;
>  	if (copy_to_user(data32, data, sizeof(*data32)) ||
> -- 
> 2.35.3


Regards

Takashi Sakamoto
Jaroslav Kysela Aug. 29, 2023, 1:58 p.m. UTC | #2
On 29. 08. 23 15:43, Takashi Iwai wrote:
> The update of rate_num/den and msbits were factored out to
> fixup_unreferenced_params() function to be called explicitly after the
> hw_refine or hw_params procedure.  It's called from
> snd_pcm_hw_refine_user(), but it's forgotten in the PCM compat ioctl.
> This ended up with the incomplete rate_num/den and msbits parameters
> when 32bit compat ioctl is used.
> 
> This patch adds the missing call in snd_pcm_ioctl_hw_params_compat().
> 
> Reported-by: Meng_Cai@novatek.com.cn
> Fixes: f9a076bff053 ("ALSA: pcm: calculate non-mask/non-interval parameters always when possible")
> Cc: <stable@vger.kernel.org>
> Signed-off-by: Takashi Iwai <tiwai@suse.de>
> ---
>   sound/core/pcm_compat.c | 8 ++++++--
>   1 file changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/sound/core/pcm_compat.c b/sound/core/pcm_compat.c
> index 42c2ada8e888..c96483091f30 100644
> --- a/sound/core/pcm_compat.c
> +++ b/sound/core/pcm_compat.c
> @@ -253,10 +253,14 @@ static int snd_pcm_ioctl_hw_params_compat(struct snd_pcm_substream *substream,
>   		goto error;
>   	}
>   
> -	if (refine)
> +	if (refine) {
>   		err = snd_pcm_hw_refine(substream, data);
> -	else
> +		if (err < 0)
> +			goto error;
> +		err = fixup_unreferenced_params(substream, data);
> +	} else {
>   		err = snd_pcm_hw_params(substream, data);
> +	}
>   	if (err < 0)
>   		goto error;
>   	if (copy_to_user(data32, data, sizeof(*data32)) ||

Reviewed-by: Jaroslav Kysela <perex@perex.cz>
diff mbox series

Patch

diff --git a/sound/core/pcm_compat.c b/sound/core/pcm_compat.c
index 42c2ada8e888..c96483091f30 100644
--- a/sound/core/pcm_compat.c
+++ b/sound/core/pcm_compat.c
@@ -253,10 +253,14 @@  static int snd_pcm_ioctl_hw_params_compat(struct snd_pcm_substream *substream,
 		goto error;
 	}
 
-	if (refine)
+	if (refine) {
 		err = snd_pcm_hw_refine(substream, data);
-	else
+		if (err < 0)
+			goto error;
+		err = fixup_unreferenced_params(substream, data);
+	} else {
 		err = snd_pcm_hw_params(substream, data);
+	}
 	if (err < 0)
 		goto error;
 	if (copy_to_user(data32, data, sizeof(*data32)) ||