FAILED: patch "[PATCH] fs: dlm: fix possible use after free if tracing" failed to apply to 6.0-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.0-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]>.
Possible dependencies:
3b7610302a75 ("fs: dlm: fix possible use after free if tracing") 7a3de7324c2b ("fs: dlm: trace user space callbacks")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 3b7610302a75fc1032a6c9462862bec6948f85c9 Mon Sep 17 00:00:00 2001
From: Alexander Aring <[email protected]>
Date: Thu, 1 Sep 2022 12:05:32 -0400
Subject: [PATCH] fs: dlm: fix possible use after free if tracing
This patch fixes a possible use after free if tracing for the specific event is enabled. To avoid the use after free we introduce a out_put label like all other user lock specific requests and safe in a boolean to do a put or not which depends on the execution path of dlm_user_request().
fs/dlm/lock.c +8 -7
@@ -5835,6 +5835,7 @@ int dlm_user_request(struct dlm_ls *ls, struct dlm_user_args *ua, {struct dlm_lkb *lkb;struct dlm_args args; +bool do_put = true;int error;dlm_lock_recovery (ls);
@@ -5851,9 +5852,8 @@ int dlm_user_request(struct dlm_ls *ls, struct dlm_user_args *ua, ua->lksb.sb_lvbptr =kzalloc (DLM_USER_LVB_LEN ,GFP_NOFS );if (!ua->lksb.sb_lvbptr) {kfree (ua); -__put_lkb (ls, lkb); error = -ENOMEM ; - goto out_trace_end; + goto out_put; } }#ifdef CONFIG_DLM_DEPRECATED_API
@@ -5867,8 +5867,7 @@ int dlm_user_request(struct dlm_ls *ls, struct dlm_user_args *ua,kfree (ua->lksb.sb_lvbptr); ua->lksb.sb_lvbptr =NULL ;kfree (ua); -__put_lkb (ls, lkb); - goto out_trace_end; + goto out_put; }/* After ua is attached to lkb it will be freed by dlm_free_lkb().
@@ -5887,8 +5886,7 @@ int dlm_user_request(struct dlm_ls *ls, struct dlm_user_args *ua, error =0 ; fallthrough;default : -__put_lkb (ls, lkb); - goto out_trace_end; + goto out_put; }/* add this new lkb to the per-process list of locks */
@@ -5896,8 +5894,11 @@ int dlm_user_request(struct dlm_ls *ls, struct dlm_user_args *ua,hold_lkb (lkb);list_add_tail (&lkb->lkb_ownqueue, &ua->proc->locks);spin_unlock (&ua->proc->locks_spin); - out_trace_end: + do_put = false; + out_put:trace_dlm_lock_end (ls, lkb, name, namelen, mode, flags, error, false); +if (do_put) +__put_lkb (ls, lkb); out:dlm_unlock_recovery (ls);return error;