Message ID | 20210416025537.2352753-4-davemarchevsky@fb.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | BPF |
Headers | show |
Series | bpf: refine retval for bpf_get_task_stack helper | expand |
> On Apr 15, 2021, at 7:55 PM, Dave Marchevsky <davemarchevsky@fb.com> wrote: > > Add a libbpf test prog which feeds bpf_get_task_stack's return value > into seq_write after confirming it's positive. No attempt to bound the > value from above is made. > > Load will fail if verifier does not refine retval range based on buf sz > input to bpf_get_task_stack. > > Signed-off-by: Dave Marchevsky <davemarchevsky@fb.com> Acked-by: Song Liu <songliubraving@fb.com> With one nit below. > --- > .../selftests/bpf/prog_tests/bpf_iter.c | 1 + > .../selftests/bpf/progs/bpf_iter_task_stack.c | 22 +++++++++++++++++++ > 2 files changed, 23 insertions(+) > > diff --git a/tools/testing/selftests/bpf/prog_tests/bpf_iter.c b/tools/testing/selftests/bpf/prog_tests/bpf_iter.c > index 74c45d557a2b..2d3590cfb5e1 100644 > --- a/tools/testing/selftests/bpf/prog_tests/bpf_iter.c > +++ b/tools/testing/selftests/bpf/prog_tests/bpf_iter.c > @@ -147,6 +147,7 @@ static void test_task_stack(void) > return; > > do_dummy_read(skel->progs.dump_task_stack); > + do_dummy_read(skel->progs.get_task_user_stacks); > > bpf_iter_task_stack__destroy(skel); > } > diff --git a/tools/testing/selftests/bpf/progs/bpf_iter_task_stack.c b/tools/testing/selftests/bpf/progs/bpf_iter_task_stack.c > index 50e59a2e142e..c60048ed226f 100644 > --- a/tools/testing/selftests/bpf/progs/bpf_iter_task_stack.c > +++ b/tools/testing/selftests/bpf/progs/bpf_iter_task_stack.c > @@ -35,3 +35,25 @@ int dump_task_stack(struct bpf_iter__task *ctx) > > return 0; > } > + > +SEC("iter/task") > +int get_task_user_stacks(struct bpf_iter__task *ctx) > +{ > + struct seq_file *seq = ctx->meta->seq; > + struct task_struct *task = ctx->task; > + uint64_t buf_sz = 0; > + int64_t res; > + > + if (task == (void *)0) > + return 0; > + > + res = bpf_get_task_stack(task, entries, > + MAX_STACK_TRACE_DEPTH * SIZE_OF_ULONG, BPF_F_USER_STACK); > + if (res <= 0) > + return 0; > + > + buf_sz += res; > + nit: When the test fails because of missing the verifier change, a comment here would help the debug effort. > + bpf_seq_write(seq, &entries, buf_sz); > + return 0; > +} > -- > 2.30.2 >
diff --git a/tools/testing/selftests/bpf/prog_tests/bpf_iter.c b/tools/testing/selftests/bpf/prog_tests/bpf_iter.c index 74c45d557a2b..2d3590cfb5e1 100644 --- a/tools/testing/selftests/bpf/prog_tests/bpf_iter.c +++ b/tools/testing/selftests/bpf/prog_tests/bpf_iter.c @@ -147,6 +147,7 @@ static void test_task_stack(void) return; do_dummy_read(skel->progs.dump_task_stack); + do_dummy_read(skel->progs.get_task_user_stacks); bpf_iter_task_stack__destroy(skel); } diff --git a/tools/testing/selftests/bpf/progs/bpf_iter_task_stack.c b/tools/testing/selftests/bpf/progs/bpf_iter_task_stack.c index 50e59a2e142e..c60048ed226f 100644 --- a/tools/testing/selftests/bpf/progs/bpf_iter_task_stack.c +++ b/tools/testing/selftests/bpf/progs/bpf_iter_task_stack.c @@ -35,3 +35,25 @@ int dump_task_stack(struct bpf_iter__task *ctx) return 0; } + +SEC("iter/task") +int get_task_user_stacks(struct bpf_iter__task *ctx) +{ + struct seq_file *seq = ctx->meta->seq; + struct task_struct *task = ctx->task; + uint64_t buf_sz = 0; + int64_t res; + + if (task == (void *)0) + return 0; + + res = bpf_get_task_stack(task, entries, + MAX_STACK_TRACE_DEPTH * SIZE_OF_ULONG, BPF_F_USER_STACK); + if (res <= 0) + return 0; + + buf_sz += res; + + bpf_seq_write(seq, &entries, buf_sz); + return 0; +}
Add a libbpf test prog which feeds bpf_get_task_stack's return value into seq_write after confirming it's positive. No attempt to bound the value from above is made. Load will fail if verifier does not refine retval range based on buf sz input to bpf_get_task_stack. Signed-off-by: Dave Marchevsky <davemarchevsky@fb.com> --- .../selftests/bpf/prog_tests/bpf_iter.c | 1 + .../selftests/bpf/progs/bpf_iter_task_stack.c | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+)