| From 9c2bb92eed62471fda4e235733db826ffe9009ee Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 23 Apr 2021 00:49:45 +0100 |
| Subject: net: geneve: modify IP header check in geneve6_xmit_skb and |
| geneve_xmit_skb |
| |
| From: Phillip Potter <phil@philpotter.co.uk> |
| |
| [ Upstream commit d13f048dd40e8577260cd43faea8ec9b77520197 ] |
| |
| Modify the header size check in geneve6_xmit_skb and geneve_xmit_skb |
| to use pskb_inet_may_pull rather than pskb_network_may_pull. This fixes |
| two kernel selftest failures introduced by the commit introducing the |
| checks: |
| IPv4 over geneve6: PMTU exceptions |
| IPv4 over geneve6: PMTU exceptions - nexthop objects |
| |
| It does this by correctly accounting for the fact that IPv4 packets may |
| transit over geneve IPv6 tunnels (and vice versa), and still fixes the |
| uninit-value bug fixed by the original commit. |
| |
| Reported-by: kernel test robot <oliver.sang@intel.com> |
| Fixes: 6628ddfec758 ("net: geneve: check skb is large enough for IPv4/IPv6 header") |
| Suggested-by: Sabrina Dubroca <sd@queasysnail.net> |
| Signed-off-by: Phillip Potter <phil@philpotter.co.uk> |
| Acked-by: Sabrina Dubroca <sd@queasysnail.net> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/geneve.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c |
| index 040edc6fc560..0d8eb4a1dc2f 100644 |
| --- a/drivers/net/geneve.c |
| +++ b/drivers/net/geneve.c |
| @@ -891,7 +891,7 @@ static int geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev, |
| __be16 sport; |
| int err; |
| |
| - if (!pskb_network_may_pull(skb, sizeof(struct iphdr))) |
| + if (!pskb_inet_may_pull(skb)) |
| return -EINVAL; |
| |
| sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true); |
| @@ -988,7 +988,7 @@ static int geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev, |
| __be16 sport; |
| int err; |
| |
| - if (!pskb_network_may_pull(skb, sizeof(struct ipv6hdr))) |
| + if (!pskb_inet_may_pull(skb)) |
| return -EINVAL; |
| |
| sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true); |
| -- |
| 2.30.2 |
| |