]> git.baikalelectronics.ru Git - kernel.git/commitdiff
bpf: Move skb->len == 0 checks into __bpf_redirect
authorStanislav Fomichev <sdf@google.com>
Mon, 21 Nov 2022 18:03:39 +0000 (10:03 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 18 Jan 2023 10:41:04 +0000 (11:41 +0100)
[ Upstream commit 114039b342014680911c35bd6b72624180fd669a ]

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: 214de3de5b08 ("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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/bpf/test_run.c
net/core/filter.c

index d78c4cc30a2883a748bfeff5068f02423512810a..591d146a53084164ac1a9cc0d62ee5389deab243 100644 (file)
@@ -201,9 +201,6 @@ static int convert___skb_to_skb(struct sk_buff *skb, struct __sk_buff *__skb)
 {
        struct qdisc_skb_cb *cb = (struct qdisc_skb_cb *)skb->cb;
 
-       if (!skb->len)
-               return -EINVAL;
-
        if (!__skb)
                return 0;
 
index e81f7772161a928859051f29871fc331dfab9b1c..6fd9173e18b7ec6ce14231b38d02004d4af94911 100644 (file)
@@ -2071,6 +2071,11 @@ static int __bpf_redirect_no_mac(struct sk_buff *skb, struct net_device *dev,
 {
        unsigned int mlen = skb_network_offset(skb);
 
+       if (unlikely(skb->len <= mlen)) {
+               kfree_skb(skb);
+               return -ERANGE;
+       }
+
        if (mlen) {
                __skb_pull(skb, mlen);
 
@@ -2092,7 +2097,7 @@ static int __bpf_redirect_common(struct sk_buff *skb, struct net_device *dev,
                                 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;
        }