Skip to content

Commit 496720b

Browse files
author
Alexei Starovoitov
committed
Merge branch 'Fix for check_max_stack_depth'
Kumar Kartikeya Dwivedi says: ==================== Fix for a bug in check_max_stack_depth which allows bypassing the 512-byte stack limit. ==================== Signed-off-by: Alexei Starovoitov <[email protected]>
2 parents 6843306 + 906bd22 commit 496720b

File tree

3 files changed

+52
-2
lines changed

3 files changed

+52
-2
lines changed

kernel/bpf/verifier.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5642,8 +5642,9 @@ static int check_max_stack_depth(struct bpf_verifier_env *env)
56425642
verbose(env, "verifier bug. subprog has tail_call and async cb\n");
56435643
return -EFAULT;
56445644
}
5645-
/* async callbacks don't increase bpf prog stack size */
5646-
continue;
5645+
/* async callbacks don't increase bpf prog stack size unless called directly */
5646+
if (!bpf_pseudo_call(insn + i))
5647+
continue;
56475648
}
56485649
i = next_insn;
56495650

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
#include <test_progs.h>
3+
4+
#include "async_stack_depth.skel.h"
5+
6+
void test_async_stack_depth(void)
7+
{
8+
RUN_TESTS(async_stack_depth);
9+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
#include <vmlinux.h>
3+
#include <bpf/bpf_helpers.h>
4+
5+
#include "bpf_misc.h"
6+
7+
struct hmap_elem {
8+
struct bpf_timer timer;
9+
};
10+
11+
struct {
12+
__uint(type, BPF_MAP_TYPE_HASH);
13+
__uint(max_entries, 64);
14+
__type(key, int);
15+
__type(value, struct hmap_elem);
16+
} hmap SEC(".maps");
17+
18+
__attribute__((noinline))
19+
static int timer_cb(void *map, int *key, struct bpf_timer *timer)
20+
{
21+
volatile char buf[256] = {};
22+
return buf[69];
23+
}
24+
25+
SEC("tc")
26+
__failure __msg("combined stack size of 2 calls")
27+
int prog(struct __sk_buff *ctx)
28+
{
29+
struct hmap_elem *elem;
30+
volatile char buf[256] = {};
31+
32+
elem = bpf_map_lookup_elem(&hmap, &(int){0});
33+
if (!elem)
34+
return 0;
35+
36+
timer_cb(NULL, NULL, NULL);
37+
return bpf_timer_set_callback(&elem->timer, timer_cb) + buf[0];
38+
}
39+
40+
char _license[] SEC("license") = "GPL";

0 commit comments

Comments
 (0)