Commit c89c7e94 authored by Anssi Hannula's avatar Anssi Hannula Committed by Mark Brown

ASoC: fsl_spdif: Fix integer overflow when calculating divisors

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: default avatarAnssi Hannula <anssi.hannula@iki.fi>
Acked-by: default avatarNicolin Chen <Guangyu.Chen@freescale.com>
Signed-off-by: default avatarMark Brown <broonie@linaro.org>
parent e9b383dc
...@@ -1076,7 +1076,7 @@ static u32 fsl_spdif_txclk_caldiv(struct fsl_spdif_priv *spdif_priv, ...@@ -1076,7 +1076,7 @@ static u32 fsl_spdif_txclk_caldiv(struct fsl_spdif_priv *spdif_priv,
goto out; goto out;
} else if (arate / rate[index] == 1) { } else if (arate / rate[index] == 1) {
/* A little bigger than expect */ /* A little bigger than expect */
sub = (arate - rate[index]) * 100000; sub = (u64)(arate - rate[index]) * 100000;
do_div(sub, rate[index]); do_div(sub, rate[index]);
if (sub >= savesub) if (sub >= savesub)
continue; continue;
...@@ -1086,7 +1086,7 @@ static u32 fsl_spdif_txclk_caldiv(struct fsl_spdif_priv *spdif_priv, ...@@ -1086,7 +1086,7 @@ static u32 fsl_spdif_txclk_caldiv(struct fsl_spdif_priv *spdif_priv,
spdif_priv->txrate[index] = arate; spdif_priv->txrate[index] = arate;
} else if (rate[index] / arate == 1) { } else if (rate[index] / arate == 1) {
/* A little smaller than expect */ /* A little smaller than expect */
sub = (rate[index] - arate) * 100000; sub = (u64)(rate[index] - arate) * 100000;
do_div(sub, rate[index]); do_div(sub, rate[index]);
if (sub >= savesub) if (sub >= savesub)
continue; continue;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment