Probe fixes for 6.5-rc3:

- probe-events: Fix to add NULL check for some BTF API calls which can
   return error code and NULL.
 
 - ftrace selftests: Fix to check fprobe and kprobe event correctly. This
   fixes a miss condition of the test command.
 
 - kprobes: Prohibit probing on the function which starts from "__cfi_"
   and "__pfx_" since those are auto generated for kernel CFI and not
   executed.
 -----BEGIN PGP SIGNATURE-----
 
 iQFPBAABCgA5FiEEh7BulGwFlgAOi5DV2/sHvwUrPxsFAmTGdH4bHG1hc2FtaS5o
 aXJhbWF0c3VAZ21haWwuY29tAAoJENv7B78FKz8bmMAH/0qTHII0KYQDvrNJ40tT
 SDM8+4zOJEtnjVYq87+4EWBhpVEL3VbLRJaprjXh40lZJrCP3MglCF152p4bOhgb
 ZrjWuTAgE0N+rBhdeUJlzy3iLzl0G9dzfA+sn1XMcW+/HSPstJcjAG6wD7ROeZzL
 XCxzE+NY6Y6mYbB52DaS8Hv7g7WccaTV+KeRjokhMPt+u7/KItJ4hQb/RXtAL31S
 n4thCeVllaPBuc7m2CmKwJ9jzOg7/0qpAIUGx1Z+Khy/3YfRhG1nT93GxP8hLmad
 SH9kGps09WXF5f8FbjYglOmq7ioDbIUz3oXPQRZYPymV8A0EU+b+/8IsRog1ySd1
 BVk=
 =qKWS
 -----END PGP SIGNATURE-----

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
This commit is contained in:
Linus Torvalds 2023-07-30 11:27:22 -07:00
commit b0b9850e7d
3 changed files with 18 additions and 6 deletions

View file

@ -1545,6 +1545,17 @@ static int check_ftrace_location(struct kprobe *p)
return 0; 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, static int check_kprobe_address_safe(struct kprobe *p,
struct module **probed_mod) struct module **probed_mod)
{ {
@ -1563,7 +1574,8 @@ static int check_kprobe_address_safe(struct kprobe *p,
within_kprobe_blacklist((unsigned long) p->addr) || within_kprobe_blacklist((unsigned long) p->addr) ||
jump_label_text_reserved(p->addr, p->addr) || jump_label_text_reserved(p->addr, p->addr) ||
static_call_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; ret = -EINVAL;
goto out; goto out;
} }

View file

@ -386,12 +386,12 @@ static const struct btf_type *find_btf_func_proto(const char *funcname)
/* Get BTF_KIND_FUNC type */ /* Get BTF_KIND_FUNC type */
t = btf_type_by_id(btf, id); t = btf_type_by_id(btf, id);
if (!btf_type_is_func(t)) if (!t || !btf_type_is_func(t))
return ERR_PTR(-ENOENT); return ERR_PTR(-ENOENT);
/* The type of BTF_KIND_FUNC is BTF_KIND_FUNC_PROTO */ /* The type of BTF_KIND_FUNC is BTF_KIND_FUNC_PROTO */
t = btf_type_by_id(btf, t->type); 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 ERR_PTR(-ENOENT);
return t; return t;
@ -443,7 +443,7 @@ static int parse_btf_arg(const char *varname, struct fetch_insn *code,
if (!ctx->params) { if (!ctx->params) {
params = find_btf_func_param(ctx->funcname, &ctx->nr_params, params = find_btf_func_param(ctx->funcname, &ctx->nr_params,
ctx->flags & TPARG_FL_TPOINT); ctx->flags & TPARG_FL_TPOINT);
if (IS_ERR(params)) { if (IS_ERR_OR_NULL(params)) {
trace_probe_log_err(ctx->offset, NO_BTF_ENTRY); trace_probe_log_err(ctx->offset, NO_BTF_ENTRY);
return PTR_ERR(params); 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, params = find_btf_func_param(ctx->funcname, &nr_params,
ctx->flags & TPARG_FL_TPOINT); ctx->flags & TPARG_FL_TPOINT);
if (IS_ERR(params)) { if (IS_ERR_OR_NULL(params)) {
if (args_idx != -1) { if (args_idx != -1) {
/* $arg* requires BTF info */ /* $arg* requires BTF info */
trace_probe_log_err(0, NOSUP_BTFARG); trace_probe_log_err(0, NOSUP_BTFARG);

View file

@ -13,7 +13,7 @@ if grep -qF "f[:[<group>/][<event>]] <func-name>[%return] [<args>]" README ; the
FPROBES=yes FPROBES=yes
fi fi
if [ -z "$KPROBES" -a "$FPROBES" ] ; then if [ -z "$KPROBES" -a -z "$FPROBES" ] ; then
exit_unsupported exit_unsupported
fi fi