From 933da03610e5627de5b40f76d4b1f32727790005 Mon Sep 17 00:00:00 2001 From: Phil Miller Date: Thu, 14 Jun 2018 00:12:35 -0500 Subject: [PATCH 1/3] Stop leaking local GVariantDict instance contents Leaks were observed in isenkramd on Debian Diagnosis and confirmation of the fix via valgrind --- src/as-component.c | 2 ++ src/as-content-rating.c | 2 ++ src/as-icon.c | 2 ++ src/as-image.c | 2 ++ src/as-release.c | 2 ++ src/as-screenshot.c | 2 ++ 6 files changed, 12 insertions(+) diff --git a/src/as-component.c b/src/as-component.c index 9ae1a2dd..e0e860aa 100644 --- a/src/as-component.c +++ b/src/as-component.c @@ -5743,6 +5743,8 @@ as_component_set_from_variant (AsComponent *cpt, GVariant *variant, const gchar g_variant_unref (var); } + g_variant_dict_clear (&dict); + return TRUE; } diff --git a/src/as-content-rating.c b/src/as-content-rating.c index 23c3464a..e62708c0 100644 --- a/src/as-content-rating.c +++ b/src/as-content-rating.c @@ -550,6 +550,8 @@ as_content_rating_set_from_variant (AsContentRating *content_rating, GVariant *v g_variant_unref (v_child); } + g_variant_dict_clear (&idict); + return TRUE; } diff --git a/src/as-icon.c b/src/as-icon.c index 48c2bf21..8c55d57b 100644 --- a/src/as-icon.c +++ b/src/as-icon.c @@ -536,6 +536,8 @@ as_icon_set_from_variant (AsIcon *icon, GVariant *variant) as_variant_get_dict_str (&idict, "filename", &ival_var)); } + g_variant_dict_clear (&idict); + return TRUE; } diff --git a/src/as-image.c b/src/as-image.c index 0fefcf32..63644b3c 100644 --- a/src/as-image.c +++ b/src/as-image.c @@ -529,6 +529,8 @@ as_image_set_from_variant (AsImage *image, GVariant *variant) priv->width = as_variant_get_dict_int32 (&dict, "width"); priv->height = as_variant_get_dict_int32 (&dict, "height"); + g_variant_dict_clear (&dict); + return TRUE; } diff --git a/src/as-release.c b/src/as-release.c index 3d261501..3ab576a2 100644 --- a/src/as-release.c +++ b/src/as-release.c @@ -1032,6 +1032,8 @@ as_release_set_from_variant (AsRelease *release, GVariant *variant, const gchar g_variant_unref (tmp); } + g_variant_dict_clear (&rdict); + return TRUE; } diff --git a/src/as-screenshot.c b/src/as-screenshot.c index 629a8355..4c8423e3 100644 --- a/src/as-screenshot.c +++ b/src/as-screenshot.c @@ -648,6 +648,8 @@ as_screenshot_set_from_variant (AsScreenshot *screenshot, GVariant *variant, con } } + g_variant_dict_clear (&idict); + return priv->images->len != 0; } From e58399b97e2d261c4d411e491bdd0b833111945e Mon Sep 17 00:00:00 2001 From: Phil Miller Date: Thu, 14 Jun 2018 00:30:11 -0500 Subject: [PATCH 2/3] Drop leaked references to container items --- src/as-pool.c | 1 + src/as-screenshot.c | 1 + 2 files changed, 2 insertions(+) diff --git a/src/as-pool.c b/src/as-pool.c index 2394ead7..0ff4a7a7 100644 --- a/src/as-pool.c +++ b/src/as-pool.c @@ -1764,6 +1764,7 @@ as_cache_file_read (const gchar *fname, GError **error) g_warning ("Ignored serialized component: %s", str); } } + g_variant_unref (cptv); } return cpts; diff --git a/src/as-screenshot.c b/src/as-screenshot.c index 4c8423e3..48f16726 100644 --- a/src/as-screenshot.c +++ b/src/as-screenshot.c @@ -645,6 +645,7 @@ as_screenshot_set_from_variant (AsScreenshot *screenshot, GVariant *variant, con g_autoptr(AsImage) img = as_image_new (); if (as_image_set_from_variant (img, img_child)) as_screenshot_add_image (screenshot, img); + g_variant_unref (img_child); } } From fba03894aec7ad4b3fb96235ff7bf703b5da33cc Mon Sep 17 00:00:00 2001 From: Phil Miller Date: Thu, 14 Jun 2018 08:21:01 -0500 Subject: [PATCH 3/3] Fix leaked iterator --- src/as-utils.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/as-utils.c b/src/as-utils.c index 2ee268a6..26a61c74 100644 --- a/src/as-utils.c +++ b/src/as-utils.c @@ -291,12 +291,15 @@ as_utils_find_files_matching (const gchar* dir, const gchar* pattern, gboolean r goto out; while ((file_info = g_file_enumerator_next_file (enumerator, NULL, &tmp_error)) != NULL) { - gchar *path; + gchar *path = NULL; + gboolean stop = FALSE; - if (tmp_error != NULL) - goto out; + if (tmp_error != NULL) { + stop = TRUE; + goto done; + } if (g_file_info_get_is_hidden (file_info)) - continue; + goto done; path = g_build_filename (dir, g_file_info_get_name (file_info), @@ -310,8 +313,8 @@ as_utils_find_files_matching (const gchar* dir, const gchar* pattern, gboolean r if (subdir_list == NULL) { g_ptr_array_unref (list); list = NULL; - g_free (path); - goto out; + stop = TRUE; + goto done; } for (i=0; ilen; i++) g_ptr_array_add (list, @@ -320,12 +323,18 @@ as_utils_find_files_matching (const gchar* dir, const gchar* pattern, gboolean r } else { if (!as_str_empty (pattern)) { if (!g_pattern_match_simple (pattern, g_file_info_get_name (file_info))) { - g_free (path); - continue; + goto done; } } g_ptr_array_add (list, path); + path = NULL; } + + done: + g_object_unref (file_info); + g_free (path); + if (stop) + break; }