summaryrefslogtreecommitdiff
path: root/include/linux
diff options
context:
space:
mode:
authorAlberto Ruiz <aruiz@redhat.com>2026-04-08 18:23:40 +0300
committerMiklos Szeredi <mszeredi@redhat.com>2026-06-15 15:06:15 +0300
commit9fa4f7a53406430ee9982f2f636a15b338185122 (patch)
tree2afd35e656a20a2915b32d478776fcfc274535b3 /include/linux
parent6e1b235627bb1172d27c1b2ea7bf53e67dbced8d (diff)
downloadlinux-9fa4f7a53406430ee9982f2f636a15b338185122.tar.xz
fuse: fix device node leak in cuse_process_init_reply()
If device_add() succeeds during CUSE initialization but a subsequent step (cdev_alloc() or cdev_add()) fails, the error path calls put_device() without first calling device_del(). This leaks the devtmpfs entry created by device_add(), leaving a stale /dev/<name> node that persists until reboot. Since the cuse_conn is never linked into cuse_conntbl on the failure path, cuse_channel_release() sees cc->dev == NULL and skips device_unregister(), so no other code path cleans up the node. This has several consequences: - The device name is permanently poisoned: any subsequent attempt to create a CUSE device with the same name hits the stale sysfs entry, device_add() fails, and the new device is aborted. - The collision manifests as ENODEV returned to userspace with no dmesg diagnostic, making it very difficult to debug. - The failure is self-perpetuating: once a name is leaked, all future attempts with that name fail identically. Fix this by introducing an err_dev label that calls device_del() to undo device_add() before falling through to err_unlock. The existing err_unlock path from a device_add() failure correctly skips device_del() since the device was never added. Testing instructions can be found at the lore link below. Link: https://lore.kernel.org/all/20260408-wip-cuse-leak-fix-v1-0-1c028d575e97@redhat.com/ Signed-off-by: Alberto Ruiz <aruiz@redhat.com> Fixes: 151060ac1314 ("CUSE: implement CUSE - Character device in Userspace") Cc: stable@vger.kernel.org Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Diffstat (limited to 'include/linux')
0 files changed, 0 insertions, 0 deletions