diff --git a/net/core/filter.c b/net/core/filter.c index cd3524cb3..6ab5561c6 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -17,6 +17,7 @@ * Kris Katterjohn - Added many additional checks in bpf_check_classic() */ +#include "linux/printk.h" #include #include #include @@ -2466,12 +2467,30 @@ BPF_CALL_3(bpf_clone_redirect, struct sk_buff *, skb, u32, ifindex, u64, flags) * here, we need to free the just generated clone to unclone once * again. */ - ret = bpf_try_make_head_writable(skb); + pr_info("DANIEL DEBUG Before try make: min %d max %d pkt %d", dev->min_header_len, dev->hard_header_len, skb->data_len); + pr_info("DANIEL DEBUG Before try make: data len %d", skb->data_len); + pr_info("DANIEL DEBUG Before try make: mac len %d mac header %p", skb_mac_header_len(skb), skb_mac_header(skb)); + pr_info("DANIEL DEBUG Before try make: network len %d network header %p", skb_network_header_len(skb), skb_network_header(skb)); + + ret = bpf_try_make_head_writable(skb); if (unlikely(ret)) { kfree_skb(clone); return -ENOMEM; } + pr_info("DANIEL DEBUG: min %d max %d pkt %d", dev->min_header_len, dev->hard_header_len, skb->data_len); + pr_info("DANIEL DEBUG: min %d max %d pkt %d", dev->min_header_len, dev->hard_header_len, skb->data_len); + pr_info("DANIEL DEBUG: data len %d", skb->data_len); + pr_info("DANIEL DEBUG: mac len %d mac header %p", skb_mac_header_len(skb), skb_mac_header(skb)); + pr_info("DANIEL DEBUG: network len %d network header %p", skb_network_header_len(skb), skb_network_header(skb)); + + int header_len = skb_headlen(skb); + if (unlikely(header_len < dev->min_header_len || + header_len > dev->hard_header_len)) { + kfree_skb(clone); + return -EINVAL; + } + return __bpf_redirect(clone, dev, flags); }