diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index e9f100bd73d982f552238e341dc590b63527e35b..dbdb03ac557f967b3133c7870c5a7dd675d5d012 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -2077,6 +2077,14 @@ static inline void skb_set_tail_pointer(struct sk_buff *skb, const int offset) #endif /* NET_SKBUFF_DATA_USES_OFFSET */ +static inline void skb_assert_len(struct sk_buff *skb) +{ +#ifdef CONFIG_DEBUG_NET + if (WARN_ONCE(!skb->len, "%s\n", __func__)) + DO_ONCE_LITE(skb_dump, KERN_ERR, skb, false); +#endif /* CONFIG_DEBUG_NET */ +} + /* * Add data to an sk_buff */ diff --git a/net/bpf/test_run.c b/net/bpf/test_run.c index f4078830ea505ee955d4bc83010bd2fec59583fe..fba139c995aabe6772007bb053da93a97c74ffa8 100644 --- a/net/bpf/test_run.c +++ b/net/bpf/test_run.c @@ -144,6 +144,12 @@ int bpf_prog_test_run_skb(struct bpf_prog *prog, const union bpf_attr *kattr, __skb_push(skb, hh_len); if (is_direct_pkt_access) bpf_compute_data_pointers(skb); + + if (!skb->len) { + kfree_skb(skb); + return -EINVAL; + } + retval = bpf_test_run(prog, skb, repeat, &duration); if (!is_l2) { if (skb_headroom(skb) < hh_len) { diff --git a/net/core/dev.c b/net/core/dev.c index 5bc0e56216c9f0c2799c10c7a43a09dde847e142..078e8a231616f07407e3321f01657566708ade54 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -3775,6 +3775,7 @@ static int __dev_queue_xmit(struct sk_buff *skb, struct net_device *sb_dev) bool again = false; skb_reset_mac_header(skb); + skb_assert_len(skb); if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_SCHED_TSTAMP)) __skb_tstamp_tx(skb, NULL, skb->sk, SCM_TSTAMP_SCHED);