summaryrefslogtreecommitdiff
path: root/lib/dp-packet.c
diff options
context:
space:
mode:
authorWilliam Tu <u9012063@gmail.com>2016-04-06 16:28:51 -0700
committerDaniele Di Proietto <diproiettod@vmware.com>2016-04-06 19:32:34 -0700
commit91644f45c6280b12f72af1f55bf8a83fccc04b1b (patch)
tree7b7a2ea45e76c2c3627796bb3eff382a2a4fa6db /lib/dp-packet.c
parentbc8f7c35c02cfb6d0a369d9a25d3899777b62ec0 (diff)
downloadopenvswitch-91644f45c6280b12f72af1f55bf8a83fccc04b1b.tar.gz
dp-packet: Fix use of uninitialised value at emc_lookup.
Valgrind reports "Conditional jump or move depends on uninitialised value" and "Use of uninitialised value" at case 2016 ovn -- 3 HVs, 1 LS, 3 lports/HV. It is caused by 1) assigning an uninitialized value to 'key->hash' at emc_processing(). Due to uninit rss_hash_valid, dp_packet_rss_valid() might return true and undefined hash value is returned, and 2) at emc_lookup, the 'current_entry->key.hash' could be uninitialized due to dp_packet_clone(). The patch fixes the two and as a result, a couple of calls to dp_packet_rss_invalidate() become redundant and thus are removed. Call stacks: - Connditional jump or move depends on uninitialised value(s) dpif_netdev_packet_get_rss_hash (dpif-netdev.c:3334) emc_processing (dpif-netdev.c:3455) dp_netdev_input__ (dpif-netdev.c:3639) and, - Use of uninitialised value of size 8 emc_lookup (dpif-netdev.c:1785) emc_processing (dpif-netdev.c:3457) dp_netdev_input__ (dpif-netdev.c:3639) Signed-off-by: William Tu <u9012063@gmail.com> Signed-off-by: Daniele Di Proietto <diproiettod@vmware.com>
Diffstat (limited to 'lib/dp-packet.c')
-rw-r--r--lib/dp-packet.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/lib/dp-packet.c b/lib/dp-packet.c
index aec7fe7fb..0c85d508a 100644
--- a/lib/dp-packet.c
+++ b/lib/dp-packet.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
+ * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2016 Nicira, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -29,6 +29,7 @@ dp_packet_init__(struct dp_packet *b, size_t allocated, enum dp_packet_source so
b->source = source;
dp_packet_reset_offsets(b);
pkt_metadata_init(&b->md, 0);
+ dp_packet_rss_invalidate(b);
}
static void
@@ -167,6 +168,19 @@ dp_packet_clone_with_headroom(const struct dp_packet *buffer, size_t headroom)
new_buffer->l3_ofs = buffer->l3_ofs;
new_buffer->l4_ofs = buffer->l4_ofs;
new_buffer->md = buffer->md;
+#ifdef DPDK_NETDEV
+ new_buffer->mbuf.ol_flags = buffer->mbuf.ol_flags;
+#else
+ new_buffer->rss_hash_valid = buffer->rss_hash_valid;
+#endif
+
+ if (dp_packet_rss_valid(new_buffer)) {
+#ifdef DPDK_NETDEV
+ new_buffer->mbuf.hash.rss = buffer->mbuf.hash.rss;
+#else
+ new_buffer->rss_hash = buffer->rss_hash;
+#endif
+ }
return new_buffer;
}