To avoid potentially breaking existing users.
Both mac/no-mac cases have to be amended; mac_header >= network_header
is not enough (verified with a new test, see next patch).
Fixes: fd1894224407 ("bpf: Don't redirect packets with invalid pkt_len")
Signed-off-by: Stanislav Fomichev <sdf@google.com>
Link: https://lore.kernel.org/r/20221121180340.1983627-1-sdf@google.com
Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
 {
        struct qdisc_skb_cb *cb = (struct qdisc_skb_cb *)skb->cb;
 
-       if (!skb->len)
-               return -EINVAL;
-
        if (!__skb)
                return 0;
 
 
 {
        unsigned int mlen = skb_network_offset(skb);
 
+       if (unlikely(skb->len <= mlen)) {
+               kfree_skb(skb);
+               return -ERANGE;
+       }
+
        if (mlen) {
                __skb_pull(skb, mlen);
-               if (unlikely(!skb->len)) {
-                       kfree_skb(skb);
-                       return -ERANGE;
-               }
 
                /* At ingress, the mac header has already been pulled once.
                 * At egress, skb_pospull_rcsum has to be done in case that
                                 u32 flags)
 {
        /* Verify that a link layer header is carried */
-       if (unlikely(skb->mac_header >= skb->network_header)) {
+       if (unlikely(skb->mac_header >= skb->network_header || skb->len == 0)) {
                kfree_skb(skb);
                return -ERANGE;
        }