lib/repo: Fix handling of missing summary files when downloading

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
This commit is contained in:
Philip Withnall 2017-08-08 15:39:34 +01:00 committed by Atomic Bot
parent 86dce4b252
commit 1672e2eee0
2 changed files with 17 additions and 1 deletions

View 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 /* 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 static gboolean
fetch_summary_from_remote (OstreeRepo *repo, fetch_summary_from_remote (OstreeRepo *repo,
OstreeRemote *remote, OstreeRemote *remote,
@ -648,6 +649,13 @@ get_checksums (OstreeRepoFinderAvahi *finder,
error)) error))
return FALSE; 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); return get_refs_and_checksums_from_summary (summary_bytes, supported_ref_to_checksum, error);
} }

View File

@ -4834,6 +4834,14 @@ find_remotes_cb (GObject *obj,
g_clear_error (&error); g_clear_error (&error);
continue; 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 /* Check the metadata in the summary file, especially whether it contains
* all the @refs we are interested in. */ * all the @refs we are interested in. */