Skip to content

Commit 9010705

Browse files
Li Zetaogregkh
Li Zetao
authored andcommitted
media: ts2020: fix null-ptr-deref in ts2020_probe()
commit 4a058b3 upstream. KASAN reported a null-ptr-deref issue when executing the following command: # echo ts2020 0x20 > /sys/bus/i2c/devices/i2c-0/new_device KASAN: null-ptr-deref in range [0x0000000000000010-0x0000000000000017] CPU: 53 UID: 0 PID: 970 Comm: systemd-udevd Not tainted 6.12.0-rc2+ torvalds#24 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009) RIP: 0010:ts2020_probe+0xad/0xe10 [ts2020] RSP: 0018:ffffc9000abbf598 EFLAGS: 00010202 RAX: dffffc0000000000 RBX: 0000000000000000 RCX: ffffffffc0714809 RDX: 0000000000000002 RSI: ffff88811550be00 RDI: 0000000000000010 RBP: ffff888109868800 R08: 0000000000000001 R09: fffff52001577eb6 R10: 0000000000000000 R11: ffffc9000abbff50 R12: ffffffffc0714790 R13: 1ffff92001577eb8 R14: ffffffffc07190d0 R15: 0000000000000001 FS: 00007f95f13b98c0(0000) GS:ffff888149280000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000555d2634b000 CR3: 0000000152236000 CR4: 00000000000006f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: <TASK> ts2020_probe+0xad/0xe10 [ts2020] i2c_device_probe+0x421/0xb40 really_probe+0x266/0x850 ... The cause of the problem is that when using sysfs to dynamically register an i2c device, there is no platform data, but the probe process of ts2020 needs to use platform data, resulting in a null pointer being accessed. Solve this problem by adding checks to platform data. Fixes: dc245a5 ("[media] ts2020: implement I2C client bindings") Cc: <[email protected]> Signed-off-by: Li Zetao <[email protected]> Signed-off-by: Hans Verkuil <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent ff1c45c commit 9010705

File tree

1 file changed

+7
-1
lines changed

1 file changed

+7
-1
lines changed

drivers/media/dvb-frontends/ts2020.c

+7-1
Original file line numberDiff line numberDiff line change
@@ -553,13 +553,19 @@ static void ts2020_regmap_unlock(void *__dev)
553553
static int ts2020_probe(struct i2c_client *client)
554554
{
555555
struct ts2020_config *pdata = client->dev.platform_data;
556-
struct dvb_frontend *fe = pdata->fe;
556+
struct dvb_frontend *fe;
557557
struct ts2020_priv *dev;
558558
int ret;
559559
u8 u8tmp;
560560
unsigned int utmp;
561561
char *chip_str;
562562

563+
if (!pdata) {
564+
dev_err(&client->dev, "platform data is mandatory\n");
565+
return -EINVAL;
566+
}
567+
568+
fe = pdata->fe;
563569
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
564570
if (!dev) {
565571
ret = -ENOMEM;

0 commit comments

Comments
 (0)