From: Colin Walters Date: Mon, 28 Nov 2016 22:01:33 -0500 Subject: [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 ad3d5bf..b3c8b15 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;