Message ID | 20200424052045.4002963-1-andriin@fb.com |
---|---|
State | Accepted |
Delegated to: | BPF Maintainers |
Headers | show |
Series | [v2,bpf] bpf: fix leak in LINK_UPDATE and enforce empty old_prog_fd | expand |
On Thu, Apr 23, 2020 at 10:21 PM Andrii Nakryiko <andriin@fb.com> wrote: > > Fix bug of not putting bpf_link in LINK_UPDATE command. > Also enforce zeroed old_prog_fd if no BPF_F_REPLACE flag is specified. > > Signed-off-by: Andrii Nakryiko <andriin@fb.com> Applied. Thanks
On Fri, Apr 24, 2020 at 5:31 PM Alexei Starovoitov <alexei.starovoitov@gmail.com> wrote: > > On Thu, Apr 23, 2020 at 10:21 PM Andrii Nakryiko <andriin@fb.com> wrote: > > > > Fix bug of not putting bpf_link in LINK_UPDATE command. > > Also enforce zeroed old_prog_fd if no BPF_F_REPLACE flag is specified. > > > > Signed-off-by: Andrii Nakryiko <andriin@fb.com> > > Applied. Thanks Oops, forgot to include Fixes tag :( If it's not too late, can you please add? Fixes: 0c991ebc8c69 ("bpf: Implement bpf_prog replacement for an active bpf_cgroup_link") Thank you!
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index d85f37239540..bca58c235ac0 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -3628,8 +3628,10 @@ static int link_update(union bpf_attr *attr) return PTR_ERR(link); new_prog = bpf_prog_get(attr->link_update.new_prog_fd); - if (IS_ERR(new_prog)) - return PTR_ERR(new_prog); + if (IS_ERR(new_prog)) { + ret = PTR_ERR(new_prog); + goto out_put_link; + } if (flags & BPF_F_REPLACE) { old_prog = bpf_prog_get(attr->link_update.old_prog_fd); @@ -3638,6 +3640,9 @@ static int link_update(union bpf_attr *attr) old_prog = NULL; goto out_put_progs; } + } else if (attr->link_update.old_prog_fd) { + ret = -EINVAL; + goto out_put_progs; } #ifdef CONFIG_CGROUP_BPF @@ -3653,6 +3658,8 @@ static int link_update(union bpf_attr *attr) bpf_prog_put(old_prog); if (ret) bpf_prog_put(new_prog); +out_put_link: + bpf_link_put(link); return ret; }
Fix bug of not putting bpf_link in LINK_UPDATE command. Also enforce zeroed old_prog_fd if no BPF_F_REPLACE flag is specified. Signed-off-by: Andrii Nakryiko <andriin@fb.com> --- This version will merge with no conflicts with the upcoming LINK_UPDATE refactoring patch (part of bpf_link observability patch set). kernel/bpf/syscall.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)