History

bpf: Make sure internal and UAPI bpf_redirect flags don't overlap

The bpf_redirect_info is shared between the SKB and XDP redirect paths, and the two paths use the same numeric flag values in the ri->flags field (specifically, BPF_F_BROADCAST == BPF_F_NEXTHOP). This means that if skb bpf_redirect_neigh() is used with a non-NULL params argument and, subsequently, an XDP redirect is performed using the same bpf_redirect_info struct, the XDP path will get confused and end up crashing, which syzbot managed to trigger. With the stack-allocated bpf_redirect_info, the structure is no longer shared between the SKB and XDP paths, so the crash doesn't happen anymore. However, different code paths using identically-numbered flag values in the same struct field still seems like a bit of a mess, so this patch cleans that up by moving the flag definitions together and redefining the three flags in BPF_F_REDIRECT_INTERNAL to not overlap with the flags used for XDP. It also adds a BUILD_BUG_ON() check to make sure the overlap is not re-introduced by mistake.

Toke Høiland-Jørgensen committed 2 years ago

Commit 09d88791 parent a41b3822 files · +10 −11Browse files

Showing the changes to include/uapi/linux (1 of 2 files). Show all

Unified · Split

include/uapi/linux/bpf.h+5−8
@@ -6047,11 +6047,6 @@ enum { · 6046 unmodified lines
6047 BPF_F_MARK_ENFORCE = (1ULL << 6),6047 BPF_F_MARK_ENFORCE = (1ULL << 6),
6048};6048};
6049 6049
6050/* BPF_FUNC_clone_redirect and BPF_FUNC_redirect flags. */
6051enum {
6052 BPF_F_INGRESS = (1ULL << 0),
6053};
6054
6055/* BPF_FUNC_skb_set_tunnel_key and BPF_FUNC_skb_get_tunnel_key flags. */6050/* BPF_FUNC_skb_set_tunnel_key and BPF_FUNC_skb_get_tunnel_key flags. */
6056enum {6051enum {
6057 BPF_F_TUNINFO_IPV6 = (1ULL << 0),6052 BPF_F_TUNINFO_IPV6 = (1ULL << 0),
@@ -6198,10 +6193,12 @@ enum { · 140 unmodified lines
6198 BPF_F_BPRM_SECUREEXEC = (1ULL << 0),6193 BPF_F_BPRM_SECUREEXEC = (1ULL << 0),
6199};6194};
6200 6195
6201/* Flags for bpf_redirect_map helper */6196/* Flags for bpf_redirect and bpf_redirect_map helpers */
6202enum {6197enum {
6203 BPF_F_BROADCAST = (1ULL << 3),6198 BPF_F_INGRESS = (1ULL << 0), /* used for skb path */
6204 BPF_F_EXCLUDE_INGRESS = (1ULL << 4),6199 BPF_F_BROADCAST = (1ULL << 3), /* used for XDP path */
6200 BPF_F_EXCLUDE_INGRESS = (1ULL << 4), /* used for XDP path */
6201#define BPF_F_REDIRECT_FLAGS (BPF_F_INGRESS | BPF_F_BROADCAST | BPF_F_EXCLUDE_INGRESS)
6205};6202};
6206 6203
6207#define __bpf_md_ptr(type, name) \6204#define __bpf_md_ptr(type, name) \

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t