Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b66a1def authored by Masami Hiramatsu (Google)'s avatar Masami Hiramatsu (Google) Committed by Greg Kroah-Hartman
Browse files

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: default avatarSteven Rostedt <rostedt@goodmis.org>
Link: https://lore.kernel.org/all/20230710233400.5aaf024e@gandalf.local.home/


Fixes: 9178412d ("tracing: probeevent: Return consumed bytes of dynamic area")
Cc: stable@vger.kernel.org
Signed-off-by: default avatarMasami Hiramatsu (Google) <mhiramat@kernel.org>
Reviewed-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent bdc309d8
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -206,7 +206,8 @@ 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 (unlikely(ret < 0 && arg->dynamic)) {
		if (arg->dynamic) {
			if (unlikely(ret < 0)) {
				*dl = make_data_loc(0, dyndata - base);
			} else {
				dyndata += ret;
@@ -214,6 +215,7 @@ store_trace_args(void *data, struct trace_probe *tp, void *rec,
			}
		}
	}
}

static inline int
print_probe_args(struct trace_seq *s, struct probe_arg *args, int nr_args,