[ovs-dev] [PATCH] datapath-windows: Fix potential memory leak while creating conntrack entry

Sairam Venugopal vsairam at vmware.com
Wed Jun 21 17:09:52 UTC 2017


I have addressed this in V2. The invalid label is not necessary.




On 6/20/17, 2:46 PM, "Shashank Ram" <rams at vmware.com> wrote:

>Thanks for the patch, please find comments inline.
>________________________________________
>From: ovs-dev-bounces at openvswitch.org <ovs-dev-bounces at openvswitch.org> on behalf of Sairam Venugopal <vsairam at vmware.com>
>Sent: Tuesday, June 20, 2017 1:36 PM
>To: dev at openvswitch.org
>Subject: [ovs-dev] [PATCH] datapath-windows: Fix potential memory leak while    creating conntrack entry
>
>OvsCtAddEntry returns TRUE or FALSE depending on whether
>OvsNatTranslateCtEntry was successful or not. In the case of an
>unsuccesful NAT translation, this will fail to insert the newly created
>entry to the Conntrack Table. This entry needs to be freed and the states
>should be accordingly in the flowKey instead of returning out.
>
>Consolidated the parentEntry lookup and assignment portion across
>different protocols and some minor refactoring to make the code more
>readable.
>
>Tests Done: Enabled driver verifier and tested the following:
>- TCP & ICMP traffic through Conntrack Module.
>- Flushed Conntrack Entries while traffic was flowing.
>- Uninstalled and re-installed the driver when traffic was in progress.
>
>Signed-off-by: Sairam Venugopal <vsairam at vmware.com>
>---
> datapath-windows/ovsext/Conntrack.c | 59 +++++++++++++++++--------------------
> 1 file changed, 27 insertions(+), 32 deletions(-)
>
>diff --git a/datapath-windows/ovsext/Conntrack.c b/datapath-windows/ovsext/Conntrack.c
>index 68ed395..bf9c4f4 100644
>--- a/datapath-windows/ovsext/Conntrack.c
>+++ b/datapath-windows/ovsext/Conntrack.c
>@@ -214,9 +214,18 @@ OvsCtEntryCreate(OvsForwardingContext *fwdCtx,
>                  BOOLEAN *entryCreated)
> {
>     POVS_CT_ENTRY entry = NULL;
>-    *entryCreated = FALSE;
>     UINT32 state = 0;
>+    POVS_CT_ENTRY parentEntry;
>     PNET_BUFFER_LIST curNbl = fwdCtx->curNbl;
>+
>+    *entryCreated = FALSE;
>+    state |= OVS_CS_F_NEW;
>+
>+    parentEntry = OvsCtRelatedLookup(ctx->key, currentTime);
>+    if (parentEntry != NULL) {
>+        state |= OVS_CS_F_RELATED;
>+    }
>+
>     switch (ipProto)
>     {
>         case IPPROTO_TCP:
>@@ -228,23 +237,8 @@ OvsCtEntryCreate(OvsForwardingContext *fwdCtx,
>                 goto invalid;
>             }
>
>-            state |= OVS_CS_F_NEW;
>-            POVS_CT_ENTRY parentEntry;
>-            parentEntry = OvsCtRelatedLookup(ctx->key, currentTime);
>-            if (parentEntry != NULL) {
>-                state |= OVS_CS_F_RELATED;
>-            }
>-
>             if (commit) {
>                 entry = OvsConntrackCreateTcpEntry(tcp, curNbl, currentTime);
>-                if (!entry) {
>-                    return NULL;
>-                }
>-
>-                /* Set parent entry for related FTP connections */
>-                entry->parent = parentEntry;
>-
>-                *entryCreated = TRUE;
>             }
>             break;
>         }
>@@ -257,14 +251,8 @@ OvsCtEntryCreate(OvsForwardingContext *fwdCtx,
>                 goto invalid;
>             }
>
>-            state |= OVS_CS_F_NEW;
>             if (commit) {
>                 entry = OvsConntrackCreateIcmpEntry(currentTime);
>-                if (entry) {
>-                    /* XXX Add support for ICMP-Related */
>-                    entry->parent = NULL;
>-                }
>-                *entryCreated = TRUE;
>             }
>             break;
>         }
>@@ -273,11 +261,6 @@ OvsCtEntryCreate(OvsForwardingContext *fwdCtx,
>             state |= OVS_CS_F_NEW;
>>>> This is not needed since its initialized at the start?
>
>
>             if (commit) {
>                 entry = OvsConntrackCreateOtherEntry(currentTime);
>-                if (entry) {
>-                    /* Default UDP related to NULL until TFTP is supported */
>-                    entry->parent = NULL;
>-                }
>-                *entryCreated = TRUE;
>             }
>             break;
>         }
>@@ -285,12 +268,24 @@ OvsCtEntryCreate(OvsForwardingContext *fwdCtx,
>             goto invalid;
>     }
>
>-    if (commit && !entry) {
>-        return NULL;
>-    }
>-    if (entry && !OvsCtAddEntry(entry, ctx, natInfo, currentTime)) {
>-        return NULL;
>+    if (commit) {
>+        if (entry) {
>+            entry->parent = parentEntry;
>+            if (OvsCtAddEntry(entry, ctx, natInfo, currentTime)) {
>+                *entryCreated = TRUE;
>+            } else {
>+                /* Unable to add entry to the list */
>+                OvsFreeMemoryWithTag(entry, OVS_CT_POOL_TAG);
>+                state = OVS_CS_F_INVALID;
>+                entry = NULL;
>>>> jump to "invalid" instead?
>
>
>+            }
>+        } else {
>+            /* OvsAllocateMemoryWithTag returned NULL; treat as invalid */
>+            state = OVS_CS_F_INVALID;
>>>> jump to "invalid" instead?
>
>
>+        }
>     }
>+
>+
>     OvsCtUpdateFlowKey(key, state, ctx->key.zone, 0, NULL);
>     return entry;
> invalid:
>--


More information about the dev mailing list