metalink: Fix leaks of buffer
authorColin Walters <walters@verbum.org>
Tue, 29 Nov 2016 03:01:33 +0000 (22:01 -0500)
committerSimon McVittie <smcv@debian.org>
Thu, 1 Dec 2016 12:38:54 +0000 (12:38 +0000)
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

Gbp-Pq: Name ASAN-metalink-Fix-leaks-of-buffer.patch

src/libostree/ostree-metalink.c

index ad3d5bf9406e1f2230362a19fd8956d5d553b624..b3c8b15a8adfd6947b7da6f8f0628d20aacc295d 100644 (file)
@@ -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;