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
60476047 BPF_F_MARK_ENFORCE = (1ULL << 6),
60486048 };
60496049
6050−/* BPF_FUNC_clone_redirect and BPF_FUNC_redirect flags. */
6051−enum {
6052− BPF_F_INGRESS = (1ULL << 0),
6053−};
6054−
60556050 /* BPF_FUNC_skb_set_tunnel_key and BPF_FUNC_skb_get_tunnel_key flags. */
60566051 enum {
60576052 BPF_F_TUNINFO_IPV6 = (1ULL << 0),
@@ -6198,10 +6193,12 @@ enum { · 140 unmodified lines
61986193 BPF_F_BPRM_SECUREEXEC = (1ULL << 0),
61996194 };
62006195
6201−/* Flags for bpf_redirect_map helper */
6196+/* Flags for bpf_redirect and bpf_redirect_map helpers */
62026197 enum {
6203− BPF_F_BROADCAST = (1ULL << 3),
6204− BPF_F_EXCLUDE_INGRESS = (1ULL << 4),
6198+ BPF_F_INGRESS = (1ULL << 0), /* used for skb path */
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)
62056202 };
62066203
62076204 #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