Commit b0b9850e authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'probes-fixes-v6.5-rc3' of...

Merge tag 'probes-fixes-v6.5-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace

Pull probe fixes from Masami Hiramatsu:

 - probe-events: add NULL check for some BTF API calls which can return
   error code and NULL.

 - ftrace selftests: check fprobe and kprobe event correctly. This fixes
   a miss condition of the test command.

 - kprobes: do not allow probing functions that start with "__cfi_" or
   "__pfx_" since those are auto generated for kernel CFI and not
   executed.

* tag 'probes-fixes-v6.5-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace:
  kprobes: Prohibit probing on CFI preamble symbol
  selftests/ftrace: Fix to check fprobe event eneblement
  tracing/probes: Fix to add NULL check for BTF APIs
parents 98a05fe8 de02f2ac
Loading
Loading
Loading
Loading
+13 −1
Original line number Diff line number Diff line
@@ -1545,6 +1545,17 @@ static int check_ftrace_location(struct kprobe *p)
	return 0;
}

static bool is_cfi_preamble_symbol(unsigned long addr)
{
	char symbuf[KSYM_NAME_LEN];

	if (lookup_symbol_name(addr, symbuf))
		return false;

	return str_has_prefix("__cfi_", symbuf) ||
		str_has_prefix("__pfx_", symbuf);
}

static int check_kprobe_address_safe(struct kprobe *p,
				     struct module **probed_mod)
{
@@ -1563,7 +1574,8 @@ static int check_kprobe_address_safe(struct kprobe *p,
	    within_kprobe_blacklist((unsigned long) p->addr) ||
	    jump_label_text_reserved(p->addr, p->addr) ||
	    static_call_text_reserved(p->addr, p->addr) ||
	    find_bug((unsigned long)p->addr)) {
	    find_bug((unsigned long)p->addr) ||
	    is_cfi_preamble_symbol((unsigned long)p->addr)) {
		ret = -EINVAL;
		goto out;
	}
+4 −4
Original line number Diff line number Diff line
@@ -386,12 +386,12 @@ static const struct btf_type *find_btf_func_proto(const char *funcname)

	/* Get BTF_KIND_FUNC type */
	t = btf_type_by_id(btf, id);
	if (!btf_type_is_func(t))
	if (!t || !btf_type_is_func(t))
		return ERR_PTR(-ENOENT);

	/* The type of BTF_KIND_FUNC is BTF_KIND_FUNC_PROTO */
	t = btf_type_by_id(btf, t->type);
	if (!btf_type_is_func_proto(t))
	if (!t || !btf_type_is_func_proto(t))
		return ERR_PTR(-ENOENT);

	return t;
@@ -443,7 +443,7 @@ static int parse_btf_arg(const char *varname, struct fetch_insn *code,
	if (!ctx->params) {
		params = find_btf_func_param(ctx->funcname, &ctx->nr_params,
					     ctx->flags & TPARG_FL_TPOINT);
		if (IS_ERR(params)) {
		if (IS_ERR_OR_NULL(params)) {
			trace_probe_log_err(ctx->offset, NO_BTF_ENTRY);
			return PTR_ERR(params);
		}
@@ -1273,7 +1273,7 @@ const char **traceprobe_expand_meta_args(int argc, const char *argv[],

	params = find_btf_func_param(ctx->funcname, &nr_params,
				     ctx->flags & TPARG_FL_TPOINT);
	if (IS_ERR(params)) {
	if (IS_ERR_OR_NULL(params)) {
		if (args_idx != -1) {
			/* $arg* requires BTF info */
			trace_probe_log_err(0, NOSUP_BTFARG);
+1 −1
Original line number Diff line number Diff line
@@ -13,7 +13,7 @@ if grep -qF "f[:[<group>/][<event>]] <func-name>[%return] [<args>]" README ; the
  FPROBES=yes
fi

if [ -z "$KPROBES" -a "$FPROBES" ] ; then
if [ -z "$KPROBES" -a -z "$FPROBES" ] ; then
  exit_unsupported
fi