| From d9b54511307e46a8f144b20af88e9279966725f1 Mon Sep 17 00:00:00 2001 |
| From: Cong Wang <amwang@redhat.com> |
| Date: Sat, 29 Jun 2013 12:02:59 +0800 |
| Subject: gre: fix a regression in ioctl |
| |
| From: Cong Wang <amwang@redhat.com> |
| |
| [ Upstream commit 6c734fb8592f6768170e48e7102cb2f0a1bb9759 ] |
| |
| When testing GRE tunnel, I got: |
| |
| # ip tunnel show |
| get tunnel gre0 failed: Invalid argument |
| get tunnel gre1 failed: Invalid argument |
| |
| This is a regression introduced by commit c54419321455631079c7d |
| ("GRE: Refactor GRE tunneling code.") because previously we |
| only check the parameters for SIOCADDTUNNEL and SIOCCHGTUNNEL, |
| after that commit, the check is moved for all commands. |
| |
| So, just check for SIOCADDTUNNEL and SIOCCHGTUNNEL. |
| |
| After this patch I got: |
| |
| # ip tunnel show |
| gre0: gre/ip remote any local any ttl inherit nopmtudisc |
| gre1: gre/ip remote 192.168.122.101 local 192.168.122.45 ttl inherit |
| |
| Signed-off-by: Cong Wang <amwang@redhat.com> |
| Cc: Pravin B Shelar <pshelar@nicira.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/ipv4/ip_gre.c | 9 +++++---- |
| 1 file changed, 5 insertions(+), 4 deletions(-) |
| |
| --- a/net/ipv4/ip_gre.c |
| +++ b/net/ipv4/ip_gre.c |
| @@ -503,10 +503,11 @@ static int ipgre_tunnel_ioctl(struct net |
| |
| if (copy_from_user(&p, ifr->ifr_ifru.ifru_data, sizeof(p))) |
| return -EFAULT; |
| - if (p.iph.version != 4 || p.iph.protocol != IPPROTO_GRE || |
| - p.iph.ihl != 5 || (p.iph.frag_off&htons(~IP_DF)) || |
| - ((p.i_flags|p.o_flags)&(GRE_VERSION|GRE_ROUTING))) { |
| - return -EINVAL; |
| + if (cmd == SIOCADDTUNNEL || cmd == SIOCCHGTUNNEL) { |
| + if (p.iph.version != 4 || p.iph.protocol != IPPROTO_GRE || |
| + p.iph.ihl != 5 || (p.iph.frag_off&htons(~IP_DF)) || |
| + ((p.i_flags|p.o_flags)&(GRE_VERSION|GRE_ROUTING))) |
| + return -EINVAL; |
| } |
| p.i_flags = gre_flags_to_tnl_flags(p.i_flags); |
| p.o_flags = gre_flags_to_tnl_flags(p.o_flags); |