]> git.proxmox.com Git - ovs.git/commitdiff
dpif-netdev: Fix cmap node use after free on flow disassociation.
authorIlya Maximets <i.maximets@samsung.com>
Fri, 19 Oct 2018 13:51:13 +0000 (16:51 +0300)
committerIan Stokes <ian.stokes@intel.com>
Fri, 2 Nov 2018 15:13:54 +0000 (15:13 +0000)
Data pointed by cmap node must not be freed while iterating.
ovsrcu_postpone should be used instead.

CC: Finn Christensen <fc@napatech.com>
Fixes: e8a2b5bf92bb ("netdev-dpdk: implement flow offload with rte flow")
Signed-off-by: Ilya Maximets <i.maximets@samsung.com>
Signed-off-by: Ian Stokes <ian.stokes@intel.com>
lib/dpif-netdev.c
lib/netdev-dpdk.c

index c44c417d3cd9553c8a2726b022c3af16abae1721..3f7acb5ddc8a2c6c2dfa499517aaee6824a34ba7 100644 (file)
@@ -2136,7 +2136,7 @@ megaflow_to_mark_disassociate(const ovs_u128 *mega_ufid)
         if (ovs_u128_equals(*mega_ufid, data->mega_ufid)) {
             cmap_remove(&flow_mark.megaflow_to_mark,
                         CONST_CAST(struct cmap_node *, &data->node), hash);
-            free(data);
+            ovsrcu_postpone(free, data);
             return;
         }
     }
index 78a981d8f48382713e046997d0919fbc1bfe5818..d2b392f61010f162e7a15859cb47f3c5d347437a 100644 (file)
@@ -4043,7 +4043,7 @@ ufid_to_rte_flow_disassociate(const ovs_u128 *ufid) {
         if (ovs_u128_equals(*ufid, data->ufid)) {
             cmap_remove(&ufid_to_rte_flow,
                         CONST_CAST(struct cmap_node *, &data->node), hash);
-            free(data);
+            ovsrcu_postpone(free, data);
             return;
         }
     }