[alsa-devel] [PATCH] ASoC: fsl_spdif: Fix integer overflow when calculating divisors

Nicolin Chen Guangyu.Chen at freescale.com
Mon Jun 9 19:26:32 CEST 2014


On Mon, Jun 09, 2014 at 07:16:43PM +0300, Anssi Hannula wrote:
> The calculation code does
> u64 = (u32 - u32) * 100000;
> 
> The 64 bits are of no help here as the type is casted only after the
> multiplication, and therefore the result may overflow, possibly causing
> inoptimal or wrong clock setup in an unfortunate case (the maximum
> result value of the first substraction is currently 47999).
> 
> Fix the code to cast before multiplication.
> 
> Signed-off-by: Anssi Hannula <anssi.hannula at iki.fi>
> Cc: Nicolin Chen <Guangyu.Chen at freescale.com>

Acked-by: Nicolin Chen <Guangyu.Chen at freescale.com>

Thank you so much :)
Nicolin

> ---
>  sound/soc/fsl/fsl_spdif.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/sound/soc/fsl/fsl_spdif.c b/sound/soc/fsl/fsl_spdif.c
> index b912d45a2a4c..0bd9136279a2 100644
> --- a/sound/soc/fsl/fsl_spdif.c
> +++ b/sound/soc/fsl/fsl_spdif.c
> @@ -1076,7 +1076,7 @@ static u32 fsl_spdif_txclk_caldiv(struct fsl_spdif_priv *spdif_priv,
>  				goto out;
>  			} else if (arate / rate[index] == 1) {
>  				/* A little bigger than expect */
> -				sub = (arate - rate[index]) * 100000;
> +				sub = (u64)(arate - rate[index]) * 100000;
>  				do_div(sub, rate[index]);
>  				if (sub >= savesub)
>  					continue;
> @@ -1086,7 +1086,7 @@ static u32 fsl_spdif_txclk_caldiv(struct fsl_spdif_priv *spdif_priv,
>  				spdif_priv->txrate[index] = arate;
>  			} else if (rate[index] / arate == 1) {
>  				/* A little smaller than expect */
> -				sub = (rate[index] - arate) * 100000;
> +				sub = (u64)(rate[index] - arate) * 100000;
>  				do_div(sub, rate[index]);
>  				if (sub >= savesub)
>  					continue;
> -- 
> 1.8.4.5
> 



More information about the Alsa-devel mailing list