When the recirc action is in middle, the current code creates a clone of
the NBL. However, it overwrites the pointer to point to the cloned NBL
without completing it. This causes a memory leak that crashes the kernel.

Signed-off-by: Sairam Venugopal <vsai...@vmware.com>
---
 datapath-windows/ovsext/Actions.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/datapath-windows/ovsext/Actions.c 
b/datapath-windows/ovsext/Actions.c
index 5dae6b4..5ad29ee 100644
--- a/datapath-windows/ovsext/Actions.c
+++ b/datapath-windows/ovsext/Actions.c
@@ -1557,10 +1557,14 @@ OvsExecuteRecirc(OvsForwardingContext *ovsFwdCtx,
             ovsActionStats.noCopiedNbl++;
             return NDIS_STATUS_SUCCESS;
         }
-        ovsFwdCtx->curNbl = newNbl;
     }
 
-    deferredAction = OvsAddDeferredActions(ovsFwdCtx->curNbl, key, NULL);
+    if (newNbl) {
+        deferredAction = OvsAddDeferredActions(newNbl, key, NULL);
+    } else {
+        deferredAction = OvsAddDeferredActions(ovsFwdCtx->curNbl, key, NULL);
+    }
+
     if (deferredAction) {
         deferredAction->key.recircId = NlAttrGetU32(actions);
     } else {
-- 
1.9.5.msysgit.0

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

Reply via email to