bpf: Test_progs, add test to catch retval refine error handling
Before this series the verifier would clamp return bounds of bpf_get_stack() to [0, X] and this led the verifier to believe that a JMP_JSLT 0 would be false and so would prune that path. The result is anything hidden behind that JSLT would be unverified. Add a test to catch this case by hiding an goto pc-1 behind the check which will cause an infinite loop if not rejected. Signed-off-by: John Fastabend <john.fastabend@gmail.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Link: https://lore.kernel.org/bpf/158560423908.10843.11783152347709008373.stgit@john-Precision-5820-Tower
This commit is contained in:
parent
fa123ac022
commit
d2db08c7a1
|
@ -82,6 +82,7 @@ static void get_stack_print_output(void *ctx, int cpu, void *data, __u32 size)
|
||||||
void test_get_stack_raw_tp(void)
|
void test_get_stack_raw_tp(void)
|
||||||
{
|
{
|
||||||
const char *file = "./test_get_stack_rawtp.o";
|
const char *file = "./test_get_stack_rawtp.o";
|
||||||
|
const char *file_err = "./test_get_stack_rawtp_err.o";
|
||||||
const char *prog_name = "raw_tracepoint/sys_enter";
|
const char *prog_name = "raw_tracepoint/sys_enter";
|
||||||
int i, err, prog_fd, exp_cnt = MAX_CNT_RAWTP;
|
int i, err, prog_fd, exp_cnt = MAX_CNT_RAWTP;
|
||||||
struct perf_buffer_opts pb_opts = {};
|
struct perf_buffer_opts pb_opts = {};
|
||||||
|
@ -93,6 +94,10 @@ void test_get_stack_raw_tp(void)
|
||||||
struct bpf_map *map;
|
struct bpf_map *map;
|
||||||
cpu_set_t cpu_set;
|
cpu_set_t cpu_set;
|
||||||
|
|
||||||
|
err = bpf_prog_load(file_err, BPF_PROG_TYPE_RAW_TRACEPOINT, &obj, &prog_fd);
|
||||||
|
if (CHECK(err >= 0, "prog_load raw tp", "err %d errno %d\n", err, errno))
|
||||||
|
return;
|
||||||
|
|
||||||
err = bpf_prog_load(file, BPF_PROG_TYPE_RAW_TRACEPOINT, &obj, &prog_fd);
|
err = bpf_prog_load(file, BPF_PROG_TYPE_RAW_TRACEPOINT, &obj, &prog_fd);
|
||||||
if (CHECK(err, "prog_load raw tp", "err %d errno %d\n", err, errno))
|
if (CHECK(err, "prog_load raw tp", "err %d errno %d\n", err, errno))
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
|
#include <linux/bpf.h>
|
||||||
|
#include <bpf/bpf_helpers.h>
|
||||||
|
|
||||||
|
#define MAX_STACK_RAWTP 10
|
||||||
|
|
||||||
|
SEC("raw_tracepoint/sys_enter")
|
||||||
|
int bpf_prog2(void *ctx)
|
||||||
|
{
|
||||||
|
__u64 stack[MAX_STACK_RAWTP];
|
||||||
|
int error;
|
||||||
|
|
||||||
|
/* set all the flags which should return -EINVAL */
|
||||||
|
error = bpf_get_stack(ctx, stack, 0, -1);
|
||||||
|
if (error < 0)
|
||||||
|
goto loop;
|
||||||
|
|
||||||
|
return error;
|
||||||
|
loop:
|
||||||
|
while (1) {
|
||||||
|
error++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char _license[] SEC("license") = "GPL";
|
Loading…
Reference in New Issue