FAILED: patch "[PATCH] tracing/probes: Fix to record 0-length data_loc in" 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 797311bce5c2ac90b8d65e357603cfd410d36ebb
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2023072103-huff-flyable-0350@gregkh' --subject-prefix 'PATCH 6.1.y' HEAD^..
Possible dependencies:
797311bce5c2 ("tracing/probes: Fix to record 0-length data_loc in fetch_store_string*() if fails") 4ed8f337dee3 ("Revert "tracing: Add "(fault)" name injection to kernel probes"") e38e2c6a9efc ("tracing/probes: Fix to update dynamic data counter if fetcharg uses it") 00cf3d672a9d ("tracing: Allow synthetic events to pass around stacktraces")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 797311bce5c2ac90b8d65e357603cfd410d36ebb Mon Sep 17 00:00:00 2001
From: "Masami Hiramatsu (Google)" <[email protected]>
Date: Tue, 11 Jul 2023 23:16:07 +0900
Subject: [PATCH] tracing/probes: Fix to record 0-length data_loc in
fetch_store_string*() if fails
Fix to record 0-length data to data_loc in fetch_store_string*() if it fails to get the string data.
Currently those expect that the data_loc is updated by store_trace_args() if it returns the error code. However, that does not work correctly if the argument is an array of strings. In that case, store_trace_args() only clears the first entry of the array (which may have no error) and leaves other entries. So it should be cleared by fetch_store_string*() itself. Also, 'dyndata' and 'maxlen' in store_trace_args() should be updated only if it is used (ret > 0 and argument is a dynamic data.)
kernel/trace/trace_probe_kernel.h +9 -4
@@ -37,6 +37,13 @@ fetch_store_strlen(unsigned long addr)return (ret <0 ) ? ret : len; } +static nokprobe_inline void set_data_loc(int ret, void *dest, void *__dest, void *base) +{ +if (ret <0 ) + ret =0 ; + *(u32 *)dest =make_data_loc (ret, __dest - base); +} +/* * Fetch a null-terminated string from user. Caller MUST set *(u32 *)buf * with max length and relative data location.
@@ -55,8 +62,7 @@ fetch_store_string_user(unsigned long addr, void *dest, void *base) __dest =get_loc_data (dest, base); ret =strncpy_from_user_nofault (__dest, uaddr, maxlen); -if (ret >=0 ) - *(u32 *)dest =make_data_loc (ret, __dest - base); +set_data_loc (ret, dest, __dest, base);return ret; }
@@ -87,8 +93,7 @@ fetch_store_string(unsigned long addr, void *dest, void *base)* probing. */ ret =strncpy_from_kernel_nofault (__dest, (void *)addr, maxlen); -if (ret >=0 ) - *(u32 *)dest =make_data_loc (ret, __dest - base); +set_data_loc (ret, dest, __dest, base);return ret; }
kernel/trace/trace_probe_tmpl.h +3 -7
@@ -267,13 +267,9 @@ store_trace_args(void *data, struct trace_probe *tp, void *rec,if (unlikely (arg->dynamic)) *dl =make_data_loc (maxlen, dyndata - base); ret =process_fetch_insn (arg->code, rec, dl, base); -if (arg->dynamic) { -if (unlikely (ret <0 )) { - *dl =make_data_loc (0 , dyndata - base); - }else { - dyndata += ret; - maxlen -= ret; - } +if (arg->dynamic &&likely (ret >0 )) { + dyndata += ret; + maxlen -= ret; } } }
kernel/trace/trace_uprobe.c +2 -1
@@ -170,7 +170,8 @@ fetch_store_string(unsigned long addr, void *dest, void *base)*/ ret++; *(u32 *)dest =make_data_loc (ret, (void *)dst - base); - } + }else + *(u32 *)dest =make_data_loc (0 , (void *)dst - base);return ret; }