FAILED: patch "[PATCH] ksmbd: fix race condition from parallel smb2 lock requests" failed to apply to 6.1-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.1-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.1.y
git checkout FETCH_HEAD
git cherry-pick -x 75ac9a3dd65f7eab4d12b0a0f744234b5300a491
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2023100807-alright-overeager-19bc@gregkh' --subject-prefix 'PATCH 6.1.y' HEAD^..
Possible dependencies:
75ac9a3dd65f ("ksmbd: fix race condition from parallel smb2 lock requests") 38c8a9a52082 ("smb: move client and server files to common directory fs/smb") 3a9b557f44ea ("ksmbd: delete asynchronous work from list") d3ca9f7aeba7 ("ksmbd: fix possible memory leak in smb2_lock()") f8d6e7442aa7 ("ksmbd: fix typo, syncronous->synchronous") abdb1742a312 ("cifs: get rid of mount options string parsing") 9fd29a5bae6e ("cifs: use fs_context for automounts")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 75ac9a3dd65f7eab4d12b0a0f744234b5300a491 Mon Sep 17 00:00:00 2001
From: Namjae Jeon <[email protected]>
Date: Wed, 4 Oct 2023 18:31:03 +0900
Subject: [PATCH] ksmbd: fix race condition from parallel smb2 lock requests
There is a race condition issue between parallel smb2 lock request.
Time
+
Thread A | Thread A
smb2_lock | smb2_lock
|
insert smb_lock to lock_list |
spin_unlock(&work->conn->llist_lock) |
|
| spin_lock(&conn->llist_lock);
| kfree(cmp_lock);
|
// UAF! |
list_add(&smb_lock->llist, &rollback_list) +This patch swaps the line for adding the smb lock to the rollback list and adding the lock list of connection to fix the race issue.
fs/smb/server/smb2pdu.c +1 -11
@@ -7038,10 +7038,6 @@ int smb2_lock(struct ksmbd_work *work)ksmbd_debug (SMB ,"would have to wait for getting lock\n" ); -spin_lock (&work->conn->llist_lock); -list_add_tail (&smb_lock->clist, - &work->conn->lock_list); -spin_unlock (&work->conn->llist_lock);list_add (&smb_lock->llist, &rollback_list); argv =kmalloc (sizeof (void *),GFP_KERNEL );
@@ -7072,9 +7068,6 @@ int smb2_lock(struct ksmbd_work *work)if (work->state !=KSMBD_WORK_ACTIVE ) {list_del (&smb_lock->llist); -spin_lock (&work->conn->llist_lock); -list_del (&smb_lock->clist); -spin_unlock (&work->conn->llist_lock);locks_free_lock (flock);if (work->state ==KSMBD_WORK_CANCELLED ) {
@@ -7094,19 +7087,16 @@ int smb2_lock(struct ksmbd_work *work) }list_del (&smb_lock->llist); -spin_lock (&work->conn->llist_lock); -list_del (&smb_lock->clist); -spin_unlock (&work->conn->llist_lock);release_async_work (work); goto retry; }else if (!rc) { +list_add (&smb_lock->llist, &rollback_list);spin_lock (&work->conn->llist_lock);list_add_tail (&smb_lock->clist, &work->conn->lock_list);list_add_tail (&smb_lock->flist, &fp->lock_list);spin_unlock (&work->conn->llist_lock); -list_add (&smb_lock->llist, &rollback_list);ksmbd_debug (SMB ,"successful in taking lock\n" ); }else { goto out;