ostree/debian/patches/ASAN-metalink-Fix-leaks-of-...

80 lines
2.6 KiB
Diff

From: Colin Walters <walters@verbum.org>
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;