linux/drivers/staging
Damien Riégel 983cc2c7ef greybus: raw: fix use-after-free on cdev close
This addresses a use-after-free bug when a raw bundle is disconnected
but its chardev is still opened by an application. When the application
releases the cdev, it causes the following panic when init on free is
enabled (CONFIG_INIT_ON_FREE_DEFAULT_ON=y):

        refcount_t: underflow; use-after-free.
        WARNING: CPU: 0 PID: 139 at lib/refcount.c:28 refcount_warn_saturate+0xd0/0x130
         ...
        Call Trace:
         <TASK>
         cdev_put+0x18/0x30
         __fput+0x255/0x2a0
         __x64_sys_close+0x3d/0x80
         do_syscall_64+0xa4/0x290
         entry_SYSCALL_64_after_hwframe+0x77/0x7f

The cdev is contained in the "gb_raw" structure, which is freed in the
disconnect operation. When the cdev is released at a later time,
cdev_put gets an address that points to freed memory.

To fix this use-after-free, convert the struct device from a pointer to
being embedded, that makes the lifetime of the cdev and of this device
the same. Then, use cdev_device_add, which guarantees that the device
won't be released until all references to the cdev have been released.
Finally, delegate the freeing of the structure to the device release
function, instead of freeing immediately in the disconnect callback.

Fixes: e806c7fb8e ("greybus: raw: add raw greybus kernel driver")
Reviewed-by: Johan Hovold <johan@kernel.org>
Signed-off-by: Damien Riégel <damien.riegel@silabs.com>
Link: https://patch.msgid.link/20260324140039.40001-1-damien.riegel@silabs.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2026-03-31 10:33:48 +02:00
..
axis-fifo staging: axis-fifo: refactor device tree parsing 2026-02-23 15:45:31 +01:00
fbtft staging: fbtft: Update RA8875 Kconfig help description 2026-03-09 17:46:57 +01:00
greybus greybus: raw: fix use-after-free on cdev close 2026-03-31 10:33:48 +02:00
iio staging: iio: adt7316: modernize power management 2026-01-11 13:00:22 +00:00
media Convert remaining multi-line kmalloc_obj/flex GFP_KERNEL uses 2026-02-22 08:26:33 -08:00
most staging: most: fix typos in driver_usage.txt 2026-03-09 17:50:13 +01:00
nvec staging: nvec: fix block comment style in nvec_interrupt() 2026-02-24 10:11:42 -08:00
octeon staging: octeon: remove BUG() call 2026-03-18 16:48:40 +01:00
rtl8723bs staging: rtl8723bs: fix logical continuations in xmit_linux.c 2026-03-31 10:33:29 +02:00
sm750fb staging: sm750fb: fix division by zero in ps_to_hz() 2026-03-31 10:33:21 +02:00
vc04_services Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
vme_user staging: vme_user: remove unimplemented #if 0 code blocks 2026-03-09 17:28:47 +01:00
Kconfig staging: gpib: Destage gpib 2025-11-24 17:52:11 +01:00
Makefile staging: gpib: Destage gpib 2025-11-24 17:52:11 +01:00