diff options
author | 2020-08-15 04:44:31 -0400 | |
---|---|---|
committer | 2020-08-16 15:33:49 -0700 | |
commit | 55eff0eb7460c3d50716ed9eccf22257b046ca92 (patch) | |
tree | c75b285de0dca2367dbe68eee0252ea49ed24eb7 | |
parent | net: xdp: pull ethernet header off packet after computing skb->protocol (diff) | |
download | linux-55eff0eb7460c3d50716ed9eccf22257b046ca92.tar.gz linux-55eff0eb7460c3d50716ed9eccf22257b046ca92.tar.bz2 linux-55eff0eb7460c3d50716ed9eccf22257b046ca92.zip |
net: Fix potential wrong skb->protocol in skb_vlan_untag()
We may access the two bytes after vlan_hdr in vlan_set_encap_proto(). So
we should pull VLAN_HLEN + sizeof(unsigned short) in skb_vlan_untag() or
we may access the wrong data.
Fixes: 0d5501c1c828 ("net: Always untag vlan-tagged traffic on input.")
Signed-off-by: Miaohe Lin <linmiaohe@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/core/skbuff.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 7e2e502ef519..5c3b906aeef3 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -5418,8 +5418,8 @@ struct sk_buff *skb_vlan_untag(struct sk_buff *skb) skb = skb_share_check(skb, GFP_ATOMIC); if (unlikely(!skb)) goto err_free; - - if (unlikely(!pskb_may_pull(skb, VLAN_HLEN))) + /* We may access the two bytes after vlan_hdr in vlan_set_encap_proto(). */ + if (unlikely(!pskb_may_pull(skb, VLAN_HLEN + sizeof(unsigned short)))) goto err_free; vhdr = (struct vlan_hdr *)skb->data; |