revalidator_sweep__() does not provide udumps, so push_dump_ops() can't look them up.
This is my fault: I introduced it during review. Signed-off-by: Ben Pfaff <b...@nicira.com> --- ofproto/ofproto-dpif-upcall.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c index 1622888..e4f81a1 100644 --- a/ofproto/ofproto-dpif-upcall.c +++ b/ofproto/ofproto-dpif-upcall.c @@ -1466,12 +1466,17 @@ push_dump_ops(struct revalidator *revalidator, } for (i = 0; i < n_ops; i++) { - struct udpif_key *ukey = ops[i].ukey; + struct udpif_key *ukey; - /* Look up the ukey to prevent double-free in case 'ops' contains a - * given ukey more than once (which can happen if the datapath dumps a - * given flow more than once). */ - ukey = ukey_lookup(revalidator, ops[i].udump); + /* If there's a udump, this ukey came directly from a datapath flow + * dump. Sometimes a datapath can send duplicates in flow dumps, in + * which case we wouldn't want to double-free a ukey, so avoid that by + * looking up the ukey again. + * + * If there's no udump then we know what we're doing. */ + ukey = (ops[i].udump + ? ukey_lookup(revalidator, ops[i].udump) + : ops[i].ukey); if (ukey) { ukey_delete(revalidator, ukey); } -- 1.7.10.4 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev