[PATCH v2] bpf: test_run: Fix the null pointer dereference issue in bpf_lwt_xmit_push_encap

Feng Yang posted 1 patch 2 days, 2 hours ago
There is a newer version of this series
net/bpf/test_run.c | 7 +++++++
1 file changed, 7 insertions(+)
[PATCH v2] bpf: test_run: Fix the null pointer dereference issue in bpf_lwt_xmit_push_encap
Posted by Feng Yang 2 days, 2 hours ago
From: Feng Yang <yangfeng@kylinos.cn>

The bpf_lwt_xmit_push_encap helper needs to access skb_dst(skb)->dev to
calculate the needed headroom:

	err = skb_cow_head(skb,
			   len + LL_RESERVED_SPACE(skb_dst(skb)->dev));

But skb->_skb_refdst may not be initialized when the skb is set up by
bpf_prog_test_run_skb function. Executing bpf_lwt_push_ip_encap function
in this scenario will trigger null pointer dereference, causing a kernel
crash as Yinhao reported:

[  105.186365] BUG: kernel NULL pointer dereference, address: 0000000000000000
[  105.186382] #PF: supervisor read access in kernel mode
[  105.186388] #PF: error_code(0x0000) - not-present page
[  105.186393] PGD 121d3d067 P4D 121d3d067 PUD 106c83067 PMD 0
[  105.186404] Oops: 0000 [#1] PREEMPT SMP NOPTI
[  105.186412] CPU: 3 PID: 3250 Comm: poc Kdump: loaded Not tainted 6.19.0-rc5 #1
[  105.186423] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
[  105.186427] RIP: 0010:bpf_lwt_push_ip_encap+0x1eb/0x520
[  105.186443] Code: 0f 84 de 01 00 00 0f b7 4a 04 66 85 c9 0f 85 47 01 00 00 31 c0 5b 5d 41 5c 41 5d 41 5e c3 cc cc cc cc 48 8b 73 58 48 83 e6 fe <48> 8b 36 0f b7 be ec 00 00 00 0f b7 b6 e6 00 00 00 01 fe 83 e6 f0
[  105.186449] RSP: 0018:ffffbb0e0387bc50 EFLAGS: 00010246
[  105.186455] RAX: 000000000000004e RBX: ffff94c74e036500 RCX: ffff94c74874da00
[  105.186460] RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffff94c74e036500
[  105.186463] RBP: 0000000000000001 R08: 0000000000000002 R09: 0000000000000000
[  105.186467] R10: ffffbb0e0387bd50 R11: 0000000000000000 R12: ffffbb0e0387bc98
[  105.186471] R13: 0000000000000014 R14: 0000000000000000 R15: 0000000000000002
[  105.186484] FS:  00007f166aa4d680(0000) GS:ffff94c8b7780000(0000) knlGS:0000000000000000
[  105.186490] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[  105.186494] CR2: 0000000000000000 CR3: 000000015eade001 CR4: 0000000000770ee0
[  105.186499] PKRU: 55555554
[  105.186502] Call Trace:
[  105.186507]  <TASK>
[  105.186513]  bpf_lwt_xmit_push_encap+0x2b/0x40
[  105.186522]  bpf_prog_a75eaad51e517912+0x41/0x49
[  105.186536]  ? kvm_clock_get_cycles+0x18/0x30
[  105.186547]  ? ktime_get+0x3c/0xa0
[  105.186554]  bpf_test_run+0x195/0x320
[  105.186563]  ? bpf_test_run+0x10f/0x320
[  105.186579]  bpf_prog_test_run_skb+0x2f5/0x4f0
[  105.186590]  __sys_bpf+0x69c/0xa40
[  105.186603]  __x64_sys_bpf+0x1e/0x30
[  105.186611]  do_syscall_64+0x59/0x110
[  105.186620]  entry_SYSCALL_64_after_hwframe+0x76/0xe0
[  105.186649] RIP: 0033:0x7f166a97455d

Temporarily add the setting of skb->_skb_refdst before bpf_test_run to resolve the issue.

Fixes: 52f278774e79 ("bpf: implement BPF_LWT_ENCAP_IP mode in bpf_lwt_push_encap")
Reported-by: Yinhao Hu <dddddd@hust.edu.cn>
Reported-by: Kaiyan Mei <M202472210@hust.edu.cn>
Signed-off-by: Yun Lu <luyun@kylinos.cn>
Signed-off-by: Feng Yang <yangfeng@kylinos.cn>
---
Changes in v2:
- Link to v1: https://lore.kernel.org/all/20260127084520.13890-1-luyun_611@163.com/ 
---
 net/bpf/test_run.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/net/bpf/test_run.c b/net/bpf/test_run.c
index 178c4738e63b..c05b31cd1741 100644
--- a/net/bpf/test_run.c
+++ b/net/bpf/test_run.c
@@ -982,6 +982,7 @@ static struct proto bpf_dummy_proto = {
 	.obj_size = sizeof(struct sock),
 };
 
+struct dst_entry bpf_test_run_lwt_xmit_dst;
 int bpf_prog_test_run_skb(struct bpf_prog *prog, const union bpf_attr *kattr,
 			  union bpf_attr __user *uattr)
 {
@@ -1156,7 +1157,13 @@ int bpf_prog_test_run_skb(struct bpf_prog *prog, const union bpf_attr *kattr,
 		skb->ip_summed = CHECKSUM_COMPLETE;
 	}
 
+	if (prog->type == BPF_PROG_TYPE_LWT_XMIT) {
+		bpf_test_run_lwt_xmit_dst.dev = dev;
+		skb_dst_set(skb, &bpf_test_run_lwt_xmit_dst);
+	}
 	ret = bpf_test_run(prog, skb, repeat, &retval, &duration, false);
+	if (prog->type == BPF_PROG_TYPE_LWT_XMIT)
+		skb_dst_set(skb, NULL);
 	if (ret)
 		goto out;
 	if (!is_l2) {
-- 
2.43.0
Re: [PATCH v2] bpf: test_run: Fix the null pointer dereference issue in bpf_lwt_xmit_push_encap
Posted by kernel test robot 1 day, 17 hours ago
Hi Feng,

kernel test robot noticed the following build warnings:

[auto build test WARNING on bpf-next/net]
[also build test WARNING on bpf-next/master bpf/master net-next/main net/main linus/master v6.19-rc8 next-20260205]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Feng-Yang/bpf-test_run-Fix-the-null-pointer-dereference-issue-in-bpf_lwt_xmit_push_encap/20260205-172527
base:   https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git net
patch link:    https://lore.kernel.org/r/20260205092227.126665-1-yangfeng59949%40163.com
patch subject: [PATCH v2] bpf: test_run: Fix the null pointer dereference issue in bpf_lwt_xmit_push_encap
config: hexagon-randconfig-r132-20260205 (https://download.01.org/0day-ci/archive/20260206/202602060101.PefMJeTB-lkp@intel.com/config)
compiler: clang version 19.1.7 (https://github.com/llvm/llvm-project cd708029e0b2869e80abe31ddb175f7c35361f90)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260206/202602060101.PefMJeTB-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202602060101.PefMJeTB-lkp@intel.com/

sparse warnings: (new ones prefixed by >>)
   net/bpf/test_run.c:617:18: sparse: sparse: symbol 'bpf_kfunc_call_test_release_dtor' was not declared. Should it be static?
   net/bpf/test_run.c:627:18: sparse: sparse: symbol 'bpf_kfunc_call_memb_release_dtor' was not declared. Should it be static?
>> net/bpf/test_run.c:984:18: sparse: sparse: symbol 'bpf_test_run_lwt_xmit_dst' was not declared. Should it be static?

vim +/bpf_test_run_lwt_xmit_dst +984 net/bpf/test_run.c

   983	
 > 984	struct dst_entry bpf_test_run_lwt_xmit_dst;
   985	int bpf_prog_test_run_skb(struct bpf_prog *prog, const union bpf_attr *kattr,
   986				  union bpf_attr __user *uattr)
   987	{
   988		bool is_l2 = false, is_direct_pkt_access = false, is_lwt = false;
   989		u32 tailroom = SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
   990		struct net *net = current->nsproxy->net_ns;
   991		struct net_device *dev = net->loopback_dev;
   992		u32 headroom = NET_SKB_PAD + NET_IP_ALIGN;
   993		u32 linear_sz = kattr->test.data_size_in;
   994		u32 repeat = kattr->test.repeat;
   995		struct __sk_buff *ctx = NULL;
   996		struct sk_buff *skb = NULL;
   997		struct sock *sk = NULL;
   998		u32 retval, duration;
   999		int hh_len = ETH_HLEN;
  1000		void *data = NULL;
  1001		int ret;
  1002	
  1003		if ((kattr->test.flags & ~BPF_F_TEST_SKB_CHECKSUM_COMPLETE) ||
  1004		    kattr->test.cpu || kattr->test.batch_size)
  1005			return -EINVAL;
  1006	
  1007		if (kattr->test.data_size_in < ETH_HLEN)
  1008			return -EINVAL;
  1009	
  1010		switch (prog->type) {
  1011		case BPF_PROG_TYPE_SCHED_CLS:
  1012		case BPF_PROG_TYPE_SCHED_ACT:
  1013			is_direct_pkt_access = true;
  1014			is_l2 = true;
  1015			break;
  1016		case BPF_PROG_TYPE_LWT_IN:
  1017		case BPF_PROG_TYPE_LWT_OUT:
  1018		case BPF_PROG_TYPE_LWT_XMIT:
  1019			is_lwt = true;
  1020			fallthrough;
  1021		case BPF_PROG_TYPE_CGROUP_SKB:
  1022			is_direct_pkt_access = true;
  1023			break;
  1024		default:
  1025			break;
  1026		}
  1027	
  1028		ctx = bpf_ctx_init(kattr, sizeof(struct __sk_buff));
  1029		if (IS_ERR(ctx))
  1030			return PTR_ERR(ctx);
  1031	
  1032		if (ctx) {
  1033			if (ctx->data_end > kattr->test.data_size_in || ctx->data || ctx->data_meta) {
  1034				ret = -EINVAL;
  1035				goto out;
  1036			}
  1037			if (ctx->data_end) {
  1038				/* Non-linear LWT test_run is unsupported for now. */
  1039				if (is_lwt) {
  1040					ret = -EINVAL;
  1041					goto out;
  1042				}
  1043				linear_sz = max(ETH_HLEN, ctx->data_end);
  1044			}
  1045		}
  1046	
  1047		linear_sz = min_t(u32, linear_sz, PAGE_SIZE - headroom - tailroom);
  1048	
  1049		data = bpf_test_init(kattr, linear_sz, linear_sz, headroom, tailroom);
  1050		if (IS_ERR(data)) {
  1051			ret = PTR_ERR(data);
  1052			data = NULL;
  1053			goto out;
  1054		}
  1055	
  1056		sk = sk_alloc(net, AF_UNSPEC, GFP_USER, &bpf_dummy_proto, 1);
  1057		if (!sk) {
  1058			ret = -ENOMEM;
  1059			goto out;
  1060		}
  1061		sock_init_data(NULL, sk);
  1062	
  1063		skb = slab_build_skb(data);
  1064		if (!skb) {
  1065			ret = -ENOMEM;
  1066			goto out;
  1067		}
  1068		skb->sk = sk;
  1069	
  1070		data = NULL; /* data released via kfree_skb */
  1071	
  1072		skb_reserve(skb, NET_SKB_PAD + NET_IP_ALIGN);
  1073		__skb_put(skb, linear_sz);
  1074	
  1075		if (unlikely(kattr->test.data_size_in > linear_sz)) {
  1076			void __user *data_in = u64_to_user_ptr(kattr->test.data_in);
  1077			struct skb_shared_info *sinfo = skb_shinfo(skb);
  1078			u32 copied = linear_sz;
  1079	
  1080			while (copied < kattr->test.data_size_in) {
  1081				struct page *page;
  1082				u32 data_len;
  1083	
  1084				if (sinfo->nr_frags == MAX_SKB_FRAGS) {
  1085					ret = -ENOMEM;
  1086					goto out;
  1087				}
  1088	
  1089				page = alloc_page(GFP_KERNEL);
  1090				if (!page) {
  1091					ret = -ENOMEM;
  1092					goto out;
  1093				}
  1094	
  1095				data_len = min_t(u32, kattr->test.data_size_in - copied,
  1096						 PAGE_SIZE);
  1097				skb_fill_page_desc(skb, sinfo->nr_frags, page, 0, data_len);
  1098	
  1099				if (copy_from_user(page_address(page), data_in + copied,
  1100						   data_len)) {
  1101					ret = -EFAULT;
  1102					goto out;
  1103				}
  1104				skb->data_len += data_len;
  1105				skb->truesize += PAGE_SIZE;
  1106				skb->len += data_len;
  1107				copied += data_len;
  1108			}
  1109		}
  1110	
  1111		if (ctx && ctx->ifindex > 1) {
  1112			dev = dev_get_by_index(net, ctx->ifindex);
  1113			if (!dev) {
  1114				ret = -ENODEV;
  1115				goto out;
  1116			}
  1117		}
  1118		skb->protocol = eth_type_trans(skb, dev);
  1119		skb_reset_network_header(skb);
  1120	
  1121		switch (skb->protocol) {
  1122		case htons(ETH_P_IP):
  1123			sk->sk_family = AF_INET;
  1124			if (sizeof(struct iphdr) <= skb_headlen(skb)) {
  1125				sk->sk_rcv_saddr = ip_hdr(skb)->saddr;
  1126				sk->sk_daddr = ip_hdr(skb)->daddr;
  1127			}
  1128			break;
  1129	#if IS_ENABLED(CONFIG_IPV6)
  1130		case htons(ETH_P_IPV6):
  1131			sk->sk_family = AF_INET6;
  1132			if (sizeof(struct ipv6hdr) <= skb_headlen(skb)) {
  1133				sk->sk_v6_rcv_saddr = ipv6_hdr(skb)->saddr;
  1134				sk->sk_v6_daddr = ipv6_hdr(skb)->daddr;
  1135			}
  1136			break;
  1137	#endif
  1138		default:
  1139			break;
  1140		}
  1141	
  1142		if (is_l2)
  1143			__skb_push(skb, hh_len);
  1144		if (is_direct_pkt_access)
  1145			bpf_compute_data_pointers(skb);
  1146	
  1147		ret = convert___skb_to_skb(skb, ctx);
  1148		if (ret)
  1149			goto out;
  1150	
  1151		if (kattr->test.flags & BPF_F_TEST_SKB_CHECKSUM_COMPLETE) {
  1152			const int off = skb_network_offset(skb);
  1153			int len = skb->len - off;
  1154	
  1155			skb->csum = skb_checksum(skb, off, len, 0);
  1156			skb->ip_summed = CHECKSUM_COMPLETE;
  1157		}
  1158	
  1159		if (prog->type == BPF_PROG_TYPE_LWT_XMIT) {
  1160			bpf_test_run_lwt_xmit_dst.dev = dev;
  1161			skb_dst_set(skb, &bpf_test_run_lwt_xmit_dst);
  1162		}
  1163		ret = bpf_test_run(prog, skb, repeat, &retval, &duration, false);
  1164		if (prog->type == BPF_PROG_TYPE_LWT_XMIT)
  1165			skb_dst_set(skb, NULL);
  1166		if (ret)
  1167			goto out;
  1168		if (!is_l2) {
  1169			if (skb_headroom(skb) < hh_len) {
  1170				int nhead = HH_DATA_ALIGN(hh_len - skb_headroom(skb));
  1171	
  1172				if (pskb_expand_head(skb, nhead, 0, GFP_USER)) {
  1173					ret = -ENOMEM;
  1174					goto out;
  1175				}
  1176			}
  1177			memset(__skb_push(skb, hh_len), 0, hh_len);
  1178		}
  1179	
  1180		if (kattr->test.flags & BPF_F_TEST_SKB_CHECKSUM_COMPLETE) {
  1181			const int off = skb_network_offset(skb);
  1182			int len = skb->len - off;
  1183			__wsum csum;
  1184	
  1185			csum = skb_checksum(skb, off, len, 0);
  1186	
  1187			if (csum_fold(skb->csum) != csum_fold(csum)) {
  1188				ret = -EBADMSG;
  1189				goto out;
  1190			}
  1191		}
  1192	
  1193		convert_skb_to___skb(skb, ctx);
  1194	
  1195		if (skb_is_nonlinear(skb))
  1196			/* bpf program can never convert linear skb to non-linear */
  1197			WARN_ON_ONCE(linear_sz == kattr->test.data_size_in);
  1198		ret = bpf_test_finish(kattr, uattr, skb->data, skb_shinfo(skb), skb->len,
  1199				      skb->data_len, retval, duration);
  1200		if (!ret)
  1201			ret = bpf_ctx_finish(kattr, uattr, ctx,
  1202					     sizeof(struct __sk_buff));
  1203	out:
  1204		if (dev && dev != net->loopback_dev)
  1205			dev_put(dev);
  1206		kfree_skb(skb);
  1207		kfree(data);
  1208		if (sk)
  1209			sk_free(sk);
  1210		kfree(ctx);
  1211		return ret;
  1212	}
  1213	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
[syzbot ci] Re: bpf: test_run: Fix the null pointer dereference issue in bpf_lwt_xmit_push_encap
Posted by syzbot ci 1 day, 19 hours ago
syzbot ci has tested the following series

[v2] bpf: test_run: Fix the null pointer dereference issue in bpf_lwt_xmit_push_encap
https://lore.kernel.org/all/20260205092227.126665-1-yangfeng59949@163.com
* [PATCH v2] bpf: test_run: Fix the null pointer dereference issue in bpf_lwt_xmit_push_encap

and found the following issues:
* WARNING in skb_dst_set
* general protection fault in percpu_counter_add_batch
* general protection fault in tnl_update_pmtu
* general protection fault in xfrm_lookup_with_ifid

Full report is available here:
https://ci.syzbot.org/series/c278e614-0520-4be1-8e1b-b6ed06beb3cd

***

WARNING in skb_dst_set

tree:      bpf-next
URL:       https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git
base:      75cd3beb64d0977009e3d1a2d0c03715d3e5e156
arch:      amd64
compiler:  Debian clang version 21.1.8 (++20251221033036+2078da43e25a-1~exp1~20251221153213.50), Debian LLD 21.1.8
config:    https://ci.syzbot.org/builds/8d5f34b6-d9df-4c4a-9d51-7f4f910f379a/config
C repro:   https://ci.syzbot.org/findings/9f4f73a7-44d6-4d8b-8fed-818bb8ca054d/c_repro
syz repro: https://ci.syzbot.org/findings/9f4f73a7-44d6-4d8b-8fed-818bb8ca054d/syz_repro

------------[ cut here ]------------
(skb->_skb_refdst & ~(1UL)) && !(skb->_skb_refdst & 1UL)
WARNING: ./include/linux/skbuff.h:1171 at skb_dst_check_unset include/linux/skbuff.h:1170 [inline], CPU#1: syz.0.17/5978
WARNING: ./include/linux/skbuff.h:1171 at skb_dst_set+0xfd/0x140 include/linux/skbuff.h:1217, CPU#1: syz.0.17/5978
Modules linked in:
CPU: 1 UID: 0 PID: 5978 Comm: syz.0.17 Not tainted syzkaller #0 PREEMPT(full) 
Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.2-debian-1.16.2-1 04/01/2014
RIP: 0010:skb_dst_check_unset include/linux/skbuff.h:1170 [inline]
RIP: 0010:skb_dst_set+0xfd/0x140 include/linux/skbuff.h:1217
Code: 2d 00 00 74 08 4c 89 f7 e8 80 13 98 f8 49 89 1e 48 83 c4 08 5b 41 5c 41 5d 41 5e 41 5f 5d c3 cc cc cc cc cc e8 64 5c 30 f8 90 <0f> 0b 90 e9 6d ff ff ff 44 89 e1 80 e1 07 38 c1 7c 8f be 04 00 00
RSP: 0018:ffffc90005367b58 EFLAGS: 00010293
RAX: ffffffff89923bbc RBX: dffffc0000000001 RCX: ffff8881037d8000
RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000000
RBP: 1ffff1102edaad5b R08: ffffffff8fced777 R09: 1ffffffff1f9daee
R10: dffffc0000000000 R11: ffffffff817422b0 R12: 0000000000000000
R13: ffff888176d56b01 R14: ffff888176d56ad8 R15: ffff888176d56a80
FS:  0000555564e8a500(0000) GS:ffff8882a9928000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 0000001b2fe63fff CR3: 000000016852c000 CR4: 00000000000006f0
Call Trace:
 <TASK>
 bpf_prog_test_run_skb+0xe46/0x1ea0 net/bpf/test_run.c:1166
 bpf_prog_test_run+0x2c7/0x340 kernel/bpf/syscall.c:4714
 __sys_bpf+0x643/0x950 kernel/bpf/syscall.c:6236
 __do_sys_bpf kernel/bpf/syscall.c:6331 [inline]
 __se_sys_bpf kernel/bpf/syscall.c:6329 [inline]
 __x64_sys_bpf+0x7c/0x90 kernel/bpf/syscall.c:6329
 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline]
 do_syscall_64+0xe2/0xf80 arch/x86/entry/syscall_64.c:94
 entry_SYSCALL_64_after_hwframe+0x77/0x7f
RIP: 0033:0x7f51a119acb9
Code: ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 e8 ff ff ff f7 d8 64 89 01 48
RSP: 002b:00007fff3a40e428 EFLAGS: 00000246 ORIG_RAX: 0000000000000141
RAX: ffffffffffffffda RBX: 00007f51a1415fa0 RCX: 00007f51a119acb9
RDX: 0000000000000050 RSI: 00002000000003c0 RDI: 000000000000000a
RBP: 00007f51a1208bf7 R08: 0000000000000000 R09: 0000000000000000
R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000
R13: 00007f51a1415fac R14: 00007f51a1415fa0 R15: 00007f51a1415fa0
 </TASK>


***

general protection fault in percpu_counter_add_batch

tree:      bpf-next
URL:       https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git
base:      75cd3beb64d0977009e3d1a2d0c03715d3e5e156
arch:      amd64
compiler:  Debian clang version 21.1.8 (++20251221033036+2078da43e25a-1~exp1~20251221153213.50), Debian LLD 21.1.8
config:    https://ci.syzbot.org/builds/8d5f34b6-d9df-4c4a-9d51-7f4f910f379a/config
C repro:   https://ci.syzbot.org/findings/f58ed194-db04-464a-95de-a6d6cc45527a/c_repro
syz repro: https://ci.syzbot.org/findings/f58ed194-db04-464a-95de-a6d6cc45527a/syz_repro

Oops: general protection fault, probably for non-canonical address 0xdffffc000000001b: 0000 [#1] SMP KASAN PTI
KASAN: null-ptr-deref in range [0x00000000000000d8-0x00000000000000df]
CPU: 1 UID: 0 PID: 5976 Comm: syz.0.17 Not tainted syzkaller #0 PREEMPT(full) 
Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.2-debian-1.16.2-1 04/01/2014
RIP: 0010:percpu_counter_add_batch+0x3e/0x1d0 lib/percpu_counter.c:98
Code: d4 49 89 f5 48 89 fb 49 bf 00 00 00 00 00 fc ff df e8 e6 76 f2 fc 48 89 5c 24 10 4c 8d 73 58 4c 89 f0 48 c1 e8 03 48 89 04 24 <42> 80 3c 38 00 74 08 4c 89 f7 e8 d3 2c 5a fd 49 8b 06 65 8b 28 41
RSP: 0018:ffffc90003b37778 EFLAGS: 00010206
RAX: 000000000000001b RBX: 0000000000000080 RCX: ffff888115b8ba80
RDX: 0000000000000000 RSI: ffffffffffffffff RDI: 0000000000000080
RBP: 0000000000000000 R08: 0000000000000003 R09: 0000000000000004
R10: dffffc0000000000 R11: fffff52000766ee4 R12: 0000000000000020
R13: ffffffffffffffff R14: 00000000000000d8 R15: dffffc0000000000
FS:  000055555baf2500(0000) GS:ffff8882a9928000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00007ffc74af2e38 CR3: 0000000115cec000 CR4: 00000000000006f0
Call Trace:
 <TASK>
 dst_entries_add include/net/dst_ops.h:59 [inline]
 dst_count_dec net/core/dst.c:162 [inline]
 dst_release+0x126/0x1b0 net/core/dst.c:176
 refdst_drop include/net/dst.h:266 [inline]
 skb_dst_drop include/net/dst.h:278 [inline]
 ____bpf_skb_set_tunnel_key net/core/filter.c:4867 [inline]
 bpf_skb_set_tunnel_key+0x239/0xa30 net/core/filter.c:4835
 bpf_prog_adb554717e5d6596+0x4f/0x5c
 bpf_dispatcher_nop_func include/linux/bpf.h:1402 [inline]
 __bpf_prog_run include/linux/filter.h:723 [inline]
 bpf_prog_run include/linux/filter.h:730 [inline]
 bpf_test_run+0x354/0x830 net/bpf/test_run.c:423
 bpf_prog_test_run_skb+0xe02/0x1ea0 net/bpf/test_run.c:1164
 bpf_prog_test_run+0x2c7/0x340 kernel/bpf/syscall.c:4714
 __sys_bpf+0x643/0x950 kernel/bpf/syscall.c:6236
 __do_sys_bpf kernel/bpf/syscall.c:6331 [inline]
 __se_sys_bpf kernel/bpf/syscall.c:6329 [inline]
 __x64_sys_bpf+0x7c/0x90 kernel/bpf/syscall.c:6329
 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline]
 do_syscall_64+0xe2/0xf80 arch/x86/entry/syscall_64.c:94
 entry_SYSCALL_64_after_hwframe+0x77/0x7f
RIP: 0033:0x7fca1679acb9
Code: ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 e8 ff ff ff f7 d8 64 89 01 48
RSP: 002b:00007ffdef1739c8 EFLAGS: 00000246 ORIG_RAX: 0000000000000141
RAX: ffffffffffffffda RBX: 00007fca16a15fa0 RCX: 00007fca1679acb9
RDX: 0000000000000050 RSI: 0000200000000d80 RDI: 000000000000000a
RBP: 00007fca16808bf7 R08: 0000000000000000 R09: 0000000000000000
R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000
R13: 00007fca16a15fac R14: 00007fca16a15fa0 R15: 00007fca16a15fa0
 </TASK>
Modules linked in:
---[ end trace 0000000000000000 ]---
RIP: 0010:percpu_counter_add_batch+0x3e/0x1d0 lib/percpu_counter.c:98
Code: d4 49 89 f5 48 89 fb 49 bf 00 00 00 00 00 fc ff df e8 e6 76 f2 fc 48 89 5c 24 10 4c 8d 73 58 4c 89 f0 48 c1 e8 03 48 89 04 24 <42> 80 3c 38 00 74 08 4c 89 f7 e8 d3 2c 5a fd 49 8b 06 65 8b 28 41
RSP: 0018:ffffc90003b37778 EFLAGS: 00010206
RAX: 000000000000001b RBX: 0000000000000080 RCX: ffff888115b8ba80
RDX: 0000000000000000 RSI: ffffffffffffffff RDI: 0000000000000080
RBP: 0000000000000000 R08: 0000000000000003 R09: 0000000000000004
R10: dffffc0000000000 R11: fffff52000766ee4 R12: 0000000000000020
R13: ffffffffffffffff R14: 00000000000000d8 R15: dffffc0000000000
FS:  000055555baf2500(0000) GS:ffff8882a9928000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00007ffc74af2e38 CR3: 0000000115cec000 CR4: 00000000000006f0
----------------
Code disassembly (best guess), 1 bytes skipped:
   0:	49 89 f5             	mov    %rsi,%r13
   3:	48 89 fb             	mov    %rdi,%rbx
   6:	49 bf 00 00 00 00 00 	movabs $0xdffffc0000000000,%r15
   d:	fc ff df
  10:	e8 e6 76 f2 fc       	call   0xfcf276fb
  15:	48 89 5c 24 10       	mov    %rbx,0x10(%rsp)
  1a:	4c 8d 73 58          	lea    0x58(%rbx),%r14
  1e:	4c 89 f0             	mov    %r14,%rax
  21:	48 c1 e8 03          	shr    $0x3,%rax
  25:	48 89 04 24          	mov    %rax,(%rsp)
* 29:	42 80 3c 38 00       	cmpb   $0x0,(%rax,%r15,1) <-- trapping instruction
  2e:	74 08                	je     0x38
  30:	4c 89 f7             	mov    %r14,%rdi
  33:	e8 d3 2c 5a fd       	call   0xfd5a2d0b
  38:	49 8b 06             	mov    (%r14),%rax
  3b:	65 8b 28             	mov    %gs:(%rax),%ebp
  3e:	41                   	rex.B


***

general protection fault in tnl_update_pmtu

tree:      bpf-next
URL:       https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git
base:      75cd3beb64d0977009e3d1a2d0c03715d3e5e156
arch:      amd64
compiler:  Debian clang version 21.1.8 (++20251221033036+2078da43e25a-1~exp1~20251221153213.50), Debian LLD 21.1.8
config:    https://ci.syzbot.org/builds/8d5f34b6-d9df-4c4a-9d51-7f4f910f379a/config
C repro:   https://ci.syzbot.org/findings/2b87e46f-6cd5-4189-a1f4-896ea63e96a0/c_repro
syz repro: https://ci.syzbot.org/findings/2b87e46f-6cd5-4189-a1f4-896ea63e96a0/syz_repro

Oops: general protection fault, probably for non-canonical address 0xdffffc000000000a: 0000 [#1] SMP KASAN PTI
KASAN: null-ptr-deref in range [0x0000000000000050-0x0000000000000057]
CPU: 0 UID: 0 PID: 5994 Comm: syz.0.17 Not tainted syzkaller #0 PREEMPT(full) 
Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.2-debian-1.16.2-1 04/01/2014
RIP: 0010:skb_dst_update_pmtu_no_confirm include/net/dst.h:565 [inline]
RIP: 0010:tnl_update_pmtu+0x52b/0x1190 net/ipv4/ip_tunnel.c:533
Code: c1 e8 03 42 80 3c 38 00 74 08 48 89 df e8 0d 3a 2a f8 4c 8b 3b 49 83 c7 50 4c 89 f8 48 c1 e8 03 48 b9 00 00 00 00 00 fc ff df <80> 3c 08 00 74 08 4c 89 ff e8 e7 39 2a f8 4d 8b 3f 4d 85 ff 8b 5c
RSP: 0018:ffffc90004ef6f68 EFLAGS: 00010206
RAX: 000000000000000a RBX: ffffffff9a2dcec8 RCX: dffffc0000000000
RDX: 0000000000000000 RSI: ffffffff9a2dcec0 RDI: 0000000000000000
RBP: ffffffff9a2dcec0 R08: ffffffff89db11f3 R09: ffffffff8e35a3a0
R10: ffffc90004ef6f20 R11: fffff520009dede6 R12: ffff888112583800
R13: ffff888112583858 R14: 1ffff110224b070b R15: 0000000000000050
FS:  000055557643a500(0000) GS:ffff88818e328000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 0000001b30363fff CR3: 00000001744e0000 CR4: 00000000000006f0
Call Trace:
 <TASK>
 ip_tunnel_xmit+0xd36/0x2430 net/ipv4/ip_tunnel.c:805
 __gre_xmit net/ipv4/ip_gre.c:490 [inline]
 ipgre_xmit+0x8e6/0xc60 net/ipv4/ip_gre.c:694
 __netdev_start_xmit include/linux/netdevice.h:5273 [inline]
 netdev_start_xmit include/linux/netdevice.h:5282 [inline]
 xmit_one net/core/dev.c:3853 [inline]
 dev_hard_start_xmit+0x2cd/0x7f0 net/core/dev.c:3869
 __dev_queue_xmit+0x14dd/0x32a0 net/core/dev.c:4819
 dev_queue_xmit include/linux/netdevice.h:3381 [inline]
 __bpf_tx_skb+0x18e/0x260 net/core/filter.c:2153
 ____bpf_clone_redirect net/core/filter.c:2487 [inline]
 bpf_clone_redirect+0x313/0x4b0 net/core/filter.c:2450
 bpf_prog_885767c90d177146+0x62/0x6b
 bpf_dispatcher_nop_func include/linux/bpf.h:1402 [inline]
 __bpf_prog_run include/linux/filter.h:723 [inline]
 bpf_prog_run include/linux/filter.h:730 [inline]
 bpf_test_run+0x354/0x830 net/bpf/test_run.c:423
 bpf_prog_test_run_skb+0xe02/0x1ea0 net/bpf/test_run.c:1164
 bpf_prog_test_run+0x2c7/0x340 kernel/bpf/syscall.c:4714
 __sys_bpf+0x643/0x950 kernel/bpf/syscall.c:6236
 __do_sys_bpf kernel/bpf/syscall.c:6331 [inline]
 __se_sys_bpf kernel/bpf/syscall.c:6329 [inline]
 __x64_sys_bpf+0x7c/0x90 kernel/bpf/syscall.c:6329
 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline]
 do_syscall_64+0xe2/0xf80 arch/x86/entry/syscall_64.c:94
 entry_SYSCALL_64_after_hwframe+0x77/0x7f
RIP: 0033:0x7fad0c59acb9
Code: ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 e8 ff ff ff f7 d8 64 89 01 48
RSP: 002b:00007ffe97cab158 EFLAGS: 00000246 ORIG_RAX: 0000000000000141
RAX: ffffffffffffffda RBX: 00007fad0c815fa0 RCX: 00007fad0c59acb9
RDX: 0000000000000028 RSI: 0000200000000080 RDI: 000000000000000a
RBP: 00007fad0c608bf7 R08: 0000000000000000 R09: 0000000000000000
R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000
R13: 00007fad0c815fac R14: 00007fad0c815fa0 R15: 00007fad0c815fa0
 </TASK>
Modules linked in:
---[ end trace 0000000000000000 ]---
RIP: 0010:skb_dst_update_pmtu_no_confirm include/net/dst.h:565 [inline]
RIP: 0010:tnl_update_pmtu+0x52b/0x1190 net/ipv4/ip_tunnel.c:533
Code: c1 e8 03 42 80 3c 38 00 74 08 48 89 df e8 0d 3a 2a f8 4c 8b 3b 49 83 c7 50 4c 89 f8 48 c1 e8 03 48 b9 00 00 00 00 00 fc ff df <80> 3c 08 00 74 08 4c 89 ff e8 e7 39 2a f8 4d 8b 3f 4d 85 ff 8b 5c
RSP: 0018:ffffc90004ef6f68 EFLAGS: 00010206
RAX: 000000000000000a RBX: ffffffff9a2dcec8 RCX: dffffc0000000000
RDX: 0000000000000000 RSI: ffffffff9a2dcec0 RDI: 0000000000000000
RBP: ffffffff9a2dcec0 R08: ffffffff89db11f3 R09: ffffffff8e35a3a0
R10: ffffc90004ef6f20 R11: fffff520009dede6 R12: ffff888112583800
R13: ffff888112583858 R14: 1ffff110224b070b R15: 0000000000000050
FS:  000055557643a500(0000) GS:ffff88818e328000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 0000001b30363fff CR3: 00000001744e0000 CR4: 00000000000006f0
----------------
Code disassembly (best guess):
   0:	c1 e8 03             	shr    $0x3,%eax
   3:	42 80 3c 38 00       	cmpb   $0x0,(%rax,%r15,1)
   8:	74 08                	je     0x12
   a:	48 89 df             	mov    %rbx,%rdi
   d:	e8 0d 3a 2a f8       	call   0xf82a3a1f
  12:	4c 8b 3b             	mov    (%rbx),%r15
  15:	49 83 c7 50          	add    $0x50,%r15
  19:	4c 89 f8             	mov    %r15,%rax
  1c:	48 c1 e8 03          	shr    $0x3,%rax
  20:	48 b9 00 00 00 00 00 	movabs $0xdffffc0000000000,%rcx
  27:	fc ff df
* 2a:	80 3c 08 00          	cmpb   $0x0,(%rax,%rcx,1) <-- trapping instruction
  2e:	74 08                	je     0x38
  30:	4c 89 ff             	mov    %r15,%rdi
  33:	e8 e7 39 2a f8       	call   0xf82a3a1f
  38:	4d 8b 3f             	mov    (%r15),%r15
  3b:	4d 85 ff             	test   %r15,%r15
  3e:	8b                   	.byte 0x8b
  3f:	5c                   	pop    %rsp


***

general protection fault in xfrm_lookup_with_ifid

tree:      bpf-next
URL:       https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git
base:      75cd3beb64d0977009e3d1a2d0c03715d3e5e156
arch:      amd64
compiler:  Debian clang version 21.1.8 (++20251221033036+2078da43e25a-1~exp1~20251221153213.50), Debian LLD 21.1.8
config:    https://ci.syzbot.org/builds/8d5f34b6-d9df-4c4a-9d51-7f4f910f379a/config
C repro:   https://ci.syzbot.org/findings/5c4a2d70-b003-439e-8039-496b9009f1e9/c_repro
syz repro: https://ci.syzbot.org/findings/5c4a2d70-b003-439e-8039-496b9009f1e9/syz_repro

Oops: general protection fault, probably for non-canonical address 0xdffffc0000000000: 0000 [#1] SMP KASAN PTI
KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007]
CPU: 0 UID: 0 PID: 5985 Comm: syz.0.17 Not tainted syzkaller #0 PREEMPT(full) 
Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.2-debian-1.16.2-1 04/01/2014
RIP: 0010:xfrm_lookup_with_ifid+0xe1/0x1af0 net/xfrm/xfrm_policy.c:3181
Code: 24 20 4d 8d 66 08 4c 89 e0 48 c1 e8 03 4d 89 ee 42 80 3c 28 00 74 08 4c 89 e7 e8 ba 20 17 f8 4d 8b 24 24 4c 89 e0 48 c1 e8 03 <42> 0f b6 04 30 84 c0 0f 85 94 17 00 00 41 0f b7 04 24 89 44 24 28
RSP: 0018:ffffc90003e96fe0 EFLAGS: 00010246
RAX: 0000000000000000 RBX: ffffc90003e97080 RCX: 0000000000000000
RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffffc90003e97090
RBP: ffffc90003e970f8 R08: ffffc90003e9708f R09: 0000000000000000
R10: ffffc90003e97080 R11: fffff520007d2e12 R12: 0000000000000000
R13: dffffc0000000000 R14: dffffc0000000000 R15: 0000000000000000
FS:  000055558c0ab500(0000) GS:ffff88818e328000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 0000001b30363fff CR3: 00000001b9fc8000 CR4: 00000000000006f0
Call Trace:
 <TASK>
 xfrm_lookup net/xfrm/xfrm_policy.c:3336 [inline]
 xfrm_lookup_route+0x3c/0x1c0 net/xfrm/xfrm_policy.c:3347
 vti_xmit net/ipv4/ip_vti.c:217 [inline]
 vti_tunnel_xmit+0x48e/0x18f0 net/ipv4/ip_vti.c:307
 __netdev_start_xmit include/linux/netdevice.h:5273 [inline]
 netdev_start_xmit include/linux/netdevice.h:5282 [inline]
 xmit_one net/core/dev.c:3853 [inline]
 dev_hard_start_xmit+0x2cd/0x7f0 net/core/dev.c:3869
 __dev_queue_xmit+0x14dd/0x32a0 net/core/dev.c:4819
 dev_queue_xmit include/linux/netdevice.h:3381 [inline]
 __bpf_tx_skb+0x18e/0x260 net/core/filter.c:2153
 ____bpf_clone_redirect net/core/filter.c:2487 [inline]
 bpf_clone_redirect+0x313/0x4b0 net/core/filter.c:2450
 bpf_prog_e16758452f539c38+0x5f/0x68
 bpf_dispatcher_nop_func include/linux/bpf.h:1402 [inline]
 __bpf_prog_run include/linux/filter.h:723 [inline]
 bpf_prog_run include/linux/filter.h:730 [inline]
 bpf_test_run+0x354/0x830 net/bpf/test_run.c:423
 bpf_prog_test_run_skb+0xe02/0x1ea0 net/bpf/test_run.c:1164
 bpf_prog_test_run+0x2c7/0x340 kernel/bpf/syscall.c:4714
 __sys_bpf+0x643/0x950 kernel/bpf/syscall.c:6236
 __do_sys_bpf kernel/bpf/syscall.c:6331 [inline]
 __se_sys_bpf kernel/bpf/syscall.c:6329 [inline]
 __x64_sys_bpf+0x7c/0x90 kernel/bpf/syscall.c:6329
 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline]
 do_syscall_64+0xe2/0xf80 arch/x86/entry/syscall_64.c:94
 entry_SYSCALL_64_after_hwframe+0x77/0x7f
RIP: 0033:0x7fe30af9acb9
Code: ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 e8 ff ff ff f7 d8 64 89 01 48
RSP: 002b:00007fffa3d1a918 EFLAGS: 00000246 ORIG_RAX: 0000000000000141
RAX: ffffffffffffffda RBX: 00007fe30b215fa0 RCX: 00007fe30af9acb9
RDX: 000000000000002c RSI: 0000200000000080 RDI: 000000000000000a
RBP: 00007fe30b008bf7 R08: 0000000000000000 R09: 0000000000000000
R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000
R13: 00007fe30b215fac R14: 00007fe30b215fa0 R15: 00007fe30b215fa0
 </TASK>
Modules linked in:
---[ end trace 0000000000000000 ]---
RIP: 0010:xfrm_lookup_with_ifid+0xe1/0x1af0 net/xfrm/xfrm_policy.c:3181
Code: 24 20 4d 8d 66 08 4c 89 e0 48 c1 e8 03 4d 89 ee 42 80 3c 28 00 74 08 4c 89 e7 e8 ba 20 17 f8 4d 8b 24 24 4c 89 e0 48 c1 e8 03 <42> 0f b6 04 30 84 c0 0f 85 94 17 00 00 41 0f b7 04 24 89 44 24 28
RSP: 0018:ffffc90003e96fe0 EFLAGS: 00010246
RAX: 0000000000000000 RBX: ffffc90003e97080 RCX: 0000000000000000
RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffffc90003e97090
RBP: ffffc90003e970f8 R08: ffffc90003e9708f R09: 0000000000000000
R10: ffffc90003e97080 R11: fffff520007d2e12 R12: 0000000000000000
R13: dffffc0000000000 R14: dffffc0000000000 R15: 0000000000000000
FS:  000055558c0ab500(0000) GS:ffff88818e328000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 0000001b30363fff CR3: 00000001b9fc8000 CR4: 00000000000006f0
----------------
Code disassembly (best guess):
   0:	24 20                	and    $0x20,%al
   2:	4d 8d 66 08          	lea    0x8(%r14),%r12
   6:	4c 89 e0             	mov    %r12,%rax
   9:	48 c1 e8 03          	shr    $0x3,%rax
   d:	4d 89 ee             	mov    %r13,%r14
  10:	42 80 3c 28 00       	cmpb   $0x0,(%rax,%r13,1)
  15:	74 08                	je     0x1f
  17:	4c 89 e7             	mov    %r12,%rdi
  1a:	e8 ba 20 17 f8       	call   0xf81720d9
  1f:	4d 8b 24 24          	mov    (%r12),%r12
  23:	4c 89 e0             	mov    %r12,%rax
  26:	48 c1 e8 03          	shr    $0x3,%rax
* 2a:	42 0f b6 04 30       	movzbl (%rax,%r14,1),%eax <-- trapping instruction
  2f:	84 c0                	test   %al,%al
  31:	0f 85 94 17 00 00    	jne    0x17cb
  37:	41 0f b7 04 24       	movzwl (%r12),%eax
  3c:	89 44 24 28          	mov    %eax,0x28(%rsp)


***

If these findings have caused you to resend the series or submit a
separate fix, please add the following tag to your commit message:
  Tested-by: syzbot@syzkaller.appspotmail.com

---
This report is generated by a bot. It may contain errors.
syzbot ci engineers can be reached at syzkaller@googlegroups.com.
Re: [PATCH v2] bpf: test_run: Fix the null pointer dereference issue in bpf_lwt_xmit_push_encap
Posted by bot+bpf-ci@kernel.org 2 days, 1 hour ago
> diff --git a/net/bpf/test_run.c b/net/bpf/test_run.c
> index 178c4738e..c05b31cd1 100644
> --- a/net/bpf/test_run.c
> +++ b/net/bpf/test_run.c
> @@ -982,6 +982,7 @@ static struct proto bpf_dummy_proto = {
>  	.obj_size = sizeof(struct sock),
>  };
>
> +struct dst_entry bpf_test_run_lwt_xmit_dst;

The bpf_test_run_lwt_xmit_dst is a global variable shared by all callers of
bpf_prog_test_run_skb(). If two processes concurrently run LWT_XMIT tests,
could this race?

Process A:
    bpf_test_run_lwt_xmit_dst.dev = dev_A;
    skb_dst_set(skb_A, &bpf_test_run_lwt_xmit_dst);

Process B preempts and runs:
    bpf_test_run_lwt_xmit_dst.dev = dev_B;
    skb_dst_set(skb_B, &bpf_test_run_lwt_xmit_dst);

Now Process A resumes but skb_A's dst_entry has dev_B instead of dev_A.
This could lead to wrong headroom calculation in bpf_lwt_push_ip_encap()
via LL_RESERVED_SPACE(skb_dst(skb)->dev).

Would a per-cpu variable or allocating the dst_entry locally avoid this
race condition?

>  int bpf_prog_test_run_skb(struct bpf_prog *prog, const union bpf_attr *kattr,
>  			  union bpf_attr __user *uattr)
>  {

[ ... ]

> @@ -1156,7 +1157,13 @@ int bpf_prog_test_run_skb(struct bpf_prog *prog, const union bpf_attr *kattr,
>  		skb->ip_summed = CHECKSUM_COMPLETE;
>  	}
>
> +	if (prog->type == BPF_PROG_TYPE_LWT_XMIT) {
> +		bpf_test_run_lwt_xmit_dst.dev = dev;
> +		skb_dst_set(skb, &bpf_test_run_lwt_xmit_dst);
> +	}
>  	ret = bpf_test_run(prog, skb, repeat, &retval, &duration, false);
> +	if (prog->type == BPF_PROG_TYPE_LWT_XMIT)
> +		skb_dst_set(skb, NULL);

The skb_dst_set() documentation states: "Sets skb dst, assuming a reference
was taken on dst and should be released by skb_dst_drop()". The global
bpf_test_run_lwt_xmit_dst isn't reference counted and wasn't initialized via
dst_init().

When skb_dst_set(skb, NULL) is called, skb_dst_check_unset() will trigger
DEBUG_NET_WARN_ON_ONCE because the dst was set without the SKB_DST_NOREF bit.

Is this the intended behavior, or should skb_dst_set_noref() be used instead
(which would require holding rcu_read_lock)?


---
AI reviewed your patch. Please fix the bug or email reply why it's not a bug.
See: https://github.com/kernel-patches/vmtest/blob/master/ci/claude/README.md

CI run summary: https://github.com/kernel-patches/bpf/actions/runs/21706325881

AI-authorship-score: low
AI-authorship-explanation: The commit shows characteristics of human-authored code including real bug reporters, kernel crash stack trace from actual testing, and the self-aware comment Temporarily indicating the author knows this is not an ideal fix.
issues-found: 1
issue-severity-score: low
issue-severity-explanation: Race condition on global dst_entry when concurrent LWT_XMIT tests run, could cause wrong headroom calculation but unlikely to cause crashes in typical usage scenarios.