[ovs-dev] [PATCH 1/2] datapath: Initialize tunnel_key pad member.

Jesse Gross jesse at nicira.com
Mon Dec 31 20:48:03 UTC 2012


When a packet is received on a tunnel the pad member is currently
left uninitialized.  This didn't previously cause problems because
userspace didn't interprete the IPV4_TUNNEL attribute and blindly
copied back the uninitialized data.  However, now that userspace
knows how to serialize this attribute it was zeroing it out, which
prevented flows that had been previously installed from being
deleted.  In addition to zeroing out the padding on packet reception,
it also does the same thing on flow setup since we should be ignoring
the value.

Reported-by: Anand Krishnamurthy <krishnamurt4 at wisc.edu>
Reported-by: Saul St. John <sstjohn at cs.wisc.edu>
Signed-off-by: Jesse Gross <jesse at nicira.com>
---
 datapath/flow.c   |    2 ++
 datapath/tunnel.h |    1 +
 2 files changed, 3 insertions(+)

diff --git a/datapath/flow.c b/datapath/flow.c
index 0c3d75f..63eef77 100644
--- a/datapath/flow.c
+++ b/datapath/flow.c
@@ -1053,6 +1053,7 @@ int ovs_flow_from_nlattrs(struct sw_flow_key *swkey, int *key_lenp,
 			return -EINVAL;
 
 		memcpy(&swkey->tun_key, tun_key, sizeof(swkey->tun_key));
+		memset(swkey->tun_key.pad, 0, sizeof(swkey->tun_key.pad));
 
 		attrs &= ~(1ULL << OVS_KEY_ATTR_TUN_ID);
 		attrs &= ~(1ULL << OVS_KEY_ATTR_IPV4_TUNNEL);
@@ -1064,6 +1065,7 @@ int ovs_flow_from_nlattrs(struct sw_flow_key *swkey, int *key_lenp,
 			return -EINVAL;
 
 		memcpy(&swkey->tun_key, tun_key, sizeof(swkey->tun_key));
+		memset(swkey->tun_key.pad, 0, sizeof(swkey->tun_key.pad));
 
 		attrs &= ~(1ULL << OVS_KEY_ATTR_IPV4_TUNNEL);
 	}
diff --git a/datapath/tunnel.h b/datapath/tunnel.h
index b7de7a9..7705475 100644
--- a/datapath/tunnel.h
+++ b/datapath/tunnel.h
@@ -201,6 +201,7 @@ static inline void tnl_tun_key_init(struct ovs_key_ipv4_tunnel *tun_key,
 	tun_key->ipv4_tos = iph->tos;
 	tun_key->ipv4_ttl = iph->ttl;
 	tun_key->tun_flags = tun_flags;
+	memset(tun_key->pad, 0, sizeof(tun_key->pad));
 }
 
 static inline void tnl_get_param(const struct tnl_mutable_config *mutable,
-- 
1.7.9.5




More information about the dev mailing list