mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-16 17:57:38 -04:00
Merge tag 'probes-fixes-v7.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace
Pull probes fixes from Masami Hiramatsu:
"fprobe fixes and spelling typos:
- Fix NULL pointer dereference in fprobe_fgraph_entry(). Prevent
general protection faults by checking shadow-stack reservation
bounds. Skip mid-flight registered fprobes that were not counted
during sizing.
eprobe: fix string pointer extraction
- Correct the casting of string pointers read from the ringbuffer to
prevent truncation of base event pointer variables when
dereferencing FILTER_PTR_STRING fields.
tracing/probes: clean up argument parsing and BTF helper logic
- Make the $ prefix mandatory for comm access: Require the $ prefix
for special fetcharg variables like $comm and $COMM, preventing
naming conflicts with regular BTF-based event fields.
- Fix double addition of offset for @+FOFFSET: Clear the temporary
offset variable after setting the FETCH_OP_FOFFS instruction to
avoid applying the offset multiple times.
- Remove WARN_ON_ONCE from parse_btf_arg: Prevent triggering a kernel
warning via user-space input when creating a kprobe event on a raw
address.
- Fix typo in a log message: Correct a spelling error ("$-valiable")
in trace probe log messages.
samples/trace_events: improve error checking
- Validate the thread pointer returned from kthread_run() in the
trace events sample code to properly handle thread creation
failures"
* tag 'probes-fixes-v7.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace:
tracing/probes: Make the $ prefix mandatory for comm access
tracing/fprobe: Fix NULL pointer dereference in fprobe_fgraph_entry()
tracing/probes: Fix double addition of offset for @+FOFFSET
tracing: eprobe: read the complete FILTER_PTR_STRING pointer
tracing/events: Fix to check the simple_tsk_fn creation
tracing/probes: Remove WARN_ON_ONCE from parse_btf_arg
tracing: probes: fix typo in a log message
This commit is contained in:
@@ -613,6 +613,16 @@ static int fprobe_fgraph_entry(struct ftrace_graph_ent *trace, struct fgraph_ops
|
||||
continue;
|
||||
|
||||
data_size = fp->entry_data_size;
|
||||
/*
|
||||
* The list may have grown since it was sized, so this node
|
||||
* may not fit. Skip it as missed rather than overrun the
|
||||
* reservation.
|
||||
*/
|
||||
if (fp->exit_handler &&
|
||||
used + FPROBE_HEADER_SIZE_IN_LONG + SIZE_IN_LONG(data_size) > reserved_words) {
|
||||
fp->nmissed++;
|
||||
continue;
|
||||
}
|
||||
if (data_size && fp->exit_handler)
|
||||
data = fgraph_data + used + FPROBE_HEADER_SIZE_IN_LONG;
|
||||
else
|
||||
|
||||
@@ -315,7 +315,7 @@ get_event_field(struct fetch_insn *code, void *rec)
|
||||
val = (unsigned long)addr;
|
||||
break;
|
||||
case FILTER_PTR_STRING:
|
||||
val = (unsigned long)(*(char *)addr);
|
||||
val = *(unsigned long *)addr;
|
||||
break;
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
|
||||
@@ -342,10 +342,6 @@ static int parse_trace_event(char *arg, struct fetch_insn *code,
|
||||
ret = parse_trace_event_arg(arg, code, ctx);
|
||||
if (!ret)
|
||||
return 0;
|
||||
if (strcmp(arg, "comm") == 0 || strcmp(arg, "COMM") == 0) {
|
||||
code->op = FETCH_OP_COMM;
|
||||
return 0;
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -678,7 +674,7 @@ static int parse_btf_arg(char *varname,
|
||||
int i, is_ptr, ret;
|
||||
u32 tid;
|
||||
|
||||
if (WARN_ON_ONCE(!ctx->funcname && !(ctx->flags & TPARG_FL_TEVENT)))
|
||||
if (!ctx->funcname && !(ctx->flags & TPARG_FL_TEVENT))
|
||||
return -EINVAL;
|
||||
|
||||
is_ptr = split_next_field(varname, &field, ctx);
|
||||
@@ -1068,8 +1064,14 @@ static int parse_probe_vars(char *orig_arg, const struct fetch_type *t,
|
||||
int len;
|
||||
|
||||
if (ctx->flags & TPARG_FL_TEVENT) {
|
||||
if (parse_trace_event(arg, code, ctx) < 0)
|
||||
if (parse_trace_event(arg, code, ctx) < 0) {
|
||||
/* 'comm' should be checked after field parsing. */
|
||||
if (strcmp(arg, "comm") == 0 || strcmp(arg, "COMM") == 0) {
|
||||
code->op = FETCH_OP_COMM;
|
||||
return 0;
|
||||
}
|
||||
goto inval;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1241,6 +1243,7 @@ parse_probe_arg(char *arg, const struct fetch_type *type,
|
||||
|
||||
code->op = FETCH_OP_FOFFS;
|
||||
code->immediate = (unsigned long)offset; // imm64?
|
||||
offset = 0;
|
||||
} else {
|
||||
/* uprobes don't support symbols */
|
||||
if (!(ctx->flags & TPARG_FL_KERNEL)) {
|
||||
|
||||
@@ -511,7 +511,7 @@ extern int traceprobe_define_arg_fields(struct trace_event_call *event_call,
|
||||
C(NO_RETVAL, "This function returns 'void' type"), \
|
||||
C(BAD_STACK_NUM, "Invalid stack number"), \
|
||||
C(BAD_ARG_NUM, "Invalid argument number"), \
|
||||
C(BAD_VAR, "Invalid $-valiable specified"), \
|
||||
C(BAD_VAR, "Invalid $-variable specified"), \
|
||||
C(BAD_REG_NAME, "Invalid register name"), \
|
||||
C(BAD_MEM_ADDR, "Invalid memory address"), \
|
||||
C(BAD_IMM, "Invalid immediate value"), \
|
||||
|
||||
@@ -107,6 +107,10 @@ int foo_bar_reg(void)
|
||||
* for consistency sake, we still take the thread_mutex.
|
||||
*/
|
||||
simple_tsk_fn = kthread_run(simple_thread_fn, NULL, "event-sample-fn");
|
||||
if (IS_ERR_OR_NULL(simple_tsk_fn)) {
|
||||
pr_err("Failed to create simple_thread_fn\n");
|
||||
simple_tsk_fn = NULL;
|
||||
}
|
||||
out:
|
||||
mutex_unlock(&thread_mutex);
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user