Skip to content

Commit

Permalink
bpf: Move skb->len == 0 checks into __bpf_redirect
Browse files Browse the repository at this point in the history
[ Upstream commit 114039b ]

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: fd18942 ("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>
  • Loading branch information
fomichev authored and gregkh committed Dec 31, 2022
1 parent 92f30b3 commit 21f15d8
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 4 deletions.
3 changes: 0 additions & 3 deletions net/bpf/test_run.c
Original file line number Diff line number Diff line change
Expand Up @@ -980,9 +980,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;

Expand Down
7 changes: 6 additions & 1 deletion net/core/filter.c
Original file line number Diff line number Diff line change
Expand Up @@ -2124,6 +2124,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);

Expand All @@ -2145,7 +2150,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;
}
Expand Down

0 comments on commit 21f15d8

Please sign in to comment.