Skip to content

Commit 9acd5bb

Browse files
deepanshu406gregkh
authored andcommitted
media: rtl2832: fix use-after-free in rtl2832_remove()
commit 680daf4 upstream. cancel_delayed_work_sync() is called before i2c_mux_del_adapters() in rtl2832_remove(). While the cancel waits for any running instance of i2c_gate_work to finish, it does not prevent the timer from being rescheduled by a concurrent thread. During probe, the r820t_attach() call attempts I2C transfers through the mux adapter. These transfers go through i2c_mux_master_xfer(), which calls rtl2832_deselect() after the transfer completes, rescheduling i2c_gate_work via schedule_delayed_work(). If this transfer is still in flight when rtl2832_remove() runs, rtl2832_deselect() can reschedule i2c_gate_work after it has been cancelled, causing a use-after-free when kfree(dev) is called. Fix this by calling i2c_mux_del_adapters() before cancel_delayed_work_sync(). Once the mux adapter is unregistered, no new I2C transfers can go through it, so rtl2832_deselect() can no longer reschedule i2c_gate_work. The subsequent cancel_delayed_work_sync() is then guaranteed to be final. Fixes: cddcc40 ("[media] rtl2832: convert to use an explicit i2c mux core") Cc: stable@vger.kernel.org Reported-by: syzbot+019ced393ab913002b75@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=019ced393ab913002b75 Signed-off-by: Deepanshu Kartikey <kartikey406@gmail.com> Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 4ca9c9f commit 9acd5bb

1 file changed

Lines changed: 2 additions & 2 deletions

File tree

drivers/media/dvb-frontends/rtl2832.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1115,10 +1115,10 @@ static void rtl2832_remove(struct i2c_client *client)
11151115

11161116
dev_dbg(&client->dev, "\n");
11171117

1118-
cancel_delayed_work_sync(&dev->i2c_gate_work);
1119-
11201118
i2c_mux_del_adapters(dev->muxc);
11211119

1120+
cancel_delayed_work_sync(&dev->i2c_gate_work);
1121+
11221122
regmap_exit(dev->regmap);
11231123

11241124
kfree(dev);

0 commit comments

Comments
 (0)