| From 1bc14f35dd2ddd636f2fb458f20787595c641df3 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 29 Apr 2024 16:05:04 +0100 |
| Subject: media: dvb-frontends: tda10048: Fix integer overflow |
| |
| From: Ricardo Ribalda <ribalda@chromium.org> |
| |
| [ Upstream commit 1aa1329a67cc214c3b7bd2a14d1301a795760b07 ] |
| |
| state->xtal_hz can be up to 16M, so it can overflow a 32 bit integer |
| when multiplied by pll_mfactor. |
| |
| Create a new 64 bit variable to hold the calculations. |
| |
| Link: https://lore.kernel.org/linux-media/20240429-fix-cocci-v3-25-3c4865f5a4b0@chromium.org |
| Reported-by: Dan Carpenter <dan.carpenter@linaro.org> |
| Signed-off-by: Ricardo Ribalda <ribalda@chromium.org> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/media/dvb-frontends/tda10048.c | 9 ++++++--- |
| 1 file changed, 6 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/media/dvb-frontends/tda10048.c b/drivers/media/dvb-frontends/tda10048.c |
| index f1d5e77d5dcce..db829754f1359 100644 |
| --- a/drivers/media/dvb-frontends/tda10048.c |
| +++ b/drivers/media/dvb-frontends/tda10048.c |
| @@ -410,6 +410,7 @@ static int tda10048_set_if(struct dvb_frontend *fe, u32 bw) |
| struct tda10048_config *config = &state->config; |
| int i; |
| u32 if_freq_khz; |
| + u64 sample_freq; |
| |
| dprintk(1, "%s(bw = %d)\n", __func__, bw); |
| |
| @@ -451,9 +452,11 @@ static int tda10048_set_if(struct dvb_frontend *fe, u32 bw) |
| dprintk(1, "- pll_pfactor = %d\n", state->pll_pfactor); |
| |
| /* Calculate the sample frequency */ |
| - state->sample_freq = state->xtal_hz * (state->pll_mfactor + 45); |
| - state->sample_freq /= (state->pll_nfactor + 1); |
| - state->sample_freq /= (state->pll_pfactor + 4); |
| + sample_freq = state->xtal_hz; |
| + sample_freq *= state->pll_mfactor + 45; |
| + do_div(sample_freq, state->pll_nfactor + 1); |
| + do_div(sample_freq, state->pll_pfactor + 4); |
| + state->sample_freq = sample_freq; |
| dprintk(1, "- sample_freq = %d\n", state->sample_freq); |
| |
| /* Update the I/F */ |
| -- |
| 2.43.0 |
| |