All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Leon Hwang" <leon.hwang@linux.dev>, bpf@vger.kernel.org
Cc: linux-trace-kernel@vger.kernel.org
Subject: Re: [PATCH bpf-next v5 1/6] bpf: Add syscall common attrs support for link_create
Date: Mon, 26 Oct 2026 16:06:48 +0000	[thread overview]
Message-ID: <sashiko-outbox-185494@kernel.org> (raw)
In-Reply-To: <20261026154948.99408-2-leon.hwang@linux.dev>

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] bpf: inaccurate attach_type and prog_type error logging in link_create()
--

commit bc490436683f8010bb5c27c3e3a1582ddc24a909
Author: Leon Hwang <leon.hwang@linux.dev>

bpf: Add syscall common attrs support for link_create

This commit adds syscall common attributes support to link_create() in
kernel/bpf/syscall.c, initializing and finalizing a bpf_verifier_log
instance to report errors for invalid prog_fd, attach_type, and prog_type.

Link: https://lore.kernel.org/bpf/20260514004634.3DA09C19425@smtp.kernel.org/

> diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
> index 90bc7230afa8a..db870e795d044 100644
> --- a/kernel/bpf/syscall.c
> +++ b/kernel/bpf/syscall.c
> @@ -5862,8 +5862,11 @@ static int bpf_map_do_batch(const union bpf_attr *attr,
>  }
>  
>  #define BPF_LINK_CREATE_LAST_FIELD link_create.uprobe_multi.path_fd
> -static int link_create(union bpf_attr *attr, bpfptr_t uattr)
> +static int link_create(union bpf_attr *attr, bpfptr_t uattr, struct bpf_common_attr *attr_common,
> +		       bpfptr_t uattr_common, u32 size_common)
>  {
> +	struct bpf_verifier_log *log;
> +	struct bpf_log_attr attr_log;
>  	struct bpf_prog *prog;
>  	int ret;
>  
> @@ -5873,14 +5876,24 @@ static int link_create(union bpf_attr *attr, bpfptr_t uattr)
>  	if (attr->link_create.attach_type == BPF_STRUCT_OPS)
>  		return bpf_struct_ops_link_create(attr);
>  
> +	log = bpf_log_attr_create_vlog(&attr_log, attr_common, uattr_common, size_common);
> +	if (IS_ERR(log))
> +		return PTR_ERR(log);
> +
>  	prog = bpf_prog_get(attr->link_create.prog_fd);
> -	if (IS_ERR(prog))
> -		return PTR_ERR(prog);
> +	if (IS_ERR(prog)) {
> +		bpf_log(log, "Invalid prog_fd.\n");
> +		ret = PTR_ERR(prog);
> +		prog = NULL;
> +		goto out;
> +	}
>  
>  	ret = bpf_prog_attach_check_attach_type(prog,
>  						attr->link_create.attach_type);
> -	if (ret)
> +	if (ret) {
> +		bpf_log(log, "Invalid attach_type.\n");
>  		goto out;
> +	}
>  
>  	switch (prog->type) {
>  	case BPF_PROG_TYPE_CGROUP_SKB:
> @@ -5959,12 +5972,20 @@ static int link_create(union bpf_attr *attr, bpfptr_t uattr)
>  			ret = bpf_uprobe_multi_link_attach(attr, prog);
>  		break;
>  	default:
> +		bpf_log(log, "Invalid prog type.\n");
>  		ret = -EINVAL;
>  	}

[Severity: Medium]
Does calling bpf_prog_attach_check_attach_type() before switch (prog->type)
in kernel/bpf/syscall.c:link_create() cause misleading or missing log
messages in a few cases?

First, for almost all program types that are unsupported by link_create()
(such as BPF_PROG_TYPE_SOCKET_FILTER, BPF_PROG_TYPE_SCHED_ACT,
BPF_PROG_TYPE_RAW_TRACEPOINT, or BPF_PROG_TYPE_SYSCALL),
link_create() -> bpf_prog_attach_check_attach_type() hits the default
branch:

kernel/bpf/syscall.c:bpf_prog_attach_check_attach_type() {
	...
	default:
		ptype = attach_type_to_prog_type(attach_type);
		if (ptype == BPF_PROG_TYPE_UNSPEC || ptype != prog->type)
			return -EINVAL;
		return 0;
}

Because attach_type_to_prog_type() never returns those program types for any
attach_type, bpf_prog_attach_check_attach_type() returns -EINVAL and
link_create() logs "Invalid attach_type.\n" instead of reaching the default
branch of switch (prog->type) to log "Invalid prog type.\n".

Second, for BPF_PROG_TYPE_CGROUP_SKB, bpf_prog_attach_check_attach_type()
also performs a capability check:

	case BPF_PROG_TYPE_CGROUP_SKB:
		if (!bpf_token_capable(prog->aux->token, CAP_NET_ADMIN))
			return -EPERM;

When this check fails with -EPERM, link_create() still logs
"Invalid attach_type.\n" even when attach_type is valid.

Third, for BPF_PROG_TYPE_LSM and BPF_PROG_TYPE_TRACING,
bpf_prog_attach_check_attach_type() only checks that attach_type maps to the
general program type. The stricter expected_attach_type check happens inside
switch (prog->type) in link_create():

	case BPF_PROG_TYPE_LSM:
	case BPF_PROG_TYPE_TRACING:
		if (attr->link_create.attach_type != prog->expected_attach_type) {
			ret = -EINVAL;
			goto out;
		}

If a caller passes an attach_type of the same program type that does not
match prog->expected_attach_type, link_create() jumps to out without logging
"Invalid attach_type.\n".

Should the program type validation and attach_type logging be ordered so
that unsupported program types, -EPERM failures, and expected_attach_type
mismatches report accurate messages?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20261026154948.99408-1-leon.hwang@linux.dev?part=1

  reply	other threads:[~2026-10-26 16:06 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-26 15:49 [PATCH bpf-next v5 0/6] bpf: Add syscall common attrs support for xdp link_create Leon Hwang
2026-10-26 15:49 ` [PATCH bpf-next v5 1/6] bpf: Add syscall common attrs support for link_create Leon Hwang
2026-10-26 16:06   ` sashiko-bot [this message]
2026-10-29  6:35     ` Leon Hwang
2026-10-26 15:49 ` [PATCH bpf-next v5 2/6] bpf: Add syscall common attrs support for xdp link_create Leon Hwang
2026-10-27 23:07   ` Jakub Kicinski
2026-10-26 15:49 ` [PATCH bpf-next v5 3/6] bpf: Retire tracepoint bpf_xdp_link_attach_failed Leon Hwang
2026-10-26 15:49 ` [PATCH bpf-next v5 4/6] libbpf: Factor out __sys_bpf_fd helper Leon Hwang
2026-10-26 15:49 ` [PATCH bpf-next v5 5/6] libbpf: Add log_opts support for bpf_link_create Leon Hwang
2026-10-26 16:05   ` sashiko-bot
2026-10-29  6:36     ` Leon Hwang
2026-10-26 15:49 ` [PATCH bpf-next v5 6/6] selftests/bpf: Add tests to verify link_create logs Leon Hwang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=sashiko-outbox-185494@kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=leon.hwang@linux.dev \
    --cc=linux-trace-kernel@vger.kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.