Message ID | 20220809134752.1488608-1-lee@kernel.org (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | BPF |
Headers | show |
Series | [v3,1/1] bpf: Drop unprotected find_vpid() in favour of find_get_pid() | expand |
On Tue, 09 Aug 2022, Lee Jones wrote: > The documentation for find_vpid() clearly states: > > "Must be called with the tasklist_lock or rcu_read_lock() held." > > Presently we do neither. > > Let's use find_get_pid() which searches for the vpid, then takes a > reference to it preventing early free, all within the safety of > rcu_read_lock(). Once we have our reference we can safely make use of > it up until the point it is put. > > Cc: Alexei Starovoitov <ast@kernel.org> > Cc: Daniel Borkmann <daniel@iogearbox.net> > Cc: John Fastabend <john.fastabend@gmail.com> > Cc: Andrii Nakryiko <andrii@kernel.org> > Cc: Martin KaFai Lau <martin.lau@linux.dev> > Cc: Song Liu <song@kernel.org> > Cc: Yonghong Song <yhs@fb.com> > Cc: KP Singh <kpsingh@kernel.org> > Cc: Stanislav Fomichev <sdf@google.com> > Cc: Hao Luo <haoluo@google.com> > Cc: bpf@vger.kernel.org > Fixes: 41bdc4b40ed6f ("bpf: introduce bpf subcommand BPF_TASK_FD_QUERY") > Acked-by: Jiri Olsa <jolsa@kernel.org> > Signed-off-by: Lee Jones <lee@kernel.org> > --- > > v1 => v2: > * Commit log update - description - no code differences > > v2 => v3: > * Commit log update - spelling of find_vpid() - no code differences Did anyone get a chance to look at this please? Would you like a [RESEND]? > kernel/bpf/syscall.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c > index 83c7136c5788d..c20cff30581c4 100644 > --- a/kernel/bpf/syscall.c > +++ b/kernel/bpf/syscall.c > @@ -4385,6 +4385,7 @@ static int bpf_task_fd_query(const union bpf_attr *attr, > const struct perf_event *event; > struct task_struct *task; > struct file *file; > + struct pid *ppid; > int err; > > if (CHECK_ATTR(BPF_TASK_FD_QUERY)) > @@ -4396,7 +4397,9 @@ static int bpf_task_fd_query(const union bpf_attr *attr, > if (attr->task_fd_query.flags != 0) > return -EINVAL; > > - task = get_pid_task(find_vpid(pid), PIDTYPE_PID); > + ppid = find_get_pid(pid); > + task = get_pid_task(ppid, PIDTYPE_PID); > + put_pid(ppid); > if (!task) > return -ENOENT; >
On Thu, 08 Sep 2022, Lee Jones wrote: > On Tue, 09 Aug 2022, Lee Jones wrote: > > > The documentation for find_vpid() clearly states: > > > > "Must be called with the tasklist_lock or rcu_read_lock() held." > > > > Presently we do neither. > > > > Let's use find_get_pid() which searches for the vpid, then takes a > > reference to it preventing early free, all within the safety of > > rcu_read_lock(). Once we have our reference we can safely make use of > > it up until the point it is put. > > > > Cc: Alexei Starovoitov <ast@kernel.org> > > Cc: Daniel Borkmann <daniel@iogearbox.net> > > Cc: John Fastabend <john.fastabend@gmail.com> > > Cc: Andrii Nakryiko <andrii@kernel.org> > > Cc: Martin KaFai Lau <martin.lau@linux.dev> > > Cc: Song Liu <song@kernel.org> > > Cc: Yonghong Song <yhs@fb.com> > > Cc: KP Singh <kpsingh@kernel.org> > > Cc: Stanislav Fomichev <sdf@google.com> > > Cc: Hao Luo <haoluo@google.com> > > Cc: bpf@vger.kernel.org > > Fixes: 41bdc4b40ed6f ("bpf: introduce bpf subcommand BPF_TASK_FD_QUERY") > > Acked-by: Jiri Olsa <jolsa@kernel.org> > > Signed-off-by: Lee Jones <lee@kernel.org> > > --- > > > > v1 => v2: > > * Commit log update - description - no code differences > > > > v2 => v3: > > * Commit log update - spelling of find_vpid() - no code differences > > Did anyone get a chance to look at this please? > > Would you like a [RESEND]? Scrap that. I've just seen the last replies to v2. Leave it with me.
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 83c7136c5788d..c20cff30581c4 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -4385,6 +4385,7 @@ static int bpf_task_fd_query(const union bpf_attr *attr, const struct perf_event *event; struct task_struct *task; struct file *file; + struct pid *ppid; int err; if (CHECK_ATTR(BPF_TASK_FD_QUERY)) @@ -4396,7 +4397,9 @@ static int bpf_task_fd_query(const union bpf_attr *attr, if (attr->task_fd_query.flags != 0) return -EINVAL; - task = get_pid_task(find_vpid(pid), PIDTYPE_PID); + ppid = find_get_pid(pid); + task = get_pid_task(ppid, PIDTYPE_PID); + put_pid(ppid); if (!task) return -ENOENT;