From d83d5b4a29924f208c6955a0917a152d07e4b4d6 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Mon, 28 Nov 2016 22:01:33 -0500 Subject: [PATCH] [ASAN] metalink: Fix leaks of buffer We should be religious about the "only set output variables on success", otherwise it makes leaks more likely. But the real leak was us simply not using autoptr in one place. Closes: #598 Approved by: jlebon --- src/libostree/ostree-metalink.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/libostree/ostree-metalink.c b/src/libostree/ostree-metalink.c index ad3d5bf9..b3c8b15a 100644 --- a/src/libostree/ostree-metalink.c +++ b/src/libostree/ostree-metalink.c @@ -479,7 +479,7 @@ try_one_url (OstreeMetalinkRequest *self, ret = TRUE; if (out_data) - *out_data = g_bytes_ref (bytes); + *out_data = g_steal_pointer (&bytes); out: return ret; } @@ -492,6 +492,7 @@ try_metalink_targets (OstreeMetalinkRequest *self, { gboolean ret = FALSE; SoupURI *target_uri = NULL; + g_autoptr(GBytes) ret_data = NULL; if (!self->found_a_file_element) { @@ -546,7 +547,7 @@ try_metalink_targets (OstreeMetalinkRequest *self, target_uri = self->urls->pdata[self->current_url_index]; - if (try_one_url (self, target_uri, out_data, &temp_error)) + if (try_one_url (self, target_uri, &ret_data, &temp_error)) break; else { @@ -568,6 +569,8 @@ try_metalink_targets (OstreeMetalinkRequest *self, ret = TRUE; if (out_target_uri) *out_target_uri = soup_uri_copy (target_uri); + if (out_data) + *out_data = g_steal_pointer (&ret_data); out: return ret; } @@ -599,7 +602,7 @@ _ostree_metalink_request_sync (OstreeMetalink *self, gboolean ret = FALSE; OstreeMetalinkRequest request = { 0, }; g_autoptr(GMainContext) mainctx = NULL; - GBytes *out_contents = NULL; + g_autoptr(GBytes) contents = NULL; gsize len; const guint8 *data; @@ -614,13 +617,13 @@ _ostree_metalink_request_sync (OstreeMetalink *self, self->uri, FALSE, FALSE, - &out_contents, + &contents, self->max_size, cancellable, error)) goto out; - data = g_bytes_get_data (out_contents, &len); + data = g_bytes_get_data (contents, &len); if (!g_markup_parse_context_parse (request.parser, (const char*)data, len, error)) goto out;