Skip to contentSkip to conversation

ipip: fix a regression in ioctl

PATCH In review Cong Wang 2 participants 2 messages Jul 2, 2013

Subsystems (3)
lore
Share & tools
lore

Cong Wang

author
#0 lore raw

PATCH v2 1/1 ipip: fix a regression in ioctl

From: Cong Wang <[email protected]>

This is a regression introduced by
commit fd58156e456d9f68fe0448 (IPIP: Use ip-tunneling code.)

Similar to GRE tunnel, 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.

Also, the check for i_key, o_key etc. is suspicious too, which did not exist before, reset them before passing to ip_tunnel_ioctl().

Cc Pravin B Shelar <[email protected]>
Cc "David S. Miller" <[email protected]>

---
v2: reset *_key and *_flags before passing them to ip_tunnel_ioctl

 net/ipv4/ipip.c |   12 +++++++-----
 1 files changed, 7 insertions(+), 5 deletions(-)
net/ipv4/ipip.c +7 -5
index 77bfcce..7cfc456 100644
@@ -240,11 +240,13 @@ ipip_tunnel_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 	if (copy_from_user(&p, ifr->ifr_ifru.ifru_data, sizeof(p)))
 		return -EFAULT;
 
-	if (p.iph.version != 4 || p.iph.protocol != IPPROTO_IPIP ||
-			p.iph.ihl != 5 || (p.iph.frag_off&htons(~IP_DF)))
-		return -EINVAL;
-	if (p.i_key || p.o_key || p.i_flags || p.o_flags)
-		return -EINVAL;
+	if (cmd == SIOCADDTUNNEL || cmd == SIOCCHGTUNNEL) {
+		if (p.iph.version != 4 || p.iph.protocol != IPPROTO_IPIP ||
+		    p.iph.ihl != 5 || (p.iph.frag_off&htons(~IP_DF)))
+			return -EINVAL;
+	}
+
+	p.i_key = p.o_key = p.i_flags = p.o_flags = 0;
 	if (p.iph.ttl)
 		p.iph.frag_off |= htons(IP_DF);
 
maintainer
#1 lore raw

From: Cong Wang <[email protected]>
Date: Tue, 2 Jul 2013 14:49:34 +0800

Quoted 11 lines

From: Cong Wang <[email protected]>

This is a regression introduced by
commit fd58156e456d9f68fe0448 (IPIP: Use ip-tunneling code.)

Similar to GRE tunnel, 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.

Quoted 7 lines

Also, the check for i_key, o_key etc. is suspicious too, which did not exist before, reset them before passing to ip_tunnel_ioctl().

Cc Pravin B Shelar <[email protected]>
Cc "David S. Miller" <[email protected]>

Applied and queued up for -stable, thanks!