summaryrefslogtreecommitdiff
path: root/net/core
diff options
context:
space:
mode:
authorStanislav Fomichev <sdf@google.com>2022-11-21 10:03:39 -0800
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2022-12-31 13:14:11 +0100
commit0fc4280dbec36ab10d2f9b3be96d297d5243f2ca (patch)
treefcee20b0aaa71f7ec25733550b88a70d3679e318 /net/core
parent8dbcb4c284bcb198847b9f5fa56143dc9f3d8ffb (diff)
bpf: Move skb->len == 0 checks into __bpf_redirect
[ 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: 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> Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'net/core')
-rw-r--r--net/core/filter.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/net/core/filter.c b/net/core/filter.c
index fb5b9dbf3bc0..68b1509e6188 100644
--- a/net/core/filter.c
+++ b/net/core/filter.c
@@ -2123,6 +2123,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);
@@ -2144,7 +2149,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;
}