The loop in revalidate() needs to ensure that any data obtained from
dpif_flow_dump_next() is used before it is destroyed, as indicated by
dpif_flow_dump_next_may_destroy_keys().  In the common case, where
processing reaches the end of the main "while" loop, it does this, but
in two corner cases the code in the loop execute "continue;", which skipped
the check.  This commit fixes the problem.

Bug #1249988.
Signed-off-by: Ben Pfaff <b...@nicira.com>
---
 ofproto/ofproto-dpif-upcall.c |    5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c
index e1117ba..f15e916 100644
--- a/ofproto/ofproto-dpif-upcall.c
+++ b/ofproto/ofproto-dpif-upcall.c
@@ -1470,7 +1470,7 @@ revalidate(struct revalidator *revalidator)
                  * flow this time. */
                 ovs_mutex_unlock(&ukey->mutex);
                 COVERAGE_INC(upcall_duplicate_flow);
-                continue;
+                goto next;
             }
 
             used = ukey->created;
@@ -1493,7 +1493,7 @@ revalidate(struct revalidator *revalidator)
                      * another revalidator is processing this flow
                      * concurrently, so don't bother processing it. */
                     ukey_delete(NULL, ukey);
-                    continue;
+                    goto next;
                 }
             }
 
@@ -1511,6 +1511,7 @@ revalidate(struct revalidator *revalidator)
             dump_op_init(&ops[n_ops++], key, key_len, ukey);
         }
 
+    next:
         may_destroy = dpif_flow_dump_next_may_destroy_keys(&udpif->dump,
                                                            state);
 
-- 
1.7.10.4

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to