ostree/debian/patches/OstreeRepoFinderConfig-Fix-...

53 lines
2.3 KiB
Diff

From: Simon McVittie <smcv@debian.org>
Date: Sun, 24 Jun 2018 12:56:49 +0100
Subject: OstreeRepoFinderConfig: Fix guint/gsize confusion
If a function has a guint "out argument", passing a pointer to a gsize
is not, in general, valid. On an ILP64 platform there is no problem
since guint and gsize are identical, but on an LP64 platform it will
overwrite only the first word of the gsize, leaving the second word
unaffected. On little-endian machines, if the second word is
zero-initialized (as it is here), the result is numerically equal to
the guint, but on big-endian machines the result is around 4 billion
times what it should be, resulting in
ostree_repo_finder_config_resolve_async() reading past the end of
the array and causing undefined behaviour.
In practice this caused assertion failures (and consequently test
failures) on Debian's s390x (z/Architecture), ppc64 (64-bit PowerPC)
and sparc64 (64-bit SPARC) ports.
Bug: https://github.com/ostreedev/ostree/issues/1640
Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=902209
Forwarded: https://github.com/ostreedev/ostree/pull/1641
Signed-off-by: Simon McVittie <smcv@debian.org>
---
src/libostree/ostree-repo-finder-config.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/libostree/ostree-repo-finder-config.c b/src/libostree/ostree-repo-finder-config.c
index 4366d72..06f6165 100644
--- a/src/libostree/ostree-repo-finder-config.c
+++ b/src/libostree/ostree-repo-finder-config.c
@@ -96,7 +96,7 @@ ostree_repo_finder_config_resolve_async (OstreeRepoFinder *find
GHashTableIter iter;
const gchar *remote_name;
g_auto(GStrv) remotes = NULL;
- gsize n_remotes = 0;
+ guint n_remotes = 0;
task = g_task_new (finder, cancellable, callback, user_data);
g_task_set_source_tag (task, ostree_repo_finder_config_resolve_async);
@@ -106,9 +106,9 @@ ostree_repo_finder_config_resolve_async (OstreeRepoFinder *find
/* List all remotes in this #OstreeRepo and see which of their ref lists
* intersect with @refs. */
- remotes = ostree_repo_remote_list (parent_repo, (guint *) &n_remotes);
+ remotes = ostree_repo_remote_list (parent_repo, &n_remotes);
- g_debug ("%s: Checking %" G_GSIZE_FORMAT " remotes", G_STRFUNC, n_remotes);
+ g_debug ("%s: Checking %u remotes", G_STRFUNC, n_remotes);
for (i = 0; i < n_remotes; i++)
{