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 1/6] bpf: Add syscall common attrs support for link_create
Date: Sat, 17 Oct 2026 14:39:23 +0000 [thread overview]
Message-ID: <sashiko-outbox-175562@kernel.org> (raw)
In-Reply-To: <20261017142649.51047-2-leon.hwang@linux.dev>
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Critical] bpf: prog refcount underflow and fd leak in link_create() on log error
--
commit 56fa3f4abf91b9651c1cd02884b19754bd9ebcb5
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(),
creating and finalizing an internal verifier log instance and reporting
error messages for an invalid prog_fd or attach_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 0f27604a54aae..252b479937a4d 100644
> --- a/kernel/bpf/syscall.c
> +++ b/kernel/bpf/syscall.c
> @@ -5839,10 +5839,13 @@ 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;
> + int ret, err;
>
> if (CHECK_ATTR(BPF_LINK_CREATE))
> return -EINVAL;
> @@ -5850,14 +5853,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:
> @@ -5940,7 +5953,14 @@ static int link_create(union bpf_attr *attr, bpfptr_t uattr)
> }
>
> out:
> - if (ret < 0)
> + /* preserve original error even if log finalization is successful */
> + err = bpf_log_attr_finalize(&attr_log, log);
> + if (err)
> + ret = err;
> +
> + kfree(log);
> +
> + if (ret < 0 && prog)
> bpf_prog_put(prog);
> return ret;
> }
[Severity: Critical]
Can this underflow the refcount on prog and leak the newly installed link
file descriptor if bpf_log_attr_finalize() fails after link attachment
succeeds?
When one of the link attach helpers in switch (prog->type) succeeds, it
transfers ownership of the prog reference acquired by bpf_prog_get() to
link->prog and calls bpf_link_settle() (or bpf_link_new_fd()), which
installs the file descriptor via fd_install() and returns the non-negative
fd in ret.
At the out label, bpf_log_attr_finalize() is then called:
kernel/bpf/log.c:bpf_log_attr_finalize() {
err = bpf_vlog_finalize(log, &log_true_size);
if (attr->offsetof_true_size &&
copy_to_bpfptr_offset(attr->uattr, attr->offsetof_true_size, &log_true_size,
sizeof(log_true_size)))
return -EFAULT;
return err;
}
If uattr_common was passed with size_common large enough to include
log_true_size and resides in read-only memory (or is unmapped before
finalization), copy_to_bpfptr_offset() returns -EFAULT even when nothing
was logged.
In link_create(), ret is then overwritten with -EFAULT, causing
if (ret < 0 && prog) to call bpf_prog_put(prog) on the reference that is
now owned by the active bpf_link. When the installed link fd is later
closed, bpf_link_free() -> bpf_link_dealloc() will call
bpf_prog_put(link->prog) a second time:
kernel/bpf/syscall.c:bpf_link_dealloc() {
if (link->prog)
bpf_prog_put(link->prog);
...
}
Should the ret < 0 check for bpf_prog_put(prog) happen before
ret is overwritten by err from bpf_log_attr_finalize(), or should log
finalization be handled before settling the link?
[ ... ]
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261017142649.51047-1-leon.hwang@linux.dev?part=1
next prev parent reply other threads:[~2026-10-17 14:39 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-17 14:26 [PATCH bpf-next 0/6] bpf: Add syscall common attrs support for xdp link_create Leon Hwang
2026-10-17 14:26 ` [PATCH bpf-next 1/6] bpf: Add syscall common attrs support for link_create Leon Hwang
2026-10-17 14:39 ` sashiko-bot [this message]
2026-10-17 14:26 ` [PATCH bpf-next 2/6] bpf: Add syscall common attrs support for xdp link_create Leon Hwang
2026-10-17 14:48 ` sashiko-bot
2026-10-17 15:03 ` bot+bpf-ci
2026-10-18 3:28 ` kernel test robot
2026-10-18 3:46 ` kernel test robot
2026-10-17 14:26 ` [PATCH bpf-next 3/6] bpf: Retire tracepoint bpf_xdp_link_attach_failed Leon Hwang
2026-10-17 14:26 ` [PATCH bpf-next 4/6] libbpf: Factor out __bpf_sys_fd helper Leon Hwang
2026-10-17 14:53 ` bot+bpf-ci
2026-10-17 14:26 ` [PATCH bpf-next 5/6] libbpf: Add bpf_link_create_log API Leon Hwang
2026-10-17 14:43 ` sashiko-bot
2026-10-17 15:03 ` bot+bpf-ci
2026-10-17 14:26 ` [PATCH bpf-next 6/6] selftests/bpf: Add tests to verify link_create logs Leon Hwang
2026-10-17 15:02 ` bot+bpf-ci
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-175562@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.