[ovs-dev] [PATCH 1/2] dpif-netdev: Fix flow mark leak on port lookup failure.

Ilya Maximets i.maximets at samsung.com
Mon May 13 14:01:59 UTC 2019


Flow mark should be properly freed in all error cases.

Fixes: 241bad15d99a ("dpif-netdev: associate flow with a mark id")
Signed-off-by: Ilya Maximets <i.maximets at samsung.com>
---
 lib/dpif-netdev.c | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 5a6f2abac..4ee367556 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -2383,7 +2383,7 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload)
     port = dp_netdev_lookup_port(pmd->dp, in_port);
     if (!port) {
         ovs_mutex_unlock(&pmd->dp->port_mutex);
-        return -1;
+        goto err_free;
     }
     ret = netdev_flow_put(port->netdev, &offload->match,
                           CONST_CAST(struct nlattr *, offload->actions),
@@ -2392,20 +2392,22 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload)
     ovs_mutex_unlock(&pmd->dp->port_mutex);
 
     if (ret) {
-        if (!modification) {
-            flow_mark_free(mark);
-        } else {
-            mark_to_flow_disassociate(pmd, flow);
-        }
-        return -1;
+        goto err_free;
     }
 
     if (!modification) {
         megaflow_to_mark_associate(&flow->mega_ufid, mark);
         mark_to_flow_associate(mark, flow);
     }
-
     return 0;
+
+err_free:
+    if (!modification) {
+        flow_mark_free(mark);
+    } else {
+        mark_to_flow_disassociate(pmd, flow);
+    }
+    return -1;
 }
 
 static void *
-- 
2.17.1



More information about the dev mailing list