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:

committed by
Greg Kroah-Hartman

parent
265a979ded
commit
3b76d92636
@@ -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,
|
||||||
|
Reference in New Issue
Block a user