lib/repo: Fix handling of missing summary files when downloading
authorPhilip Withnall <withnall@endlessm.com>
Tue, 8 Aug 2017 14:39:34 +0000 (15:39 +0100)
committerAtomic Bot <atomic-devel@projectatomic.io>
Tue, 8 Aug 2017 15:33:45 +0000 (15:33 +0000)
The API for downloading a summary file can legitimately return NULL for
the summary file contents when it returns TRUE (success). This indicates
an error 404 ā€” the summary file was not found.

Two call sites were not handling that correctly, which was causing later
assertion failures.

Signed-off-by: Philip Withnall <withnall@endlessm.com>
Closes: #1061
Closes: #1065
Approved by: cgwalters

src/libostree/ostree-repo-finder-avahi.c
src/libostree/ostree-repo-pull.c

index e9e2471ae7ae44e813a344aca382614221ac71cf..a1500567f52bdc7dd5fd4b52846c397ac21f681a 100644 (file)
@@ -556,7 +556,8 @@ get_refs_and_checksums_from_summary (GBytes      *summary_bytes,
 }
 
 /* Download the summary file from @remote, and return the bytes of the file in
- * @out_summary_bytes. */
+ * @out_summary_bytes. This will return %TRUE and set @out_summary_bytes to %NULL
+ * if the summary file does not exist. */
 static gboolean
 fetch_summary_from_remote (OstreeRepo    *repo,
                            OstreeRemote  *remote,
@@ -648,6 +649,13 @@ get_checksums (OstreeRepoFinderAvahi  *finder,
                                   error))
     return FALSE;
 
+  if (summary_bytes == NULL)
+    {
+      g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND,
+                   "No summary file found on server");
+      return FALSE;
+    }
+
   return get_refs_and_checksums_from_summary (summary_bytes, supported_ref_to_checksum, error);
 }
 
index 8c0c4ff18071cc548227377e42c415eb33a18e9c..6298a28eef351269de56f0c93c3d74852cee81fb 100644 (file)
@@ -4834,6 +4834,14 @@ find_remotes_cb (GObject      *obj,
           g_clear_error (&error);
           continue;
         }
+      else if (summary_bytes == NULL)
+        {
+          g_debug ("%s: Failed to download summary for result ā€˜%s’. Ignoring. %s",
+                   G_STRFUNC, result->remote->name,
+                   "No summary file exists on server");
+          g_clear_pointer (&g_ptr_array_index (results, i), (GDestroyNotify) ostree_repo_finder_result_free);
+          continue;
+        }
 
       /* Check the metadata in the summary file, especially whether it contains
        * all the @refs we are interested in. */