From 8769f4afd8a70a4899765b9681ea0cd7ba4bc1a7 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Mon, 31 Oct 2011 22:41:50 -0400 Subject: [PATCH] Switch to big-endian storage for all variant data This ensures the saved archives are architecture-independent. --- src/libostree/ostree-core.c | 1 + src/libostree/ostree-repo.c | 19 ++++++++++++------- src/ot-builtin-log.c | 2 ++ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/libostree/ostree-core.c b/src/libostree/ostree-core.c index ce54fbc4..4befb016 100644 --- a/src/libostree/ostree-core.c +++ b/src/libostree/ostree-core.c @@ -356,6 +356,7 @@ ostree_parse_metadata_file (const char *path, mfile); g_variant_get (container, "(uv)", &ret_type, &ret_variant); + ret_type = GUINT32_FROM_BE (ret_type); if (ret_type <= 0 || ret_type > OSTREE_SERIALIZED_VARIANT_LAST) { g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c index a1323c69..721f62b2 100644 --- a/src/libostree/ostree-repo.c +++ b/src/libostree/ostree-repo.c @@ -518,7 +518,7 @@ import_gvariant_object (OstreeRepo *self, int fd = -1; GUnixOutputStream *stream = NULL; - serialized = g_variant_new ("(uv)", (guint32)type, variant); + serialized = g_variant_new ("(uv)", GUINT32_TO_BE ((guint32)type), variant); tmp_name = g_build_filename (priv->objects_path, "variant-tmp-XXXXXX", NULL); fd = g_mkstemp (tmp_name); @@ -639,9 +639,9 @@ import_directory_meta (OstreeRepo *self, dirmeta = g_variant_new ("(uuuu@a(ayay))", OSTREE_DIR_META_VERSION, - (guint32)stbuf.st_uid, - (guint32)stbuf.st_gid, - (guint32)(stbuf.st_mode & (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO)), + GUINT32_TO_BE ((guint32)stbuf.st_uid), + GUINT32_TO_BE ((guint32)stbuf.st_gid), + GUINT32_TO_BE ((guint32)stbuf.st_mode), xattrs); xattrs = NULL; /* was floating */ g_variant_ref_sink (dirmeta); @@ -1203,6 +1203,7 @@ parse_tree (OstreeRepo *self, /* PARSE OSTREE_SERIALIZED_TREE_VARIANT */ g_variant_get (tree_variant, "(u@a{sv}@a(ss)@a(sss))", &version, &meta_variant, &files_variant, &dirs_variant); + version = GUINT32_FROM_BE (version); ret_pdata = parsed_tree_data_new (); n = g_variant_n_children (files_variant); @@ -1366,7 +1367,7 @@ import_parsed_tree (OstreeRepo *self, } serialized_tree = g_variant_new ("(u@a{sv}@a(ss)@a(sss))", - 0, + GUINT32_TO_BE (0), create_empty_gvariant_dict (), g_variant_builder_end (&files_builder), g_variant_builder_end (&dirs_builder)); @@ -1766,11 +1767,11 @@ commit_parsed_tree (OstreeRepo *self, now = g_date_time_new_now_utc (); commit = g_variant_new ("(u@a{sv}ssstss)", - OSTREE_COMMIT_VERSION, + GUINT32_TO_BE (OSTREE_COMMIT_VERSION), create_empty_gvariant_dict (), parent ? parent : "", subject, body ? body : "", - g_date_time_to_unix (now) / G_TIME_SPAN_SECOND, + GUINT64_TO_BE (g_date_time_to_unix (now)), g_checksum_get_string (root_checksum), root->metadata_sha256); if (!import_gvariant_object (self, OSTREE_SERIALIZED_COMMIT_VARIANT, @@ -2168,6 +2169,10 @@ checkout_one_directory (OstreeRepo *self, g_variant_get (dir->meta_data, "(uuuu@a(ayay))", &version, &uid, &gid, &mode, &xattr_variant); + version = GUINT32_FROM_BE (version); + uid = GUINT32_FROM_BE (uid); + gid = GUINT32_FROM_BE (gid); + mode = GUINT32_FROM_BE (mode); if (mkdir (dest_path, (mode_t)mode) < 0) { diff --git a/src/ot-builtin-log.c b/src/ot-builtin-log.c index 11ca664f..a53d14b0 100644 --- a/src/ot-builtin-log.c +++ b/src/ot-builtin-log.c @@ -101,6 +101,8 @@ ostree_builtin_log (int argc, char **argv, const char *prefix, GError **error) g_variant_get (commit, "(u@a{sv}&s&s&st&s&s)", &version, &commit_metadata, &parent, &subject, &body, ×tamp, &contents, &root_metadata); + version = GUINT32_FROM_BE (version); + timestamp = GUINT64_FROM_BE (timestamp); time_obj = g_date_time_new_from_unix_utc (timestamp); formatted_date = g_date_time_format (time_obj, "%a %b %d %H:%M:%S %Y %z"); g_date_time_unref (time_obj);