tracing/probes: Fix to update dynamic data counter if fetcharg uses it
commite38e2c6a9e
upstream. 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: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Родитель
8277bcacf1
Коммит
25d63eb730
|
@ -206,11 +206,13 @@ 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)) {
|
||||
*dl = make_data_loc(0, dyndata - base);
|
||||
} else {
|
||||
dyndata += ret;
|
||||
maxlen -= ret;
|
||||
if (arg->dynamic) {
|
||||
if (unlikely(ret < 0)) {
|
||||
*dl = make_data_loc(0, dyndata - base);
|
||||
} else {
|
||||
dyndata += ret;
|
||||
maxlen -= ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче