tracing/probes: Fix to update dynamic data counter if fetcharg uses it

[ Upstream commit e38e2c6a9efc435f9de344b7c91f7697e01b47d5 ]

Fix to update dynamic data counter ('dyndata') and max length ('maxlen')
only if the fetcharg uses the dynamic data. Also get out arg->dynamic
from unlikely(). This makes dynamic data address wrong if
process_fetch_insn() returns error on !arg->dynamic case.

Link: https://lore.kernel.org/all/168908494781.123124.8160245359962103684.stgit@devnote2/

Suggested-by: Steven Rostedt <rostedt@goodmis.org>
Link: https://lore.kernel.org/all/20230710233400.5aaf024e@gandalf.local.home/
Fixes: 9178412ddf ("tracing: probeevent: Return consumed bytes of dynamic area")
Cc: stable@vger.kernel.org
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Reviewed-by: Steven Rostedt (Google) <rostedt@goodmis.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Masami Hiramatsu (Google)
2023-07-11 23:15:48 +09:00
committed by Greg Kroah-Hartman
parent 265a979ded
commit 3b76d92636

View File

@@ -206,7 +206,8 @@ store_trace_args(void *data, struct trace_probe *tp, void *rec,
if (unlikely(arg->dynamic)) if (unlikely(arg->dynamic))
*dl = make_data_loc(maxlen, dyndata - base); *dl = make_data_loc(maxlen, dyndata - base);
ret = process_fetch_insn(arg->code, rec, dl, base); ret = process_fetch_insn(arg->code, rec, dl, base);
if (unlikely(ret < 0 && arg->dynamic)) { if (arg->dynamic) {
if (unlikely(ret < 0)) {
*dl = make_data_loc(0, dyndata - base); *dl = make_data_loc(0, dyndata - base);
} else { } else {
dyndata += ret; dyndata += ret;
@@ -214,6 +215,7 @@ store_trace_args(void *data, struct trace_probe *tp, void *rec,
} }
} }
} }
}
static inline int static inline int
print_probe_args(struct trace_seq *s, struct probe_arg *args, int nr_args, print_probe_args(struct trace_seq *s, struct probe_arg *args, int nr_args,