media: edia: dvbdev: fix a use-after-free
authorZhipeng Lu <alexious@zju.edu.cn>
Sat, 3 Feb 2024 13:40:43 +0000 (14:40 +0100)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Wed, 7 Feb 2024 05:06:03 +0000 (06:06 +0100)
commit8c64f4cdf4e6cc5682c52523713af8c39c94e6d5
treec067c77f834eaf4601af4ef0d1e19fe6073218ca
parent9651d3d2d691960e64f4c906081d75ae07eb47df
media: edia: dvbdev: fix a use-after-free

In dvb_register_device, *pdvbdev is set equal to dvbdev, which is freed
in several error-handling paths. However, *pdvbdev is not set to NULL
after dvbdev's deallocation, causing use-after-frees in many places,
for example, in the following call chain:

budget_register
  |-> dvb_dmxdev_init
        |-> dvb_register_device
  |-> dvb_dmxdev_release
        |-> dvb_unregister_device
              |-> dvb_remove_device
                    |-> dvb_device_put
                          |-> kref_put

When calling dvb_unregister_device, dmxdev->dvbdev (i.e. *pdvbdev in
dvb_register_device) could point to memory that had been freed in
dvb_register_device. Thereafter, this pointer is transferred to
kref_put and triggering a use-after-free.

Link: https://lore.kernel.org/linux-media/20240203134046.3120099-1-alexious@zju.edu.cn
Fixes: b61901024776 ("V4L/DVB (5244): Dvbdev: fix illegal re-usage of fileoperations struct")
Signed-off-by: Zhipeng Lu <alexious@zju.edu.cn>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/dvb-core/dvbdev.c