| From 40de29a632fcf7eefb8ac31ee5bf9e9e31602a79 Mon Sep 17 00:00:00 2001 |
| From: Kangjie Lu <kjlu@umn.edu> |
| Date: Thu, 20 Dec 2018 23:54:03 -0500 |
| Subject: media: si2165: fix a missing check of return value |
| |
| [ Upstream commit 0ab34a08812a3334350dbaf69a018ee0ab3d2ddd ] |
| |
| si2165_readreg8() may fail. Looking into si2165_readreg8(), we will find |
| that "val_tmp" will be an uninitialized value when regmap_read() fails. |
| "val_tmp" is then assigned to "val". So if si2165_readreg8() fails, |
| "val" will be a random value. Further use will lead to undefined |
| behaviors. The fix checks if si2165_readreg8() fails, and if so, returns |
| its error code upstream. |
| |
| Signed-off-by: Kangjie Lu <kjlu@umn.edu> |
| Reviewed-by: Matthias Schwarzott <zzam@gentoo.org> |
| Tested-by: Matthias Schwarzott <zzam@gentoo.org> |
| Signed-off-by: Sean Young <sean@mess.org> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/media/dvb-frontends/si2165.c | 8 +++++--- |
| 1 file changed, 5 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/media/dvb-frontends/si2165.c b/drivers/media/dvb-frontends/si2165.c |
| index feacd8da421da..d55d8f169dca6 100644 |
| --- a/drivers/media/dvb-frontends/si2165.c |
| +++ b/drivers/media/dvb-frontends/si2165.c |
| @@ -275,18 +275,20 @@ static u32 si2165_get_fe_clk(struct si2165_state *state) |
| |
| static int si2165_wait_init_done(struct si2165_state *state) |
| { |
| - int ret = -EINVAL; |
| + int ret; |
| u8 val = 0; |
| int i; |
| |
| for (i = 0; i < 3; ++i) { |
| - si2165_readreg8(state, REG_INIT_DONE, &val); |
| + ret = si2165_readreg8(state, REG_INIT_DONE, &val); |
| + if (ret < 0) |
| + return ret; |
| if (val == 0x01) |
| return 0; |
| usleep_range(1000, 50000); |
| } |
| dev_err(&state->client->dev, "init_done was not set\n"); |
| - return ret; |
| + return -EINVAL; |
| } |
| |
| static int si2165_upload_firmware_block(struct si2165_state *state, |
| -- |
| 2.20.1 |
| |