[vte] matcher: Fix memory leak
- From: Christian Persch <chpe src gnome org>
 
- To: commits-list gnome org
 
- Cc: 
 
- Subject: [vte] matcher: Fix memory leak
 
- Date: Sat, 18 Nov 2017 17:41:01 +0000 (UTC)
 
commit dda73cc07250ea324b4227907197c39b93fcd365
Author: Christian Persch <chpe src gnome org>
Date:   Sat Nov 18 18:40:03 2017 +0100
    matcher: Fix memory leak
    
    Don't leak the GValueArray.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=790539
 src/matcher.cc |   12 +++++++-----
 src/table.cc   |   19 +++++++++++--------
 2 files changed, 18 insertions(+), 13 deletions(-)
---
diff --git a/src/matcher.cc b/src/matcher.cc
index 10f3bc7..a4f7584 100644
--- a/src/matcher.cc
+++ b/src/matcher.cc
@@ -202,14 +202,16 @@ _vte_matcher_print(struct _vte_matcher *matcher)
  * we need to free those ourselves. */
 void
 _vte_matcher_free_params_array(struct _vte_matcher *matcher,
-                              GValueArray *params)
+                               GValueArray *params)
 {
        guint i;
        for (i = 0; i < params->n_values; i++) {
-               GValue *value = ¶ms->values[i];
-               if (G_UNLIKELY (g_type_is_a (value->g_type, G_TYPE_POINTER))) {
-                       g_free (g_value_get_pointer (value));
-               }
+                auto value = g_value_array_get_nth(params, i);
+                if (G_UNLIKELY (G_VALUE_HOLDS_POINTER(value))) {
+                        g_free(g_value_get_pointer(value));
+                } else if (G_UNLIKELY (G_VALUE_HOLDS_BOXED(value))) {
+                        g_value_array_free((GValueArray*)g_value_get_boxed(value));
+                }
        }
        if (G_UNLIKELY (matcher == NULL || matcher->free_params != NULL)) {
                g_value_array_free (params);
diff --git a/src/table.cc b/src/table.cc
index a81bb12..68d3e9d 100644
--- a/src/table.cc
+++ b/src/table.cc
@@ -523,18 +523,14 @@ static void
 _vte_table_extract_numbers(GValueArray **array,
                           struct _vte_table_arginfo *arginfo)
 {
-       GValue value = {0,};
-       GValue subvalue = {0,};
-       GValueArray *subarray = NULL;
-       gssize i;
-
         if (G_UNLIKELY (*array == NULL)) {
                 *array = g_value_array_new(1);
         }
 
+       GValue value = {0,};
        g_value_init(&value, G_TYPE_LONG);
-       g_value_init(&subvalue, G_TYPE_VALUE_ARRAY);
-       i = 0;
+       gssize i = 0;
+        GValueArray *subarray = nullptr;
        do {
                long total = 0;
                for (; i < arginfo->length && arginfo->start[i] != ';' && arginfo->start[i] != ':'; i++) {
@@ -553,13 +549,20 @@ _vte_table_extract_numbers(GValueArray **array,
                                g_value_array_append(*array, &value);
                        } else {
                                g_value_array_append(subarray, &value);
-                               g_value_set_boxed(&subvalue, subarray);
+
+                                GValue subvalue = {0,};
+                                g_value_init(&subvalue, G_TYPE_VALUE_ARRAY);
+                               g_value_take_boxed(&subvalue, subarray);
                                g_value_array_append(*array, &subvalue);
+                                g_value_unset(&subvalue);
+
                                subarray = NULL;
                        }
                }
        } while (i++ < arginfo->length);
        g_value_unset(&value);
+        if (subarray != nullptr)
+                g_value_array_free(subarray);
 }
 
 static void
[
Date Prev][
Date Next]   [
Thread Prev][
Thread Next]   
[
Thread Index]
[
Date Index]
[
Author Index]