FAILED: patch "[PATCH] smb: client: fix early procfs exposure race" failed to apply to 6.18-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.18-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.18.y
git checkout FETCH_HEAD
git cherry-pick -x 7b1afb631395c958993cda4631002258ef4151ea
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026110226-gigantic-arson-32db@gregkh' --subject-prefix 'PATCH 6.18.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 7b1afb631395c958993cda4631002258ef4151ea Mon Sep 17 00:00:00 2001
From: Fredric Cover <[email protected]>
Date: Thu, 22 Oct 2026 21:55:06 +0000
Subject: [PATCH] smb: client: fix early procfs exposure race
Currently, init_cifs() calls cifs_proc_init() near the beginning of the function, before INIT_LIST_HEAD, leading to a momentarily uninitialized, but exposed, procfs. If a userspace process reads this empty procfs, iterating over a zeroed list_head leads to a NULL pointer dereference and a kernel oops/panic.
For example, if a delay is added between cifs_proc_init() and INIT_LIST_HEAD, and a userspace process is polling /proc/fs/cifs/DebugData, the following oops occurs:
BUG: kernel NULL pointer dereference, address: 0000000000000608 Oops: Oops: 0000 [#1] SMP PTI CPU: 0 UID: 0 PID: 3477 Comm: cat Not tainted 7.3.0-02212-g4df4d2a577db-dirty #6 PREEMPT(lazy) RIP: 0010:cifs_debug_data_proc_show+0x103/0xd80 [cifs] Call Trace: <TASK> ? seq_read_iter+0x86/0x400 ? seq_read_iter+0x86/0x400 seq_read_iter+0x183/0x400 proc_reg_read_iter+0x62/0x90 copy_splice_read+0x215/0x310 splice_file_to_pipe+0xec/0x1c0 do_splice+0x4b8/0x780 __se_sys_splice+0x18f/0x250 do_syscall_64+0x109/0x330 entry_SYSCALL_64_after_hwframe+0x77/0x7f </TASK>
Fix this by moving cifs_proc_init() down in init_cifs(), ensuring it runs only after all internal lists, locks, counters, and workqueues are fully ready, but before registering the filesystem. Update the error cleanup ladder and exit_cifs() to maintain proper LIFO order.
fs/smb/client/cifsfs.c +9 -11
@@ -2019,7 +2019,6 @@ init_cifs(void)if (rc)return rc; -cifs_proc_init ();INIT_LIST_HEAD (&cifs_tcp_ses_list);/* * Initialize Global counters
@@ -2068,10 +2067,8 @@ init_cifs(void) cifsiod_wq =alloc_workqueue ("cifsiod" ,WQ_FREEZABLE |WQ_MEM_RECLAIM |WQ_PERCPU ,0 ); -if (!cifsiod_wq) { - rc = -ENOMEM ; - goto out_clean_proc; - } +if (!cifsiod_wq) +return -ENOMEM ;/* * Consider in future setting limit!=0 maybe to min(num_of_cores - 1, 3)
@@ -2162,19 +2159,22 @@ init_cifs(void)if (rc) goto out_cifs_swn_init; +cifs_proc_init (); + rc =register_filesystem (&cifs_fs_type);if (rc) - goto out_init_cifs_idmap; + goto out_clean_proc; rc =register_filesystem (&smb3_fs_type);if (rc) {unregister_filesystem (&cifs_fs_type); - goto out_init_cifs_idmap; + goto out_clean_proc; }return 0 ; -out_init_cifs_idmap: +out_clean_proc: +cifs_proc_clean ();exit_cifs_idmap (); out_cifs_swn_init: #ifdef CONFIG_CIFS_SWN_UPCALL
@@ -2210,8 +2210,6 @@ init_cifs(void)destroy_workqueue (decrypt_wq); out_destroy_cifsiod_wq:destroy_workqueue (cifsiod_wq); -out_clean_proc: -cifs_proc_clean ();return rc; }
@@ -2221,6 +2219,7 @@ exit_cifs(void)cifs_dbg (NOISY ,"exit_smb3\n" );unregister_filesystem (&cifs_fs_type);unregister_filesystem (&smb3_fs_type); +cifs_proc_clean ();cifs_release_automount_timer ();exit_cifs_idmap ();#ifdef CONFIG_CIFS_SWN_UPCALL
@@ -2243,7 +2242,6 @@ exit_cifs(void)destroy_workqueue (serverclose_wq);destroy_workqueue (cfid_put_wq);destroy_workqueue (cifsiod_wq); -cifs_proc_clean (); }MODULE_AUTHOR ("Steve French" );
Sasha Levin
maintainerPATCH 1/1 smb: client: fix early procfs exposure race
From: Fredric Cover <[email protected]>
[ Upstream commit 7b1afb631395c958993cda4631002258ef4151ea ]
Currently, init_cifs() calls cifs_proc_init() near the beginning of the function, before INIT_LIST_HEAD, leading to a momentarily uninitialized, but exposed, procfs. If a userspace process reads this empty procfs, iterating over a zeroed list_head leads to a NULL pointer dereference and a kernel oops/panic.
For example, if a delay is added between cifs_proc_init() and INIT_LIST_HEAD, and a userspace process is polling /proc/fs/cifs/DebugData, the following oops occurs:
BUG: kernel NULL pointer dereference, address: 0000000000000608 Oops: Oops: 0000 [#1] SMP PTI CPU: 0 UID: 0 PID: 3477 Comm: cat Not tainted 7.3.0-02212-g4df4d2a577db-dirty #6 PREEMPT(lazy) RIP: 0010:cifs_debug_data_proc_show+0x103/0xd80 [cifs] Call Trace: <TASK> ? seq_read_iter+0x86/0x400 ? seq_read_iter+0x86/0x400 seq_read_iter+0x183/0x400 proc_reg_read_iter+0x62/0x90 copy_splice_read+0x215/0x310 splice_file_to_pipe+0xec/0x1c0 do_splice+0x4b8/0x780 __se_sys_splice+0x18f/0x250 do_syscall_64+0x109/0x330 entry_SYSCALL_64_after_hwframe+0x77/0x7f </TASK>
Fix this by moving cifs_proc_init() down in init_cifs(), ensuring it runs only after all internal lists, locks, counters, and workqueues are fully ready, but before registering the filesystem. Update the error cleanup ladder and exit_cifs() to maintain proper LIFO order.
--- fs/smb/client/cifsfs.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-)
fs/smb/client/cifsfs.c +9 -11
@@ -1972,7 +1972,6 @@ static int __initinit_cifs (void) {int rc =0 ; -cifs_proc_init ();INIT_LIST_HEAD (&cifs_tcp_ses_list);/* * Initialize Global counters
@@ -2021,10 +2020,8 @@ init_cifs(void) cifsiod_wq =alloc_workqueue ("cifsiod" ,WQ_FREEZABLE |WQ_MEM_RECLAIM |WQ_PERCPU ,0 ); -if (!cifsiod_wq) { - rc = -ENOMEM ; - goto out_clean_proc; - } +if (!cifsiod_wq) +return -ENOMEM ;/* * Consider in future setting limit!=0 maybe to min(num_of_cores - 1, 3)
@@ -2115,19 +2112,22 @@ init_cifs(void)if (rc) goto out_cifs_swn_init; +cifs_proc_init (); + rc =register_filesystem (&cifs_fs_type);if (rc) - goto out_init_cifs_idmap; + goto out_clean_proc; rc =register_filesystem (&smb3_fs_type);if (rc) {unregister_filesystem (&cifs_fs_type); - goto out_init_cifs_idmap; + goto out_clean_proc; }return 0 ; -out_init_cifs_idmap: +out_clean_proc: +cifs_proc_clean ();exit_cifs_idmap (); out_cifs_swn_init: #ifdef CONFIG_CIFS_SWN_UPCALL
@@ -2163,8 +2163,6 @@ init_cifs(void)destroy_workqueue (decrypt_wq); out_destroy_cifsiod_wq:destroy_workqueue (cifsiod_wq); -out_clean_proc: -cifs_proc_clean ();return rc; }
@@ -2174,6 +2172,7 @@ exit_cifs(void)cifs_dbg (NOISY ,"exit_smb3\n" );unregister_filesystem (&cifs_fs_type);unregister_filesystem (&smb3_fs_type); +cifs_proc_clean ();cifs_release_automount_timer ();exit_cifs_idmap ();#ifdef CONFIG_CIFS_SWN_UPCALL
@@ -2196,7 +2195,6 @@ exit_cifs(void)destroy_workqueue (serverclose_wq);destroy_workqueue (cfid_put_wq);destroy_workqueue (cifsiod_wq); -cifs_proc_clean (); }MODULE_AUTHOR ("Steve French" );
Signature · 1 line
2.53.0