Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'fix-the-null-pointer-dereference-issue-in-bpf_lwt_xmit_push_encap'

Feng Yang says:

====================
Fix the null pointer dereference issue in bpf_lwt_xmit_push_encap

Changes in v10:
- Patch simplification. Thanks, Martin KaFai Lau.
- Link to v9: https://lore.kernel.org/all/20260303074423.172680-1-yangfeng59949@163.com/
Changes in v9:
- Use dst_hold() and skb_dst_set().
Skip !skb_dst check.
Move all changes into the IS_ENABLED(CONFIG_IPV6).
Use #if IS_ENABLED(CONFIG_IPV6); otherwise, a compilation error will occur when ipv6 is not enabled.
Thanks, Martin KaFai Lau.
- Link to v8: https://lore.kernel.org/all/20260227082133.96951-1-yangfeng59949@163.com/
Changes in v8:
- set ret to an error code before goto out.
- Link to v7: https://lore.kernel.org/all/20260226095156.117996-1-yangfeng59949@163.com/
Changes in v7:
- Use ip6_null_entry to avoid. Thanks, Martin KaFai Lau.
Changes in v6:
- Modify the bpf_lwt_xmit_push_encap function and add selftests for it.
Thanks, Martin KaFai Lau.
- Link to v5: https://lore.kernel.org/all/20260210090657.86977-1-yangfeng59949@163.com/
Changes in v5:
- Refer to the bpf_lwt_xmit_reroute function to configure the dst parameter.
- Link to v4: https://lore.kernel.org/all/20260209015111.28144-1-yangfeng59949@163.com/
Changes in v4:
- add rcu lock
- Link to v3: https://lore.kernel.org/all/20260206055113.63476-1-yangfeng59949@163.com/
Changes in v3:
- use dst_init
- Link to v2: https://lore.kernel.org/all/20260205092227.126665-1-yangfeng59949@163.com/
Changes in v2:
- Link to v1: https://lore.kernel.org/all/20260127084520.13890-1-luyun_611@163.com/
====================

Link: https://patch.msgid.link/20260304094429.168521-1-yangfeng59949@163.com
Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>

+46
+15
net/bpf/test_run.c
··· 1156 1156 skb->ip_summed = CHECKSUM_COMPLETE; 1157 1157 } 1158 1158 1159 + if (prog->type == BPF_PROG_TYPE_LWT_XMIT) { 1160 + if (!ipv6_bpf_stub) { 1161 + pr_warn_once("Please test this program with the IPv6 module loaded\n"); 1162 + ret = -EOPNOTSUPP; 1163 + goto out; 1164 + } 1165 + #if IS_ENABLED(CONFIG_IPV6) 1166 + /* For CONFIG_IPV6=n, ipv6_bpf_stub is NULL which is 1167 + * handled by the above if statement. 1168 + */ 1169 + dst_hold(&net->ipv6.ip6_null_entry->dst); 1170 + skb_dst_set(skb, &net->ipv6.ip6_null_entry->dst); 1171 + #endif 1172 + } 1173 + 1159 1174 ret = bpf_test_run(prog, skb, repeat, &retval, &duration, false); 1160 1175 if (ret) 1161 1176 goto out;
+9
tools/testing/selftests/bpf/prog_tests/lwt_misc.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + 3 + #include <test_progs.h> 4 + #include "lwt_misc.skel.h" 5 + 6 + void test_lwt_misc(void) 7 + { 8 + RUN_TESTS(lwt_misc); 9 + }
+22
tools/testing/selftests/bpf/progs/lwt_misc.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + 3 + #include "vmlinux.h" 4 + #include <bpf/bpf_helpers.h> 5 + #include "bpf_misc.h" 6 + 7 + SEC("lwt_xmit") 8 + __success __retval(0) 9 + int test_missing_dst(struct __sk_buff *skb) 10 + { 11 + struct iphdr iph; 12 + 13 + __builtin_memset(&iph, 0, sizeof(struct iphdr)); 14 + iph.ihl = 5; 15 + iph.version = 4; 16 + 17 + bpf_lwt_push_encap(skb, BPF_LWT_ENCAP_IP, &iph, sizeof(struct iphdr)); 18 + 19 + return 0; 20 + } 21 + 22 + char _license[] SEC("license") = "GPL";