diff mbox

[ovs-dev] ovn-trace: Fix memory leaks.

Message ID 20170113192854.29718-1-blp@ovn.org
State Accepted
Headers show

Commit Message

Ben Pfaff Jan. 13, 2017, 7:28 p.m. UTC
Suggested-by: Justin Pettit <jpettit@ovn.org>
Signed-off-by: Ben Pfaff <blp@ovn.org>
---
 ovn/utilities/ovn-trace.c | 36 ++++++++++++++++++++++++++++++++++--
 1 file changed, 34 insertions(+), 2 deletions(-)

Comments

Ben Pfaff Jan. 31, 2017, 10:11 p.m. UTC | #1
Justin, would you mind reviewing this?

On Fri, Jan 13, 2017 at 11:28:54AM -0800, Ben Pfaff wrote:
> Suggested-by: Justin Pettit <jpettit@ovn.org>
> Signed-off-by: Ben Pfaff <blp@ovn.org>
> ---
>  ovn/utilities/ovn-trace.c | 36 ++++++++++++++++++++++++++++++++++--
>  1 file changed, 34 insertions(+), 2 deletions(-)
> 
> diff --git a/ovn/utilities/ovn-trace.c b/ovn/utilities/ovn-trace.c
> index 82b5ee6..b1ffe1f 100644
> --- a/ovn/utilities/ovn-trace.c
> +++ b/ovn/utilities/ovn-trace.c
> @@ -1,5 +1,5 @@
>  /*
> - * Copyright (c) 2016 Nicira, Inc.
> + * Copyright (c) 2016, 2017 Nicira, Inc.
>   *
>   * Licensed under the Apache License, Version 2.0 (the "License");
>   * you may not use this file except in compliance with the License.
> @@ -856,11 +856,13 @@ struct ovntrace_node {
>      struct ovs_list node;       /* In parent. */
>  
>      enum ovntrace_node_type type;
> -    const char *name;
> +    char *name;
>      bool always_indent;
>      struct ovs_list subs;       /* List of children. */
>  };
>  
> +static void ovntrace_node_destroy(struct ovntrace_node *);
> +
>  static struct ovntrace_node * OVS_PRINTF_FORMAT(3, 4)
>  ovntrace_node_append(struct ovs_list *super, enum ovntrace_node_type type,
>                       const char *format, ...)
> @@ -893,6 +895,29 @@ ovntrace_node_clone(const struct ovs_list *old, struct ovs_list *new)
>  }
>  
>  static void
> +ovntrace_node_list_destroy(struct ovs_list *list)
> +{
> +    if (list) {
> +        struct ovntrace_node *node, *next;
> +
> +        LIST_FOR_EACH_SAFE (node, next, node, list) {
> +            ovs_list_remove(&node->node);
> +            ovntrace_node_destroy(node);
> +        }
> +    }
> +}
> +
> +static void
> +ovntrace_node_destroy(struct ovntrace_node *node)
> +{
> +    if (node) {
> +        ovntrace_node_list_destroy(&node->subs);
> +        free(node->name);
> +        free(node);
> +    }
> +}
> +
> +static void
>  ovntrace_node_print_details(struct ds *output,
>                              const struct ovs_list *nodes, int level)
>  {
> @@ -928,8 +953,10 @@ ovntrace_node_prune_summary(struct ovs_list *nodes)
>          ovntrace_node_prune_summary(&sub->subs);
>          if (sub->type == OVNTRACE_NODE_MODIFY ||
>              sub->type == OVNTRACE_NODE_TABLE) {
> +            /* Replace 'sub' by its children, if any, */
>              ovs_list_remove(&sub->node);
>              ovs_list_splice(&next->node, sub->subs.next, &sub->subs);
> +            ovntrace_node_destroy(sub);
>          }
>      }
>  }
> @@ -970,8 +997,10 @@ ovntrace_node_prune_hard(struct ovs_list *nodes)
>              sub->type == OVNTRACE_NODE_PIPELINE ||
>              sub->type == OVNTRACE_NODE_TABLE ||
>              sub->type == OVNTRACE_NODE_OUTPUT) {
> +            /* Replace 'sub' by its children, if any, */
>              ovs_list_remove(&sub->node);
>              ovs_list_splice(&next->node, sub->subs.next, &sub->subs);
> +            ovntrace_node_destroy(sub);
>          }
>      }
>  }
> @@ -1569,6 +1598,7 @@ trace(const char *dp_s, const char *flow_s)
>          ovntrace_node_clone(&root, &clone);
>          ovntrace_node_prune_summary(&clone);
>          ovntrace_node_print_summary(&output, &clone, 0);
> +        ovntrace_node_list_destroy(&clone);
>      }
>  
>      if (minimal) {
> @@ -1579,6 +1609,8 @@ trace(const char *dp_s, const char *flow_s)
>          ovntrace_node_print_summary(&output, &root, 0);
>      }
>  
> +    ovntrace_node_list_destroy(&root);
> +
>      vconn_close(vconn);
>  
>      return ds_steal_cstr(&output);
> -- 
> 2.10.2
>
Justin Pettit Jan. 31, 2017, 10:48 p.m. UTC | #2
> On Jan 13, 2017, at 11:28 AM, Ben Pfaff <blp@ovn.org> wrote:
> 
> Suggested-by: Justin Pettit <jpettit@ovn.org>
> Signed-off-by: Ben Pfaff <blp@ovn.org>

Acked-by: Justin Pettit <jpettit@ovn.org>

--Justin
Ben Pfaff Jan. 31, 2017, 10:52 p.m. UTC | #3
On Fri, Jan 13, 2017 at 11:28:54AM -0800, Ben Pfaff wrote:
> Suggested-by: Justin Pettit <jpettit@ovn.org>
> Signed-off-by: Ben Pfaff <blp@ovn.org>

Thanks, applied to master and branch-2.7.
Ben Pfaff Jan. 31, 2017, 10:52 p.m. UTC | #4
On Tue, Jan 31, 2017 at 02:48:25PM -0800, Justin Pettit wrote:
> 
> > On Jan 13, 2017, at 11:28 AM, Ben Pfaff <blp@ovn.org> wrote:
> > 
> > Suggested-by: Justin Pettit <jpettit@ovn.org>
> > Signed-off-by: Ben Pfaff <blp@ovn.org>
> 
> Acked-by: Justin Pettit <jpettit@ovn.org>

Thanks, applied to master and branch-2.7.
diff mbox

Patch

diff --git a/ovn/utilities/ovn-trace.c b/ovn/utilities/ovn-trace.c
index 82b5ee6..b1ffe1f 100644
--- a/ovn/utilities/ovn-trace.c
+++ b/ovn/utilities/ovn-trace.c
@@ -1,5 +1,5 @@ 
 /*
- * Copyright (c) 2016 Nicira, Inc.
+ * Copyright (c) 2016, 2017 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -856,11 +856,13 @@  struct ovntrace_node {
     struct ovs_list node;       /* In parent. */
 
     enum ovntrace_node_type type;
-    const char *name;
+    char *name;
     bool always_indent;
     struct ovs_list subs;       /* List of children. */
 };
 
+static void ovntrace_node_destroy(struct ovntrace_node *);
+
 static struct ovntrace_node * OVS_PRINTF_FORMAT(3, 4)
 ovntrace_node_append(struct ovs_list *super, enum ovntrace_node_type type,
                      const char *format, ...)
@@ -893,6 +895,29 @@  ovntrace_node_clone(const struct ovs_list *old, struct ovs_list *new)
 }
 
 static void
+ovntrace_node_list_destroy(struct ovs_list *list)
+{
+    if (list) {
+        struct ovntrace_node *node, *next;
+
+        LIST_FOR_EACH_SAFE (node, next, node, list) {
+            ovs_list_remove(&node->node);
+            ovntrace_node_destroy(node);
+        }
+    }
+}
+
+static void
+ovntrace_node_destroy(struct ovntrace_node *node)
+{
+    if (node) {
+        ovntrace_node_list_destroy(&node->subs);
+        free(node->name);
+        free(node);
+    }
+}
+
+static void
 ovntrace_node_print_details(struct ds *output,
                             const struct ovs_list *nodes, int level)
 {
@@ -928,8 +953,10 @@  ovntrace_node_prune_summary(struct ovs_list *nodes)
         ovntrace_node_prune_summary(&sub->subs);
         if (sub->type == OVNTRACE_NODE_MODIFY ||
             sub->type == OVNTRACE_NODE_TABLE) {
+            /* Replace 'sub' by its children, if any, */
             ovs_list_remove(&sub->node);
             ovs_list_splice(&next->node, sub->subs.next, &sub->subs);
+            ovntrace_node_destroy(sub);
         }
     }
 }
@@ -970,8 +997,10 @@  ovntrace_node_prune_hard(struct ovs_list *nodes)
             sub->type == OVNTRACE_NODE_PIPELINE ||
             sub->type == OVNTRACE_NODE_TABLE ||
             sub->type == OVNTRACE_NODE_OUTPUT) {
+            /* Replace 'sub' by its children, if any, */
             ovs_list_remove(&sub->node);
             ovs_list_splice(&next->node, sub->subs.next, &sub->subs);
+            ovntrace_node_destroy(sub);
         }
     }
 }
@@ -1569,6 +1598,7 @@  trace(const char *dp_s, const char *flow_s)
         ovntrace_node_clone(&root, &clone);
         ovntrace_node_prune_summary(&clone);
         ovntrace_node_print_summary(&output, &clone, 0);
+        ovntrace_node_list_destroy(&clone);
     }
 
     if (minimal) {
@@ -1579,6 +1609,8 @@  trace(const char *dp_s, const char *flow_s)
         ovntrace_node_print_summary(&output, &root, 0);
     }
 
+    ovntrace_node_list_destroy(&root);
+
     vconn_close(vconn);
 
     return ds_steal_cstr(&output);