From 517109c5eaaa3e70ddde7dce5c8f3e0ab67319a0 Mon Sep 17 00:00:00 2001 From: Jonathan Lebon Date: Mon, 2 Oct 2017 14:48:03 +0000 Subject: [PATCH 01/98] build-sys: Post-release version bump Closes: #1236 Approved by: cgwalters --- configure.ac | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index e6980f7b..e5dbe16a 100644 --- a/configure.ac +++ b/configure.ac @@ -4,10 +4,10 @@ dnl update libostree-released.sym from libostree-devel.sym, and update the check dnl in test-symbols.sh, and also set is_release_build=yes below. Then make dnl another post-release commit to bump the version, and set is_release_build=no. m4_define([year_version], [2017]) -m4_define([release_version], [12]) +m4_define([release_version], [13]) m4_define([package_version], [year_version.release_version]) AC_INIT([libostree], [package_version], [walters@verbum.org]) -is_release_build=yes +is_release_build=no AC_CONFIG_HEADER([config.h]) AC_CONFIG_MACRO_DIR([buildutil]) AC_CONFIG_AUX_DIR([build-aux]) From 7da4c2162d5f2314a381dc68ea2cea9e4767133c Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Fri, 29 Sep 2017 15:31:03 -0400 Subject: [PATCH 02/98] lib/commit: Add some gtk-doc and internal doc comments Just making more of an effort for this for obvious reasons. We had a few public APIs not documented too. Closes: #1230 Approved by: jlebon --- src/libostree/ostree-repo-commit.c | 72 ++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 4 deletions(-) diff --git a/src/libostree/ostree-repo-commit.c b/src/libostree/ostree-repo-commit.c index c4484f44..0bf4078b 100644 --- a/src/libostree/ostree-repo-commit.c +++ b/src/libostree/ostree-repo-commit.c @@ -38,6 +38,10 @@ #include "ostree-checksum-input-stream.h" #include "ostree-varint.h" +/* The objects/ directory has a two-character directory prefix for checksums + * to avoid putting lots of files in a single directory. This technique + * is quite old, but Git also uses it for example. + */ gboolean _ostree_repo_ensure_loose_objdir_at (int dfd, const char *loose_path, @@ -60,6 +64,7 @@ _ostree_repo_ensure_loose_objdir_at (int dfd, return TRUE; } +/* This GVariant is the header for content objects (regfiles and symlinks) */ static GVariant * create_file_metadata (guint32 uid, guint32 gid, @@ -82,6 +87,7 @@ create_file_metadata (guint32 uid, return ret_metadata; } +/* bare-user repositories store file metadata as a user xattr */ gboolean _ostree_write_bareuser_metadata (int fd, guint32 uid, @@ -295,6 +301,7 @@ commit_loose_regfile_object (OstreeRepo *self, return TRUE; } +/* This is used by OSTREE_REPO_COMMIT_MODIFIER_FLAGS_GENERATE_SIZES */ typedef struct { goffset unpacked; @@ -424,6 +431,10 @@ _ostree_repo_open_content_bare (OstreeRepo *self, out_tmpf, error); } +/* Used by static deltas, which have a separate "push" flow for + * regfile objects distinct from the "pull" model used by + * write_content_object(). + */ gboolean _ostree_repo_commit_trusted_content_bare (OstreeRepo *self, const char *checksum, @@ -446,6 +457,10 @@ _ostree_repo_commit_trusted_content_bare (OstreeRepo *self, cancellable, error); } +/* Allocate an O_TMPFILE, write everything from @input to it, but + * not exceeding @length. Used for every object in archive repos, + * and content objects in all bare-type repos. + */ static gboolean create_regular_tmpfile_linkable_with_content (OstreeRepo *self, guint64 length, @@ -498,7 +513,12 @@ create_regular_tmpfile_linkable_with_content (OstreeRepo *self, return TRUE; } -/* Write a content object. */ +/* The main driver for writing a content (regfile or symlink) object. + * There are a variety of tricky cases here; for example, bare-user + * repos store symlinks as regular files. Computing checksums + * is optional; if @out_csum is `NULL`, we assume the caller already + * knows the checksum. + */ static gboolean write_content_object (OstreeRepo *self, const char *expected_checksum, @@ -766,6 +786,7 @@ write_content_object (OstreeRepo *self, return TRUE; } +/* Main driver for writing a metadata (non-content) object. */ static gboolean write_metadata_object (OstreeRepo *self, OstreeObjectType objtype, @@ -888,6 +909,9 @@ write_metadata_object (OstreeRepo *self, return TRUE; } +/* Look in a single subdirectory of objects/, building up the + * (device,inode) → checksum map. + */ static gboolean scan_one_loose_devino (OstreeRepo *self, int object_dir_fd, @@ -969,6 +993,7 @@ scan_one_loose_devino (OstreeRepo *self, return TRUE; } +/* Used by ostree_repo_scan_hardlinks(); see that function for more information. */ static gboolean scan_loose_devino (OstreeRepo *self, GHashTable *devino_cache, @@ -995,6 +1020,8 @@ scan_loose_devino (OstreeRepo *self, return TRUE; } +/* Loook up a (device,inode) pair in our cache, and see if it maps to a known + * checksum. */ static const char * devino_cache_lookup (OstreeRepo *self, OstreeRepoCommitModifier *modifier, @@ -1122,6 +1149,12 @@ ostree_repo_prepare_transaction (OstreeRepo *self, return TRUE; } +/* Called for commit, to iterate over the "staging" directory and rename all the + * objects into the primary objects/ location. Notably this is called only after + * syncfs() has potentially been invoked to ensure that all objects have been + * written to disk. In the future we may enhance this; see + * https://github.com/ostreedev/ostree/issues/1184 + */ static gboolean rename_pending_loose_objects (OstreeRepo *self, GCancellable *cancellable, @@ -1217,6 +1250,12 @@ rename_pending_loose_objects (OstreeRepo *self, return TRUE; } +/* Look in repo/tmp and delete files that are older than a day (by default). + * This used to be primarily used by the libsoup fetcher which stored partially + * written objects. In practice now that that isn't done anymore, we should + * use different logic here. Some more information in + * https://github.com/ostreedev/ostree/issues/713 + */ static gboolean cleanup_tmpdir (OstreeRepo *self, GCancellable *cancellable, @@ -1560,6 +1599,17 @@ ostree_repo_commit_transaction (OstreeRepo *self, return TRUE; } +/** + * ostree_repo_abort_transaction: + * @self: An #OstreeRepo + * @cancellable: Cancellable + * @error: Error + * + * Abort the active transaction; any staged objects and ref changes will be + * discarded. You *must* invoke this if you have chosen not to invoke + * ostree_repo_commit_transaction(). Calling this function when not in a + * transaction will do nothing and return successfully. + */ gboolean ostree_repo_abort_transaction (OstreeRepo *self, GCancellable *cancellable, @@ -1814,6 +1864,15 @@ ostree_repo_write_metadata_async (OstreeRepo *self, g_object_unref (asyncdata->result); } +/** + * ostree_repo_write_metadata_finish: + * @self: Repo + * @result: Result + * @out_csum: (out) (array fixed-size=32) (element-type guint8): Binary checksum value + * @error: Error + * + * Complete a call to ostree_repo_write_metadata_async(). + */ gboolean ostree_repo_write_metadata_finish (OstreeRepo *self, GAsyncResult *result, @@ -1835,6 +1894,9 @@ ostree_repo_write_metadata_finish (OstreeRepo *self, return TRUE; } +/* Write an object of type OSTREE_OBJECT_TYPE_DIR_META, using @file_info and @xattrs. + * Return its (binary) checksum in @out_csum. + */ gboolean _ostree_repo_write_directory_meta (OstreeRepo *self, GFileInfo *file_info, @@ -1843,13 +1905,11 @@ _ostree_repo_write_directory_meta (OstreeRepo *self, GCancellable *cancellable, GError **error) { - g_autoptr(GVariant) dirmeta = NULL; if (g_cancellable_set_error_if_cancelled (cancellable, error)) return FALSE; - dirmeta = ostree_create_directory_metadata (file_info, xattrs); - + g_autoptr(GVariant) dirmeta = ostree_create_directory_metadata (file_info, xattrs); return ostree_repo_write_metadata (self, OSTREE_OBJECT_TYPE_DIR_META, NULL, dirmeta, out_csum, cancellable, error); } @@ -2230,6 +2290,9 @@ ostree_repo_write_commit_detached_metadata (OstreeRepo *self, return TRUE; } +/* This generates an in-memory OSTREE_OBJECT_TYPE_DIR_TREE variant, using the + * content objects and subdirectories. The input hashes will be sorted + */ static GVariant * create_tree_variant_from_hashes (GHashTable *file_checksums, GHashTable *dir_contents_checksums, @@ -2341,6 +2404,7 @@ _ostree_repo_commit_modifier_apply (OstreeRepo *self, return result; } +/* Convert @path into a string */ static char * ptrarray_path_join (GPtrArray *path) { From 06c731bfa326798a70b0115a7f348b9ebbdf63da Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Fri, 29 Sep 2017 17:20:10 -0400 Subject: [PATCH 03/98] lib/sysroot: Add some more comments Also avoid gtk-doc style for private functions, as it tries to parse them and complains since they aren't public. Closes: #1230 Approved by: jlebon --- src/libostree/ostree-sysroot-deploy.c | 80 ++++++++++++++++++--------- 1 file changed, 54 insertions(+), 26 deletions(-) diff --git a/src/libostree/ostree-sysroot-deploy.c b/src/libostree/ostree-sysroot-deploy.c index a89711f9..4f453034 100644 --- a/src/libostree/ostree-sysroot-deploy.c +++ b/src/libostree/ostree-sysroot-deploy.c @@ -118,6 +118,7 @@ hardlink_or_copy_at (int src_dfd, return TRUE; } +/* Copy ownership, mode, and xattrs from source directory to destination */ static gboolean dirfd_copy_attributes_and_xattrs (int src_parent_dfd, const char *src_name, @@ -212,6 +213,9 @@ copy_dir_recurse (int src_parent_dfd, return TRUE; } +/* If a chain of directories is added, this function will ensure + * they're created. + */ static gboolean ensure_directory_from_template (int orig_etc_fd, int modified_etc_fd, @@ -274,12 +278,9 @@ ensure_directory_from_template (int orig_etc_fd, return TRUE; } -/** - * copy_modified_config_file: - * - * Copy @file from @modified_etc to @new_etc, overwriting any existing - * file there. The @file may refer to a regular file, a symbolic - * link, or a directory. Directories will be copied recursively. +/* Copy (relative) @path from @modified_etc_fd to @new_etc_fd, overwriting any + * existing file there. The @path may refer to a regular file, a symbolic link, + * or a directory. Directories will be copied recursively. */ static gboolean copy_modified_config_file (int orig_etc_fd, @@ -490,11 +491,9 @@ merge_configuration_from (OstreeSysroot *sysroot, return TRUE; } -/** - * checkout_deployment_tree: - * - * Look up @revision in the repository, and check it out in +/* Look up @revision in the repository, and check it out in * /ostree/deploy/OS/deploy/${treecsum}.${deployserial}. + * A dfd for the result is returned in @out_deployment_dfd. */ static gboolean checkout_deployment_tree (OstreeSysroot *sysroot, @@ -676,6 +675,9 @@ selinux_relabel_dir (OstreeSysroot *sysroot, return ret; } +/* Handles SELinux labeling for /var; this is slated to be deleted. See + * https://github.com/ostreedev/ostree/pull/872 + */ static gboolean selinux_relabel_var_if_needed (OstreeSysroot *sysroot, OstreeSePolicy *sepolicy, @@ -730,6 +732,11 @@ selinux_relabel_var_if_needed (OstreeSysroot *sysroot, return TRUE; } +/* OSTree implements a "3 way" merge model for /etc. For a bit more information + * on this, see the manual. This function uses the configuration for + * @previous_deployment, and writes the merged configuration into @deployment's + * /etc. If available, we also load the SELinux policy from the new root. + */ static gboolean merge_configuration (OstreeSysroot *sysroot, OstreeRepo *repo, @@ -820,6 +827,7 @@ merge_configuration (OstreeSysroot *sysroot, return TRUE; } +/* Write the origin file for a deployment. */ static gboolean write_origin_file_internal (OstreeSysroot *sysroot, OstreeDeployment *deployment, @@ -1391,6 +1399,12 @@ full_system_sync (OstreeSysroot *self, return TRUE; } +/* Write out the "bootlinks", which are symlinks pointing to deployments. + * We might be generating a new bootversion (i.e. updating the bootloader config), + * or we might just be generating a "sub-bootversion". + * + * These new links are made active by swap_bootlinks(). + */ static gboolean create_new_bootlinks (OstreeSysroot *self, int bootversion, @@ -1451,6 +1465,8 @@ create_new_bootlinks (OstreeSysroot *self, return TRUE; } +/* Rename into place symlinks created via create_new_bootlinks(). + */ static gboolean swap_bootlinks (OstreeSysroot *self, int bootversion, @@ -1512,10 +1528,9 @@ parse_os_release (const char *contents, return ret; } -/* - * install_deployment_kernel: - * - * Write out an entry in /boot/loader/entries for @deployment. +/* Given @deployment, prepare it to be booted; basically copying its + * kernel/initramfs into /boot/ostree (if needed) and writing out an entry in + * /boot/loader/entries. */ static gboolean install_deployment_kernel (OstreeSysroot *sysroot, @@ -1698,6 +1713,10 @@ install_deployment_kernel (OstreeSysroot *sysroot, return TRUE; } +/* We generate the symlink on disk, then potentially do a syncfs() to ensure + * that it (and everything else we wrote) has hit disk. Only after that do we + * rename it into place. + */ static gboolean prepare_new_bootloader_link (OstreeSysroot *sysroot, int current_bootversion, @@ -1719,6 +1738,7 @@ prepare_new_bootloader_link (OstreeSysroot *sysroot, return TRUE; } +/* Update the /boot/loader symlink to point to /boot/loader.$new_bootversion */ static gboolean swap_bootloader (OstreeSysroot *sysroot, int current_bootversion, @@ -1778,6 +1798,15 @@ assign_bootserials (GPtrArray *deployments) return ret; } +/* OSTree implements a special optimization where we want to avoid touching + * the bootloader configuration if the kernel layout hasn't changed. This is + * handled by the ostree= kernel argument referring to a "bootlink". But + * we *do* need to update the bootloader configuration if the kernel arguments + * change. + * + * Hence, this function determines if @a and @b are fully compatible from a + * bootloader perspective. + */ static gboolean deployment_bootconfigs_equal (OstreeDeployment *a, OstreeDeployment *b) @@ -1841,6 +1870,11 @@ cleanup_legacy_current_symlinks (OstreeSysroot *self, return TRUE; } +/* Detect whether or not @path refers to a read-only mountpoint. This is + * currently just used to handle a potentially read-only /boot by transiently + * remounting it read-write. In the future we might also do this for e.g. + * /sysroot. + */ static gboolean is_ro_mount (const char *path) { @@ -2380,22 +2414,16 @@ ostree_sysroot_deployment_set_kargs (OstreeSysroot *self, GCancellable *cancellable, GError **error) { - guint i; - g_autoptr(GPtrArray) new_deployments = g_ptr_array_new_with_free_func (g_object_unref); - g_autoptr(OstreeDeployment) new_deployment = NULL; - __attribute__((cleanup(_ostree_kernel_args_cleanup))) OstreeKernelArgs *kargs = NULL; - g_autofree char *new_options = NULL; - OstreeBootconfigParser *new_bootconfig; + g_autoptr(OstreeDeployment) new_deployment = ostree_deployment_clone (deployment); + OstreeBootconfigParser *new_bootconfig = ostree_deployment_get_bootconfig (new_deployment); - new_deployment = ostree_deployment_clone (deployment); - new_bootconfig = ostree_deployment_get_bootconfig (new_deployment); - - kargs = _ostree_kernel_args_new (); + __attribute__((cleanup(_ostree_kernel_args_cleanup))) OstreeKernelArgs *kargs = _ostree_kernel_args_new (); _ostree_kernel_args_append_argv (kargs, new_kargs); - new_options = _ostree_kernel_args_to_string (kargs); + g_autofree char *new_options = _ostree_kernel_args_to_string (kargs); ostree_bootconfig_parser_set (new_bootconfig, "options", new_options); - for (i = 0; i < self->deployments->len; i++) + g_autoptr(GPtrArray) new_deployments = g_ptr_array_new_with_free_func (g_object_unref); + for (guint i = 0; i < self->deployments->len; i++) { OstreeDeployment *cur = self->deployments->pdata[i]; if (cur == deployment) From b8c15ae859de7a353b99c98c6266ee626cd94e7e Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Mon, 2 Oct 2017 11:24:05 -0400 Subject: [PATCH 04/98] lib/pull: Fix regression with pull-local for nonexistent refs I was reading the pull code for the last release, and spotted a bug in commit f923c2e1eaebe0c781f07d34ae1a03f94357bccd - in the case where the ref doesn't exist, we don't set an error, tripping an assertion in the main code. The previous code wanted the ref to always exist, so just flip back the boolean for "ignore noent". I moved the `g_strchomp()` just into the HTTP path - if a local repo is corrupted in this way it's something to fix in that repo. Closes: #1238 Approved by: pwithnall --- src/libostree/ostree-repo-pull.c | 13 ++++++------- tests/pull-test.sh | 10 +++++++++- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/libostree/ostree-repo-pull.c b/src/libostree/ostree-repo-pull.c index 8a699ca0..d5062e01 100644 --- a/src/libostree/ostree-repo-pull.c +++ b/src/libostree/ostree-repo-pull.c @@ -844,7 +844,7 @@ fetch_ref_contents (OtPullData *pull_data, { #ifdef OSTREE_ENABLE_EXPERIMENTAL_API if (!ostree_repo_resolve_collection_ref (pull_data->remote_repo_local, - ref, TRUE /* ignore enoent */, + ref, FALSE, OSTREE_REPO_RESOLVE_REV_EXT_NONE, &ret_contents, cancellable, error)) return FALSE; @@ -855,7 +855,7 @@ fetch_ref_contents (OtPullData *pull_data, else if (pull_data->remote_repo_local != NULL) { if (!ostree_repo_resolve_rev_ext (pull_data->remote_repo_local, - ref->ref_name, TRUE /* ignore enoent */, + ref->ref_name, FALSE, OSTREE_REPO_RESOLVE_REV_EXT_NONE, &ret_contents, error)) return FALSE; @@ -874,14 +874,13 @@ fetch_ref_contents (OtPullData *pull_data, filename, &ret_contents, cancellable, error)) return FALSE; + + g_strchomp (ret_contents); } - /* Validate and return. */ - if (ret_contents != NULL) - g_strchomp (ret_contents); + g_assert (ret_contents); - if (ret_contents == NULL || - !ostree_validate_checksum_string (ret_contents, error)) + if (!ostree_validate_checksum_string (ret_contents, error)) return glnx_prefix_error (error, "Fetching checksum for ref (%s, %s)", ref->collection_id ? ref->collection_id : "(empty)", ref->ref_name); diff --git a/tests/pull-test.sh b/tests/pull-test.sh index 7d4b57f9..2afc0aca 100644 --- a/tests/pull-test.sh +++ b/tests/pull-test.sh @@ -35,7 +35,7 @@ function verify_initial_contents() { assert_file_has_content baz/cow '^moo$' } -echo "1..31" +echo "1..32" # Try both syntaxes repo_init --no-gpg-verify @@ -238,6 +238,14 @@ ${CMD_PREFIX} ostree --repo=mirrorrepo-local rev-parse localbranch ${CMD_PREFIX} ostree --repo=mirrorrepo-local fsck echo "ok pull-local mirror errors with mixed refs" +rm -f otherrepo/summary +if ${CMD_PREFIX} ostree --repo=mirrorrepo-local pull-local otherrepo nosuchbranch 2>err.txt; then + fatal "pulled nonexistent branch" +fi +# So true +assert_file_has_content_literal err.txt "error: Refspec 'nosuchbranch' not found" +echo "ok pull-local nonexistent branch" + cd ${test_tmpdir} ${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo commit -b main -s "Metadata string" --add-detached-metadata-string=SIGNATURE=HANCOCK --tree=ref=main ${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo summary -u From fcb1e87f829235d0e30cf71ff392f3e1ca63a9a3 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Sun, 1 Oct 2017 10:52:15 -0700 Subject: [PATCH 05/98] lib/syslinux: Port to fd-relative Prep for `ostree_sysroot_new_at()`. Also just generally nicer. Closes: #1237 Approved by: jlebon --- src/libostree/ostree-bootloader-syslinux.c | 26 +++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/libostree/ostree-bootloader-syslinux.c b/src/libostree/ostree-bootloader-syslinux.c index 157cb51f..85b84e61 100644 --- a/src/libostree/ostree-bootloader-syslinux.c +++ b/src/libostree/ostree-bootloader-syslinux.c @@ -25,12 +25,13 @@ #include +static const char syslinux_config_path[] = "boot/syslinux/syslinux.cfg"; + struct _OstreeBootloaderSyslinux { GObject parent_instance; OstreeSysroot *sysroot; - GFile *config_path; }; typedef GObjectClass OstreeBootloaderSyslinuxClass; @@ -46,8 +47,11 @@ _ostree_bootloader_syslinux_query (OstreeBootloader *bootloader, GError **error) { OstreeBootloaderSyslinux *self = OSTREE_BOOTLOADER_SYSLINUX (bootloader); + struct stat stbuf; - *out_is_active = g_file_query_file_type (self->config_path, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL) == G_FILE_TYPE_SYMBOLIC_LINK; + if (!glnx_fstatat_allow_noent (self->sysroot->sysroot_fd, syslinux_config_path, &stbuf, AT_SYMLINK_NOFOLLOW, error)) + return FALSE; + *out_is_active = (errno == 0); return TRUE; } @@ -107,12 +111,12 @@ _ostree_bootloader_syslinux_write_config (OstreeBootloader *bootloader, { OstreeBootloaderSyslinux *self = OSTREE_BOOTLOADER_SYSLINUX (bootloader); - g_autoptr(GFile) new_config_path = - ot_gfile_resolve_path_printf (self->sysroot->path, "boot/loader.%d/syslinux.cfg", bootversion); + g_autofree char *new_config_path = + g_strdup_printf ("boot/loader.%d/syslinux.cfg", bootversion); /* This should follow the symbolic link to the current bootversion. */ g_autofree char *config_contents = - glnx_file_get_contents_utf8_at (AT_FDCWD, gs_file_get_path_cached (self->config_path), NULL, + glnx_file_get_contents_utf8_at (self->sysroot->sysroot_fd, syslinux_config_path, NULL, cancellable, error); if (!config_contents) return FALSE; @@ -206,12 +210,10 @@ _ostree_bootloader_syslinux_write_config (OstreeBootloader *bootloader, return FALSE; g_autofree char *new_config_contents = _ostree_sysroot_join_lines (new_lines); - g_autoptr(GBytes) new_config_contents_bytes = - g_bytes_new_static (new_config_contents, - strlen (new_config_contents)); - - if (!ot_gfile_replace_contents_fsync (new_config_path, new_config_contents_bytes, - cancellable, error)) + if (!glnx_file_replace_contents_at (self->sysroot->sysroot_fd, new_config_path, + (guint8*)new_config_contents, strlen (new_config_contents), + GLNX_FILE_REPLACE_DATASYNC_NEW, + cancellable, error)) return FALSE; return TRUE; @@ -223,7 +225,6 @@ _ostree_bootloader_syslinux_finalize (GObject *object) OstreeBootloaderSyslinux *self = OSTREE_BOOTLOADER_SYSLINUX (object); g_clear_object (&self->sysroot); - g_clear_object (&self->config_path); G_OBJECT_CLASS (_ostree_bootloader_syslinux_parent_class)->finalize (object); } @@ -254,6 +255,5 @@ _ostree_bootloader_syslinux_new (OstreeSysroot *sysroot) { OstreeBootloaderSyslinux *self = g_object_new (OSTREE_TYPE_BOOTLOADER_SYSLINUX, NULL); self->sysroot = g_object_ref (sysroot); - self->config_path = g_file_resolve_relative_path (self->sysroot->path, "boot/syslinux/syslinux.cfg"); return self; } From 9fffc27cfb8b01d8edb13649324b628634a9b940 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Sun, 1 Oct 2017 16:34:30 -0400 Subject: [PATCH 06/98] lib/uboot: Port to fd-relative Prep for `ostree_sysroot_new_at()`. Closes: #1237 Approved by: jlebon --- src/libostree/ostree-bootloader-uboot.c | 42 ++++++++++--------------- 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/src/libostree/ostree-bootloader-uboot.c b/src/libostree/ostree-bootloader-uboot.c index 5a51aae6..81791e1c 100644 --- a/src/libostree/ostree-bootloader-uboot.c +++ b/src/libostree/ostree-bootloader-uboot.c @@ -29,12 +29,13 @@ #include +static const char uboot_config_path[] = "boot/loader/uEnv.txt"; + struct _OstreeBootloaderUboot { GObject parent_instance; OstreeSysroot *sysroot; - GFile *config_path; }; typedef GObjectClass OstreeBootloaderUbootClass; @@ -50,8 +51,11 @@ _ostree_bootloader_uboot_query (OstreeBootloader *bootloader, GError **error) { OstreeBootloaderUboot *self = OSTREE_BOOTLOADER_UBOOT (bootloader); + struct stat stbuf; - *out_is_active = g_file_query_file_type (self->config_path, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL) == G_FILE_TYPE_REGULAR; + if (!glnx_fstatat_allow_noent (self->sysroot->sysroot_fd, uboot_config_path, &stbuf, AT_SYMLINK_NOFOLLOW, error)) + return FALSE; + *out_is_active = (errno == 0); return TRUE; } @@ -156,36 +160,26 @@ _ostree_bootloader_uboot_write_config (OstreeBootloader *bootloader, GError **error) { OstreeBootloaderUboot *self = OSTREE_BOOTLOADER_UBOOT (bootloader); - g_autoptr(GFile) new_config_path = NULL; - g_autofree char *config_contents = NULL; - g_autofree char *new_config_contents = NULL; - g_autoptr(GPtrArray) new_lines = NULL; /* This should follow the symbolic link to the current bootversion. */ - config_contents = glnx_file_get_contents_utf8_at (AT_FDCWD, gs_file_get_path_cached (self->config_path), NULL, - cancellable, error); + g_autofree char *config_contents = + glnx_file_get_contents_utf8_at (self->sysroot->sysroot_fd, uboot_config_path, NULL, + cancellable, error); if (!config_contents) return FALSE; - new_config_path = ot_gfile_resolve_path_printf (self->sysroot->path, "boot/loader.%d/uEnv.txt", - bootversion); - - new_lines = g_ptr_array_new_with_free_func (g_free); - + g_autoptr(GPtrArray) new_lines = g_ptr_array_new_with_free_func (g_free); if (!create_config_from_boot_loader_entries (self, bootversion, new_lines, cancellable, error)) return FALSE; - new_config_contents = _ostree_sysroot_join_lines (new_lines); - { - g_autoptr(GBytes) new_config_contents_bytes = - g_bytes_new_static (new_config_contents, - strlen (new_config_contents)); - - if (!ot_gfile_replace_contents_fsync (new_config_path, new_config_contents_bytes, - cancellable, error)) - return FALSE; - } + g_autofree char *new_config_path = g_strdup_printf ("boot/loader.%d/uEnv.txt", bootversion); + g_autofree char *new_config_contents = _ostree_sysroot_join_lines (new_lines); + if (!glnx_file_replace_contents_at (self->sysroot->sysroot_fd, new_config_path, + (guint8*)new_config_contents, strlen (new_config_contents), + GLNX_FILE_REPLACE_DATASYNC_NEW, + cancellable, error)) + return FALSE; return TRUE; } @@ -196,7 +190,6 @@ _ostree_bootloader_uboot_finalize (GObject *object) OstreeBootloaderUboot *self = OSTREE_BOOTLOADER_UBOOT (object); g_clear_object (&self->sysroot); - g_clear_object (&self->config_path); G_OBJECT_CLASS (_ostree_bootloader_uboot_parent_class)->finalize (object); } @@ -227,6 +220,5 @@ _ostree_bootloader_uboot_new (OstreeSysroot *sysroot) { OstreeBootloaderUboot *self = g_object_new (OSTREE_TYPE_BOOTLOADER_UBOOT, NULL); self->sysroot = g_object_ref (sysroot); - self->config_path = g_file_resolve_relative_path (self->sysroot->path, "boot/loader/uEnv.txt"); return self; } From 030e3efbc41f1f4f8d3fd2c64da235869b0f6f0b Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Mon, 2 Oct 2017 18:04:37 +0100 Subject: [PATCH 07/98] lib/bloom: Add some missing preconditions on n_bytes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit These shouldn’t change the bloom filter’s behaviour at all, but make it a bit more obvious what the programmatical limitations are on the sizes it can deal with. In reality, those sizes should never be reached because they won’t fit in a DNS-SD record. Signed-off-by: Philip Withnall Closes: #1239 Approved by: cgwalters --- src/libostree/ostree-bloom.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/libostree/ostree-bloom.c b/src/libostree/ostree-bloom.c index 9bd2ad28..c6de2640 100644 --- a/src/libostree/ostree-bloom.c +++ b/src/libostree/ostree-bloom.c @@ -76,7 +76,7 @@ struct _OstreeBloom { guint ref_count; - gsize n_bytes; + gsize n_bytes; /* 0 < n_bytes <= G_MAXSIZE / 8 */ gboolean is_mutable; /* determines which of [im]mutable_bytes is accessed */ union { @@ -117,6 +117,7 @@ ostree_bloom_new (gsize n_bytes, g_autoptr(OstreeBloom) bloom = NULL; g_return_val_if_fail (n_bytes > 0, NULL); + g_return_val_if_fail (n_bytes <= G_MAXSIZE / 8, NULL); g_return_val_if_fail (k > 0, NULL); g_return_val_if_fail (hash_func != NULL, NULL); @@ -159,6 +160,7 @@ ostree_bloom_new_from_bytes (GBytes *bytes, g_return_val_if_fail (bytes != NULL, NULL); g_return_val_if_fail (g_bytes_get_size (bytes) > 0, NULL); + g_return_val_if_fail (g_bytes_get_size (bytes) <= G_MAXSIZE / 8, NULL); g_return_val_if_fail (k > 0, NULL); g_return_val_if_fail (hash_func != NULL, NULL); From be100e0ee26e6a4abb7865d13d4aaaa52d603759 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Mon, 2 Oct 2017 15:36:47 -0400 Subject: [PATCH 08/98] lib/pull: Minor cleanup to metadata scanning function, add docs I'm regretting a bit having the `guint8*csum` variant of checksums except for the serialized form. Once we start doing processing it's easier to just have it remain hex. Do an on-stack conversion for the metadata scanning function; this drops a malloc and also just looks nicer. Also add some long-awaited function comments to the two. Closes: #1240 Approved by: jlebon --- src/libostree/ostree-repo-pull.c | 83 +++++++++++++++++--------------- 1 file changed, 44 insertions(+), 39 deletions(-) diff --git a/src/libostree/ostree-repo-pull.c b/src/libostree/ostree-repo-pull.c index d5062e01..a404b8a7 100644 --- a/src/libostree/ostree-repo-pull.c +++ b/src/libostree/ostree-repo-pull.c @@ -209,14 +209,14 @@ static void queue_scan_one_metadata_object_c (OtPullData *pull_da guint recursion_depth, const OstreeCollectionRef *ref); -static gboolean scan_one_metadata_object_c (OtPullData *pull_data, - const guchar *csum, - OstreeObjectType objtype, - const char *path, - guint recursion_depth, - const OstreeCollectionRef *ref, - GCancellable *cancellable, - GError **error); +static gboolean scan_one_metadata_object (OtPullData *pull_data, + const char *checksum, + OstreeObjectType objtype, + const char *path, + guint recursion_depth, + const OstreeCollectionRef *ref, + GCancellable *cancellable, + GError **error); static void scan_object_queue_data_free (ScanObjectQueueData *scan_data); static gboolean @@ -450,6 +450,11 @@ scan_object_queue_data_free (ScanObjectQueueData *scan_data) g_free (scan_data); } +/* Called out of the main loop to process the "scan object queue", which is a + * queue of metadata objects (commits and dirtree, but not dirmeta) to parse to + * look for further objects. Basically wraps execution of + * `scan_one_metadata_object()`. + */ static gboolean idle_worker (gpointer user_data) { @@ -464,14 +469,11 @@ idle_worker (gpointer user_data) return G_SOURCE_REMOVE; } - scan_one_metadata_object_c (pull_data, - scan_data->csum, - scan_data->objtype, - scan_data->path, - scan_data->recursion_depth, - scan_data->requested_ref, - pull_data->cancellable, - &error); + char checksum[OSTREE_SHA256_STRING_LEN+1]; + ostree_checksum_inplace_from_bytes (scan_data->csum, checksum); + scan_one_metadata_object (pull_data, checksum, scan_data->objtype, + scan_data->path, scan_data->recursion_depth, + scan_data->requested_ref, pull_data->cancellable, &error); check_outstanding_requests_handle_error (pull_data, &error); scan_object_queue_data_free (scan_data); @@ -1752,18 +1754,21 @@ queue_scan_one_metadata_object_c (OtPullData *pull_data, ensure_idle_queued (pull_data); } +/* Called out of the main loop to look at metadata objects which can have + * further references (commit, dirtree). See also idle_worker() which drives + * execution of this function. + */ static gboolean -scan_one_metadata_object_c (OtPullData *pull_data, - const guchar *csum, - OstreeObjectType objtype, - const char *path, - guint recursion_depth, - const OstreeCollectionRef *ref, - GCancellable *cancellable, - GError **error) +scan_one_metadata_object (OtPullData *pull_data, + const char *checksum, + OstreeObjectType objtype, + const char *path, + guint recursion_depth, + const OstreeCollectionRef *ref, + GCancellable *cancellable, + GError **error) { - g_autofree char *tmp_checksum = ostree_checksum_from_bytes (csum); - g_autoptr(GVariant) object = ostree_object_name_serialize (tmp_checksum, objtype); + g_autoptr(GVariant) object = ostree_object_name_serialize (checksum, objtype); /* It may happen that we've already looked at this object (think shared * dirtree subtrees), if that's the case, we're done */ @@ -1773,7 +1778,7 @@ scan_one_metadata_object_c (OtPullData *pull_data, gboolean is_requested = g_hash_table_lookup (pull_data->requested_metadata, object) != NULL; /* Determine if we already have the object */ gboolean is_stored; - if (!ostree_repo_has_object (pull_data->repo, objtype, tmp_checksum, &is_stored, + if (!ostree_repo_has_object (pull_data->repo, objtype, checksum, &is_stored, cancellable, error)) return FALSE; @@ -1783,19 +1788,19 @@ scan_one_metadata_object_c (OtPullData *pull_data, if (objtype == OSTREE_OBJECT_TYPE_COMMIT) { /* mark as partial to ensure we scan the commit below */ - if (!write_commitpartial_for (pull_data, tmp_checksum, error)) + if (!write_commitpartial_for (pull_data, checksum, error)) return FALSE; } if (!_ostree_repo_import_object (pull_data->repo, pull_data->remote_repo_local, - objtype, tmp_checksum, pull_data->importflags, + objtype, checksum, pull_data->importflags, cancellable, error)) return FALSE; /* The import API will fetch both the commit and detached metadata, so * add it to the hash to avoid re-fetching it below. */ if (objtype == OSTREE_OBJECT_TYPE_COMMIT) - g_hash_table_add (pull_data->fetched_detached_metadata, g_strdup (tmp_checksum)); + g_hash_table_add (pull_data->fetched_detached_metadata, g_strdup (checksum)); pull_data->n_imported_metadata++; is_stored = TRUE; is_requested = TRUE; @@ -1808,7 +1813,7 @@ scan_one_metadata_object_c (OtPullData *pull_data, OstreeRepo *refd_repo = pull_data->localcache_repos->pdata[i]; gboolean localcache_repo_has_obj; - if (!ostree_repo_has_object (refd_repo, objtype, tmp_checksum, + if (!ostree_repo_has_object (refd_repo, objtype, checksum, &localcache_repo_has_obj, cancellable, error)) return FALSE; if (!localcache_repo_has_obj) @@ -1816,16 +1821,16 @@ scan_one_metadata_object_c (OtPullData *pull_data, if (objtype == OSTREE_OBJECT_TYPE_COMMIT) { /* mark as partial to ensure we scan the commit below */ - if (!write_commitpartial_for (pull_data, tmp_checksum, error)) + if (!write_commitpartial_for (pull_data, checksum, error)) return FALSE; } if (!_ostree_repo_import_object (pull_data->repo, refd_repo, - objtype, tmp_checksum, pull_data->importflags, + objtype, checksum, pull_data->importflags, cancellable, error)) return FALSE; /* See comment above */ if (objtype == OSTREE_OBJECT_TYPE_COMMIT) - g_hash_table_add (pull_data->fetched_detached_metadata, g_strdup (tmp_checksum)); + g_hash_table_add (pull_data->fetched_detached_metadata, g_strdup (checksum)); is_stored = TRUE; is_requested = TRUE; pull_data->n_imported_metadata++; @@ -1840,18 +1845,18 @@ scan_one_metadata_object_c (OtPullData *pull_data, g_hash_table_add (pull_data->requested_metadata, g_variant_ref (object)); do_fetch_detached = (objtype == OSTREE_OBJECT_TYPE_COMMIT); - enqueue_one_object_request (pull_data, tmp_checksum, objtype, path, do_fetch_detached, FALSE, ref); + enqueue_one_object_request (pull_data, checksum, objtype, path, do_fetch_detached, FALSE, ref); } else if (is_stored && objtype == OSTREE_OBJECT_TYPE_COMMIT) { /* Even though we already have the commit, we always try to (re)fetch the * detached metadata before scanning it, in case new signatures appear. * https://github.com/projectatomic/rpm-ostree/issues/630 */ - if (!g_hash_table_contains (pull_data->fetched_detached_metadata, tmp_checksum)) - enqueue_one_object_request (pull_data, tmp_checksum, objtype, path, TRUE, TRUE, ref); + if (!g_hash_table_contains (pull_data->fetched_detached_metadata, checksum)) + enqueue_one_object_request (pull_data, checksum, objtype, path, TRUE, TRUE, ref); else { - if (!scan_commit_object (pull_data, tmp_checksum, recursion_depth, ref, + if (!scan_commit_object (pull_data, checksum, recursion_depth, ref, pull_data->cancellable, error)) return FALSE; @@ -1861,7 +1866,7 @@ scan_one_metadata_object_c (OtPullData *pull_data, } else if (is_stored && objtype == OSTREE_OBJECT_TYPE_DIR_TREE) { - if (!scan_dirtree_object (pull_data, tmp_checksum, path, recursion_depth, + if (!scan_dirtree_object (pull_data, checksum, path, recursion_depth, pull_data->cancellable, error)) return FALSE; From 133e9ae7338503d3143d172c92a7cac618e6735c Mon Sep 17 00:00:00 2001 From: Matthew Leeds Date: Mon, 2 Oct 2017 22:35:17 -0700 Subject: [PATCH 09/98] lib/gpg: Print debug info when reading GPG keys This commit adds debug output whenever libostree reads GPG keys, which can come from different locations in the file system. This is especially helpful in debugging "GPG signatures found, but none are in trusted keyring" errors, which in my case was caused by OSTree looking in /usr/local/share/ostree/trusted.gpg.d/ rather than /usr/share/ostree/trusted.gpg.d/. Closes: #1241 Approved by: cgwalters --- src/libostree/ostree-gpg-verifier.c | 12 +++++++++++- src/libostree/ostree-gpg-verifier.h | 3 ++- src/libostree/ostree-repo.c | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/libostree/ostree-gpg-verifier.c b/src/libostree/ostree-gpg-verifier.c index 660a5b7c..17655c1a 100644 --- a/src/libostree/ostree-gpg-verifier.c +++ b/src/libostree/ostree-gpg-verifier.c @@ -272,6 +272,9 @@ _ostree_gpg_verifier_add_keyring_file (OstreeGpgVerifier *self, { g_return_if_fail (G_IS_FILE (path)); + g_autofree gchar *path_str = g_file_get_path (path); + g_debug ("Adding GPG keyring file %s to verifier", path_str); + self->keyrings = g_list_append (self->keyrings, g_object_ref (path)); } @@ -280,8 +283,11 @@ _ostree_gpg_verifier_add_keyring_file (OstreeGpgVerifier *self, */ void _ostree_gpg_verifier_add_keyring_data (OstreeGpgVerifier *self, - GBytes *keyring) + GBytes *keyring, + const char *data_source) { + g_debug ("Adding GPG keyring data from %s to verifier", data_source); + g_ptr_array_add (self->keyring_data, g_bytes_ref (keyring)); } @@ -289,6 +295,8 @@ void _ostree_gpg_verifier_add_key_ascii_file (OstreeGpgVerifier *self, const char *path) { + g_debug ("Adding GPG key ASCII file %s to verifier", path); + if (!self->key_ascii_files) self->key_ascii_files = g_ptr_array_new_with_free_func (g_free); g_ptr_array_add (self->key_ascii_files, g_strdup (path)); @@ -319,6 +327,8 @@ _ostree_gpg_verifier_add_keyring_dir_at (OstreeGpgVerifier *self, &dfd_iter, error)) return FALSE; + g_debug ("Adding GPG keyring dir %s to verifier", path); + while (TRUE) { struct dirent *dent; diff --git a/src/libostree/ostree-gpg-verifier.h b/src/libostree/ostree-gpg-verifier.h index d0f02dbd..09c01b6c 100644 --- a/src/libostree/ostree-gpg-verifier.h +++ b/src/libostree/ostree-gpg-verifier.h @@ -65,7 +65,8 @@ gboolean _ostree_gpg_verifier_add_global_keyring_dir (OstreeGpgVerifier *s GError **error); void _ostree_gpg_verifier_add_keyring_data (OstreeGpgVerifier *self, - GBytes *data); + GBytes *data, + const char *data_source); void _ostree_gpg_verifier_add_keyring_file (OstreeGpgVerifier *self, GFile *path); diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c index 1e336e90..a3cfd6f5 100644 --- a/src/libostree/ostree-repo.c +++ b/src/libostree/ostree-repo.c @@ -4328,7 +4328,7 @@ _ostree_repo_gpg_verify_data_internal (OstreeRepo *self, if (keyring_data != NULL) { - _ostree_gpg_verifier_add_keyring_data (verifier, keyring_data); + _ostree_gpg_verifier_add_keyring_data (verifier, keyring_data, remote->keyring); add_global_keyring_dir = FALSE; } From 86e072bdbe48a4f16efb05c00eb79114e5fdbf61 Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Tue, 3 Oct 2017 15:45:34 +0100 Subject: [PATCH 10/98] lib/repo-commit: Import detached metadata even if hardlink exists Spotted while reading through the code, it looks like the copy_detached_metadata() call is accidentally omitted if a hardlink already exists for the .commit object. Signed-off-by: Philip Withnall Closes: #1242 Approved by: cgwalters --- src/libostree/ostree-repo-commit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libostree/ostree-repo-commit.c b/src/libostree/ostree-repo-commit.c index 0bf4078b..0060120f 100644 --- a/src/libostree/ostree-repo-commit.c +++ b/src/libostree/ostree-repo-commit.c @@ -3319,7 +3319,7 @@ import_one_object_direct (OstreeRepo *dest_repo, if (linkat (src_repo->objects_dir_fd, loose_path_buf, dest_dfd, loose_path_buf, 0) != 0) { if (errno == EEXIST) - return TRUE; + did_hardlink = TRUE; else if (errno == EMLINK || errno == EXDEV || errno == EPERM) { /* EMLINK, EXDEV and EPERM shouldn't be fatal; we just can't do From c3c13846ad1baadc388bcd37334bf17212af9c72 Mon Sep 17 00:00:00 2001 From: Jonathan Lebon Date: Tue, 3 Oct 2017 19:00:32 +0000 Subject: [PATCH 11/98] app/main: use HAVE_LIBCURL_OR_LIBSOUP for pull CLI We want `pull` to be included as long as we have at least either `libcurl` or `libsoup` to back it. Of course, this is a moot point for now since `libsoup` is currently a build requirement. Closes: #1244 Approved by: cgwalters --- src/ostree/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ostree/main.c b/src/ostree/main.c index e1ccf983..66cfae7f 100644 --- a/src/ostree/main.c +++ b/src/ostree/main.c @@ -51,7 +51,7 @@ static OstreeCommand commands[] = { { "ls", ostree_builtin_ls }, { "prune", ostree_builtin_prune }, { "pull-local", ostree_builtin_pull_local }, -#ifdef HAVE_LIBSOUP +#ifdef HAVE_LIBCURL_OR_LIBSOUP { "pull", ostree_builtin_pull }, #endif { "refs", ostree_builtin_refs }, From 43977dffdea5d2a640e9c0abd01c20b5d4a726f2 Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Wed, 4 Oct 2017 12:17:31 +0100 Subject: [PATCH 12/98] docs: Clarify %NULL argument to ostree_sysroot_new() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It’s equivalent to ostree_sysroot_new_default(). Signed-off-by: Philip Withnall Closes: #1246 Approved by: cgwalters --- src/libostree/ostree-sysroot.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/libostree/ostree-sysroot.c b/src/libostree/ostree-sysroot.c index fe61a12e..b49b4277 100644 --- a/src/libostree/ostree-sysroot.c +++ b/src/libostree/ostree-sysroot.c @@ -201,7 +201,12 @@ ostree_sysroot_init (OstreeSysroot *self) /** * ostree_sysroot_new: - * @path: (allow-none): Path to a system root directory, or %NULL + * @path: (allow-none): Path to a system root directory, or %NULL to use the + * current visible root file system + * + * Create a new #OstreeSysroot object for the sysroot at @path. If @path is %NULL, + * the current visible root file system is used, equivalent to + * ostree_sysroot_new_default(). * * Returns: (transfer full): An accessor object for an system root located at @path */ From 8a61f5423952db275c99876b273a8fb32f761eb1 Mon Sep 17 00:00:00 2001 From: Jonathan Lebon Date: Tue, 3 Oct 2017 21:34:43 +0000 Subject: [PATCH 13/98] ci: really turn on warnings We didn't have `-Wall` in our `CFLAGS`. It's normally injected by `configure.ac`, but because we *did* have `-Werror`, it was skipped. Now, we just turn it on unconditionally directly in `build.sh`. Closes: #1245 Approved by: cgwalters --- ci/build-check.sh | 9 ++++----- ci/build.sh | 7 ++++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ci/build-check.sh b/ci/build-check.sh index cb9dbb83..2f4ddaba 100755 --- a/ci/build-check.sh +++ b/ci/build-check.sh @@ -28,14 +28,13 @@ if test -x /usr/bin/gnome-desktop-testing-runner; then gnome-desktop-testing-runner -L ${resultsdir}/gdtr-results -p 0 ${INSTALLED_TESTS_PATTERN:-libostree/} fi +# And now a clang build to find unused variables because it does a better +# job than gcc for vars with cleanups; perhaps in the future these could +# parallelize if test -x /usr/bin/clang; then - # always fail on warnings; https://github.com/ostreedev/ostree/pull/971 # Except for clang-4.0: error: argument unused during compilation: '-specs=/usr/lib/rpm/redhat/redhat-hardened-cc1' [-Werror,-Wunused-command-line-argument] - export CFLAGS="-Wno-error=unused-command-line-argument -Werror ${CFLAGS:-}" + export CFLAGS="-Wall -Werror -Wno-error=unused-command-line-argument ${CFLAGS:-}" git clean -dfx && git submodule foreach git clean -dfx - # And now a clang build to find unused variables because it does a better - # job than gcc for vars with cleanups; perhaps in the future these could - # parallelize export CC=clang build fi diff --git a/ci/build.sh b/ci/build.sh index 572ae197..b56f57c6 100755 --- a/ci/build.sh +++ b/ci/build.sh @@ -18,9 +18,6 @@ if test -n "${CI_PKGS:-}"; then fi pkg_install_if_os fedora gjs gnome-desktop-testing parallel coccinelle clang -# always fail on warnings; https://github.com/ostreedev/ostree/pull/971 -export CFLAGS="-Werror ${CFLAGS:-}" - # Default libcurl on by default in fedora unless libsoup is enabled if sh -c '. /etc/os-release; test "${ID}" = fedora'; then case "${CONFIGOPTS:-}" in @@ -36,4 +33,8 @@ case "${CONFIGOPTS:-}" in ;; esac +# always fail on warnings; https://github.com/ostreedev/ostree/pull/971 +# NB: this disables the default set of flags from configure.ac +export CFLAGS="-Wall -Werror ${CFLAGS:-}" + build --enable-gtk-doc ${CONFIGOPTS:-} From 0c364337365986d4bf44bf0c30da6aab660384a5 Mon Sep 17 00:00:00 2001 From: Jonathan Lebon Date: Tue, 3 Oct 2017 21:34:43 +0000 Subject: [PATCH 14/98] tree: fix compiler warnings Mostly innocuous warnings, except for -Wtautological-compare, which caught a shady guint64 subtraction. Closes: #1245 Approved by: cgwalters --- src/libostree/ostree-fetcher-curl.c | 8 ++++---- src/libostree/ostree-repo.c | 1 - src/ostree/ot-main.c | 6 ++---- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/libostree/ostree-fetcher-curl.c b/src/libostree/ostree-fetcher-curl.c index 7aaabb78..dc85d3fe 100644 --- a/src/libostree/ostree-fetcher-curl.c +++ b/src/libostree/ostree-fetcher-curl.c @@ -693,7 +693,7 @@ adopt_steal_mainctx (OstreeFetcher *self, guint64 readytime = g_source_get_ready_time (self->timer_event); guint64 curtime = g_source_get_time (self->timer_event); guint64 timeout_micros = curtime - readytime; - if (timeout_micros < 0) + if (curtime < readytime) timeout_micros = 0; update_timeout_cb (self->multi, timeout_micros / 1000, self); } @@ -706,7 +706,7 @@ static void initiate_next_curl_request (FetcherRequest *req, GTask *task) { - CURLMcode rc; + CURLcode rc; OstreeFetcher *self = req->fetcher; if (req->easy) @@ -802,8 +802,8 @@ initiate_next_curl_request (FetcherRequest *req, curl_easy_setopt (req->easy, CURLOPT_WRITEDATA, task); curl_easy_setopt (req->easy, CURLOPT_PROGRESSDATA, task); - rc = curl_multi_add_handle (self->multi, req->easy); - g_assert (rc == CURLM_OK); + CURLMcode multi_rc = curl_multi_add_handle (self->multi, req->easy); + g_assert (multi_rc == CURLM_OK); } static void diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c index a3cfd6f5..50829152 100644 --- a/src/libostree/ostree-repo.c +++ b/src/libostree/ostree-repo.c @@ -4960,7 +4960,6 @@ _ostree_repo_allocate_tmpdir (int tmpdir_dfd, while (!ret_tmpdir.initialized) { struct dirent *dent; - glnx_fd_close int existing_tmpdir_fd = -1; g_autoptr(GError) local_error = NULL; if (!glnx_dirfd_iterator_next_dent (&dfd_iter, &dent, cancellable, error)) diff --git a/src/ostree/ot-main.c b/src/ostree/ot-main.c index 1f7e9382..8e8c4631 100644 --- a/src/ostree/ot-main.c +++ b/src/ostree/ot-main.c @@ -163,10 +163,8 @@ ostree_run (int argc, if (!command->fn) { - g_autoptr(GOptionContext) context = NULL; - g_autofree char *help = NULL; - - context = ostree_option_context_new_with_commands (commands); + g_autoptr(GOptionContext) context = + ostree_option_context_new_with_commands (commands); /* This will not return for some options (e.g. --version). */ if (ostree_option_context_parse (context, NULL, &argc, &argv, OSTREE_BUILTIN_FLAG_NO_REPO, NULL, cancellable, &error)) From e80efe0b0668a351361bb0a218a809434dd33d63 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Wed, 4 Oct 2017 10:22:05 -0400 Subject: [PATCH 15/98] lib/core: Init struct stat buffer Regression from d57410a7e62dcb89321807dcb2d91c85f9d26df7 Fixes Coverity CID #1457316 Closes: #1249 Approved by: jlebon --- src/libostree/ostree-core.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/libostree/ostree-core.c b/src/libostree/ostree-core.c index 08c28924..7fa051f2 100644 --- a/src/libostree/ostree-core.c +++ b/src/libostree/ostree-core.c @@ -1614,10 +1614,13 @@ _ostree_gfileinfo_equal (GFileInfo *a, GFileInfo *b) return TRUE; } +/* Many parts of libostree only care about mode,uid,gid - this creates + * a new GFileInfo with those fields see. + */ GFileInfo * _ostree_mode_uidgid_to_gfileinfo (mode_t mode, uid_t uid, gid_t gid) { - struct stat stbuf; + struct stat stbuf = { 0, }; stbuf.st_mode = mode; stbuf.st_uid = uid; stbuf.st_gid = gid; From 351ffdb9778436b193ba9d2fbeebe2358e55004f Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Wed, 4 Oct 2017 10:24:21 -0400 Subject: [PATCH 16/98] lib/sysroot: Fix pointer going out of scope in unlock code Fixes Coverity CID #1457317 Closes: #1249 Approved by: jlebon --- src/libostree/ostree-sysroot.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libostree/ostree-sysroot.c b/src/libostree/ostree-sysroot.c index b49b4277..984e16d5 100644 --- a/src/libostree/ostree-sysroot.c +++ b/src/libostree/ostree-sysroot.c @@ -1703,6 +1703,7 @@ ostree_sysroot_deployment_unlock (OstreeSysroot *self, return FALSE; const char *ovl_options = NULL; + static const char hotfix_ovl_options[] = "lowerdir=usr,upperdir=.usr-ovl-upper,workdir=.usr-ovl-work"; switch (unlocked_state) { case OSTREE_DEPLOYMENT_UNLOCKED_NONE: @@ -1710,7 +1711,6 @@ ostree_sysroot_deployment_unlock (OstreeSysroot *self, break; case OSTREE_DEPLOYMENT_UNLOCKED_HOTFIX: { - const char hotfix_ovl_options[] = "lowerdir=usr,upperdir=.usr-ovl-upper,workdir=.usr-ovl-work"; /* Create the overlayfs directories in the deployment root * directly for hotfixes. The ostree-prepare-root.c helper * is also set up to detect and mount these. From c511ca0fae0e352d52bb7d1a24b4c1d08c5a8ec9 Mon Sep 17 00:00:00 2001 From: Jonathan Lebon Date: Wed, 4 Oct 2017 14:41:15 +0000 Subject: [PATCH 17/98] lib/commit: minor coverity fix Appease Coverity by using the same condition for both the ternary check and the if-condition later on. It should be smart enough to figure out that `dir_enum == NULL` implies that `dfd_iter != NULL` from the assertion at the top of the function. Coverity CID: #1457318 Closes: #1250 Approved by: cgwalters --- src/libostree/ostree-repo-commit.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/libostree/ostree-repo-commit.c b/src/libostree/ostree-repo-commit.c index 0060120f..029dd01b 100644 --- a/src/libostree/ostree-repo-commit.c +++ b/src/libostree/ostree-repo-commit.c @@ -2654,7 +2654,7 @@ write_directory_content_to_mtree_internal (OstreeRepo *self, g_autoptr(GVariant) xattrs = NULL; gboolean xattrs_were_modified; if (!get_final_xattrs (self, modifier, child_relpath, child_info, child, - dfd_iter != NULL ? dfd_iter->fd : -1, name, &xattrs, + dir_enum != NULL ? -1 : dfd_iter->fd, name, &xattrs, &xattrs_were_modified, cancellable, error)) return FALSE; @@ -2677,14 +2677,16 @@ write_directory_content_to_mtree_internal (OstreeRepo *self, { if (g_file_info_get_file_type (modified_info) == G_FILE_TYPE_REGULAR) { - if (child != NULL) + if (dir_enum != NULL) { + g_assert (child != NULL); file_input = (GInputStream*)g_file_read (child, cancellable, error); if (!file_input) return FALSE; } else { + g_assert (dfd_iter != NULL); if (!ot_openat_read_stream (dfd_iter->fd, name, FALSE, &file_input, cancellable, error)) return FALSE; From 5c7d2dd8be3606d9aec1e6835086f6b4dfcdb6a7 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Wed, 4 Oct 2017 15:06:31 -0400 Subject: [PATCH 18/98] Deduplicate and fix up our use of mmap() Buried in this large patch is a logical fix: ``` - if (!map) - return glnx_throw_errno_prefix (error, "mmap"); + if (map == (void*)-1) + return glnx_null_throw_errno_prefix (error, "mmap"); ``` Which would have helped me debug another patch I was working on. But it turns out that actually correctly checking for errors from `mmap()` triggers lots of other bugs - basically because we sometimes handle zero-length variants (in detached metadata). When we start actually returning errors due to this, things break. (It wasn't a problem in practice before because most things looked at the zero size, not the data). Anyways there's a bigger picture issue here - a while ago we made a fix to only use `mmap()` for reading metadata from disk only if it was large enough (i.e. `>16k`). But that didn't help various other paths in the pull code and others that were directly doing the `mmap()`. Fix this by having a proper low level fs helper that does "read all data from fd+offset into GBytes", which handles the size check. Then the `GVariant` bits are just a clean layer on top of this. (At the small cost of an additional allocation) Side note: I had to remind myself, but the reason we can't just use `GMappedFile` here is it doesn't support passing an offset into `mmap()`. Closes: #1251 Approved by: jlebon --- src/libostree/ostree-repo-commit.c | 37 ++++---- src/libostree/ostree-repo-pull.c | 8 +- src/libostree/ostree-repo-static-delta-core.c | 17 ++-- src/libostree/ostree-repo.c | 48 ++++------ src/libotutil/ot-fs-utils.c | 60 +++++++++--- src/libotutil/ot-fs-utils.h | 5 +- src/libotutil/ot-variant-utils.c | 94 ++++--------------- src/libotutil/ot-variant-utils.h | 24 ++--- src/ostree/ot-builtin-show.c | 5 +- src/ostree/ot-builtin-summary.c | 5 +- 10 files changed, 131 insertions(+), 172 deletions(-) diff --git a/src/libostree/ostree-repo-commit.c b/src/libostree/ostree-repo-commit.c index 029dd01b..a9ae4af2 100644 --- a/src/libostree/ostree-repo-commit.c +++ b/src/libostree/ostree-repo-commit.c @@ -2212,26 +2212,29 @@ ostree_repo_read_commit_detached_metadata (OstreeRepo *self, char buf[_OSTREE_LOOSE_PATH_MAX]; _ostree_loose_path (buf, checksum, OSTREE_OBJECT_TYPE_COMMIT_META, self->mode); - g_autoptr(GVariant) ret_metadata = NULL; - if (self->commit_stagedir.initialized && - !ot_util_variant_map_at (self->commit_stagedir.fd, buf, - G_VARIANT_TYPE ("a{sv}"), - OT_VARIANT_MAP_ALLOW_NOENT | OT_VARIANT_MAP_TRUSTED, &ret_metadata, error)) - return glnx_prefix_error (error, "Unable to read existing detached metadata"); + if (self->commit_stagedir.initialized) + { + glnx_fd_close int fd = -1; + if (!ot_openat_ignore_enoent (self->commit_stagedir.fd, buf, &fd, error)) + return FALSE; + if (fd != -1) + return ot_variant_read_fd (fd, 0, G_VARIANT_TYPE ("a{sv}"), TRUE, + out_metadata, error); + } - if (ret_metadata == NULL && - !ot_util_variant_map_at (self->objects_dir_fd, buf, - G_VARIANT_TYPE ("a{sv}"), - OT_VARIANT_MAP_ALLOW_NOENT | OT_VARIANT_MAP_TRUSTED, &ret_metadata, error)) - return glnx_prefix_error (error, "Unable to read existing detached metadata"); + glnx_fd_close int fd = -1; + if (!ot_openat_ignore_enoent (self->objects_dir_fd, buf, &fd, error)) + return FALSE; + if (fd != -1) + return ot_variant_read_fd (fd, 0, G_VARIANT_TYPE ("a{sv}"), TRUE, + out_metadata, error); - if (ret_metadata == NULL && self->parent_repo) + if (self->parent_repo) return ostree_repo_read_commit_detached_metadata (self->parent_repo, - checksum, - out_metadata, - cancellable, - error); - ot_transfer_out_value (out_metadata, &ret_metadata); + checksum, out_metadata, + cancellable, error); + /* Nothing found */ + *out_metadata = NULL; return TRUE; } diff --git a/src/libostree/ostree-repo-pull.c b/src/libostree/ostree-repo-pull.c index a404b8a7..57bb1985 100644 --- a/src/libostree/ostree-repo-pull.c +++ b/src/libostree/ostree-repo-pull.c @@ -1228,8 +1228,8 @@ meta_fetch_on_complete (GObject *object, if (fetch_data->is_detached_meta) { - if (!ot_util_variant_map_fd (fd, 0, G_VARIANT_TYPE ("a{sv}"), - FALSE, &metadata, error)) + if (!ot_variant_read_fd (fd, 0, G_VARIANT_TYPE ("a{sv}"), + FALSE, &metadata, error)) goto out; if (!ostree_repo_write_commit_detached_metadata (pull_data->repo, checksum, metadata, @@ -1245,8 +1245,8 @@ meta_fetch_on_complete (GObject *object, } else { - if (!ot_util_variant_map_fd (fd, 0, ostree_metadata_variant_type (objtype), - FALSE, &metadata, error)) + if (!ot_variant_read_fd (fd, 0, ostree_metadata_variant_type (objtype), + FALSE, &metadata, error)) goto out; /* Write the commitpartial file now while we're still fetching data */ diff --git a/src/libostree/ostree-repo-static-delta-core.c b/src/libostree/ostree-repo-static-delta-core.c index 85952b6a..e5133a2b 100644 --- a/src/libostree/ostree-repo-static-delta-core.c +++ b/src/libostree/ostree-repo-static-delta-core.c @@ -246,8 +246,8 @@ ostree_repo_static_delta_execute_offline (OstreeRepo *self, return glnx_throw_errno_prefix (error, "openat(%s)", basename); g_autoptr(GVariant) meta = NULL; - if (!ot_util_variant_map_fd (meta_fd, 0, G_VARIANT_TYPE (OSTREE_STATIC_DELTA_SUPERBLOCK_FORMAT), - FALSE, &meta, error)) + if (!ot_variant_read_fd (meta_fd, 0, G_VARIANT_TYPE (OSTREE_STATIC_DELTA_SUPERBLOCK_FORMAT), + FALSE, &meta, error)) return FALSE; /* Parsing OSTREE_STATIC_DELTA_SUPERBLOCK_FORMAT */ @@ -448,8 +448,8 @@ _ostree_static_delta_part_open (GInputStream *part_in, int part_fd = g_file_descriptor_based_get_fd ((GFileDescriptorBased*)part_in); /* No compression, no checksums - a fast path */ - if (!ot_util_variant_map_fd (part_fd, 1, G_VARIANT_TYPE (OSTREE_STATIC_DELTA_PART_PAYLOAD_FORMAT_V0), - trusted, &ret_part, error)) + if (!ot_variant_read_fd (part_fd, 1, G_VARIANT_TYPE (OSTREE_STATIC_DELTA_PART_PAYLOAD_FORMAT_V0), + trusted, &ret_part, error)) return FALSE; } else @@ -767,9 +767,12 @@ _ostree_repo_static_delta_dump (OstreeRepo *self, superblock_path = _ostree_get_relative_static_delta_superblock_path (from, to); - if (!ot_util_variant_map_at (self->repo_dir_fd, superblock_path, - (GVariantType*)OSTREE_STATIC_DELTA_SUPERBLOCK_FORMAT, - OT_VARIANT_MAP_TRUSTED, &delta_superblock, error)) + glnx_fd_close int superblock_fd = -1; + if (!glnx_openat_rdonly (self->repo_dir_fd, superblock_path, TRUE, &superblock_fd, error)) + return FALSE; + if (!ot_variant_read_fd (superblock_fd, 0, + (GVariantType*)OSTREE_STATIC_DELTA_SUPERBLOCK_FORMAT, + TRUE, &delta_superblock, error)) return FALSE; g_print ("Delta: %s\n", delta_id); diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c index 50829152..4357d562 100644 --- a/src/libostree/ostree-repo.c +++ b/src/libostree/ostree-repo.c @@ -2811,7 +2811,6 @@ load_metadata_internal (OstreeRepo *self, GError **error) { char loose_path_buf[_OSTREE_LOOSE_PATH_MAX]; - struct stat stbuf; glnx_fd_close int fd = -1; g_autoptr(GInputStream) ret_stream = NULL; g_autoptr(GVariant) ret_variant = NULL; @@ -2853,36 +2852,14 @@ load_metadata_internal (OstreeRepo *self, if (fd != -1) { + struct stat stbuf; if (!glnx_fstat (fd, &stbuf, error)) return FALSE; - if (out_variant) { - /* http://stackoverflow.com/questions/258091/when-should-i-use-mmap-for-file-access */ - if (stbuf.st_size > 16*1024) - { - GMappedFile *mfile; - - mfile = g_mapped_file_new_from_fd (fd, FALSE, error); - if (!mfile) - return FALSE; - ret_variant = g_variant_new_from_data (ostree_metadata_variant_type (objtype), - g_mapped_file_get_contents (mfile), - g_mapped_file_get_length (mfile), - TRUE, - (GDestroyNotify) g_mapped_file_unref, - mfile); - g_variant_ref_sink (ret_variant); - } - else - { - g_autoptr(GBytes) data = glnx_fd_readall_bytes (fd, cancellable, error); - if (!data) - return FALSE; - ret_variant = g_variant_new_from_bytes (ostree_metadata_variant_type (objtype), - data, TRUE); - g_variant_ref_sink (ret_variant); - } + if (!ot_variant_read_fd (fd, 0, ostree_metadata_variant_type (objtype), TRUE, + &ret_variant, error)) + return FALSE; /* Now, let's put it in the cache */ if (is_dirmeta_cachable) @@ -4202,15 +4179,24 @@ ostree_repo_add_gpg_signature_summary (OstreeRepo *self, GCancellable *cancellable, GError **error) { - g_autoptr(GBytes) summary_data = ot_file_mapat_bytes (self->repo_dir_fd, "summary", error); + glnx_fd_close int fd = -1; + if (!glnx_openat_rdonly (self->repo_dir_fd, "summary", TRUE, &fd, error)) + return FALSE; + g_autoptr(GBytes) summary_data = ot_fd_readall_or_mmap (fd, 0, error); if (!summary_data) return FALSE; + /* Note that fd is reused below */ + (void) close (glnx_steal_fd (&fd)); g_autoptr(GVariant) existing_signatures = NULL; - if (!ot_util_variant_map_at (self->repo_dir_fd, "summary.sig", - G_VARIANT_TYPE (OSTREE_SUMMARY_SIG_GVARIANT_STRING), - OT_VARIANT_MAP_ALLOW_NOENT, &existing_signatures, error)) + if (!ot_openat_ignore_enoent (self->repo_dir_fd, "summary.sig", &fd, error)) return FALSE; + if (fd != -1) + { + if (!ot_variant_read_fd (fd, 0, G_VARIANT_TYPE (OSTREE_SUMMARY_SIG_GVARIANT_STRING), + FALSE, &existing_signatures, error)) + return FALSE; + } g_autoptr(GVariant) new_metadata = NULL; for (guint i = 0; key_id[i]; i++) diff --git a/src/libotutil/ot-fs-utils.c b/src/libotutil/ot-fs-utils.c index 253de5b3..79ba3cf7 100644 --- a/src/libotutil/ot-fs-utils.c +++ b/src/libotutil/ot-fs-utils.c @@ -22,6 +22,7 @@ #include "ot-fs-utils.h" #include "libglnx.h" #include +#include #include #include @@ -144,22 +145,57 @@ ot_dfd_iter_init_allow_noent (int dfd, return TRUE; } -GBytes * -ot_file_mapat_bytes (int dfd, - const char *path, - GError **error) +typedef struct { + gpointer addr; + gsize len; +} MapData; + +static void +map_data_destroy (gpointer data) { - glnx_fd_close int fd = openat (dfd, path, O_RDONLY | O_CLOEXEC); - g_autoptr(GMappedFile) mfile = NULL; + MapData *mdata = data; + (void) munmap (mdata->addr, mdata->len); + g_free (mdata); +} - if (fd < 0) - return glnx_null_throw_errno_prefix (error, "openat(%s)", path); - - mfile = g_mapped_file_new_from_fd (fd, FALSE, error); - if (!mfile) +/* Return a newly-allocated GBytes that refers to the contents of the file + * starting at offset @start. If the file is large enough, mmap() may be used. + */ +GBytes * +ot_fd_readall_or_mmap (int fd, + goffset start, + GError **error) +{ + struct stat stbuf; + if (!glnx_fstat (fd, &stbuf, error)) return FALSE; - return g_mapped_file_get_bytes (mfile); + /* http://stackoverflow.com/questions/258091/when-should-i-use-mmap-for-file-access */ + if (start > stbuf.st_size) + return g_bytes_new_static (NULL, 0); + const gsize len = stbuf.st_size - start; + if (len > 16*1024) + { + /* The reason we don't use g_mapped_file_new_from_fd() here + * is it doesn't support passing an offset, which is actually + * used by the static delta code. + */ + gpointer map = mmap (NULL, len, PROT_READ, MAP_PRIVATE, fd, start); + if (map == (void*)-1) + return glnx_null_throw_errno_prefix (error, "mmap"); + + MapData *mdata = g_new (MapData, 1); + mdata->addr = map; + mdata->len = len; + + return g_bytes_new_with_free_func (map, len, map_data_destroy, mdata); + } + + /* Fall through to plain read into a malloc buffer */ + if (lseek (fd, start, SEEK_SET) < 0) + return glnx_null_throw_errno_prefix (error, "lseek"); + /* Not cancellable since this should be small */ + return glnx_fd_readall_bytes (fd, NULL, error); } /* Given an input stream, splice it to an anonymous file (O_TMPFILE). diff --git a/src/libotutil/ot-fs-utils.h b/src/libotutil/ot-fs-utils.h index 98fcd6a2..7eb811cd 100644 --- a/src/libotutil/ot-fs-utils.h +++ b/src/libotutil/ot-fs-utils.h @@ -85,8 +85,7 @@ ot_map_anonymous_tmpfile_from_content (GInputStream *instream, GCancellable *cancellable, GError **error); -GBytes *ot_file_mapat_bytes (int dfd, - const char *path, - GError **error); +GBytes *ot_fd_readall_or_mmap (int fd, goffset offset, + GError **error); G_END_DECLS diff --git a/src/libotutil/ot-variant-utils.c b/src/libotutil/ot-variant-utils.c index d1981c8b..d4ae7d9d 100644 --- a/src/libotutil/ot-variant-utils.c +++ b/src/libotutil/ot-variant-utils.c @@ -25,7 +25,6 @@ #include #include -#include #include "otutil.h" @@ -85,86 +84,25 @@ ot_util_variant_take_ref (GVariant *variant) return g_variant_take_ref (variant); } +/* Create a GVariant in @out_variant that is backed by + * the data from @fd, starting at @start. If the data is + * large enough, mmap() may be used. @trusted is used + * by the GVariant core; see g_variant_new_from_data(). + */ gboolean -ot_util_variant_map_at (int dfd, - const char *path, - const GVariantType *type, - OtVariantMapFlags flags, - GVariant **out_variant, - GError **error) +ot_variant_read_fd (int fd, + goffset start, + const GVariantType *type, + gboolean trusted, + GVariant **out_variant, + GError **error) { - glnx_fd_close int fd = -1; - const gboolean trusted = (flags & OT_VARIANT_MAP_TRUSTED) > 0; + g_autoptr(GBytes) bytes = ot_fd_readall_or_mmap (fd, start, error); + if (!bytes) + return FALSE; - fd = openat (dfd, path, O_RDONLY | O_CLOEXEC); - if (fd < 0) - { - if (errno == ENOENT && (flags & OT_VARIANT_MAP_ALLOW_NOENT) > 0) - { - *out_variant = NULL; - return TRUE; - } - else - { - glnx_set_error_from_errno (error); - g_prefix_error (error, "Opening %s: ", path); - return FALSE; - } - } - - return ot_util_variant_map_fd (fd, 0, type, trusted, out_variant, error); -} - -typedef struct { - gpointer addr; - gsize len; -} VariantMapData; - -static void -variant_map_data_destroy (gpointer data) -{ - VariantMapData *mdata = data; - (void) munmap (mdata->addr, mdata->len); - g_free (mdata); -} - -gboolean -ot_util_variant_map_fd (int fd, - goffset start, - const GVariantType *type, - gboolean trusted, - GVariant **out_variant, - GError **error) -{ - gboolean ret = FALSE; - gpointer map; - struct stat stbuf; - VariantMapData *mdata = NULL; - gsize len; - - if (fstat (fd, &stbuf) != 0) - { - glnx_set_error_from_errno (error); - goto out; - } - - len = stbuf.st_size - start; - map = mmap (NULL, len, PROT_READ, MAP_PRIVATE, fd, start); - if (!map) - { - glnx_set_error_from_errno (error); - goto out; - } - - mdata = g_new (VariantMapData, 1); - mdata->addr = map; - mdata->len = len; - - ret = TRUE; - *out_variant = g_variant_ref_sink (g_variant_new_from_data (type, map, len, trusted, - variant_map_data_destroy, mdata)); - out: - return ret; + *out_variant = g_variant_ref_sink (g_variant_new_from_bytes (type, bytes, trusted)); + return TRUE; } GInputStream * diff --git a/src/libotutil/ot-variant-utils.h b/src/libotutil/ot-variant-utils.h index 135ae5d0..379e19ac 100644 --- a/src/libotutil/ot-variant-utils.h +++ b/src/libotutil/ot-variant-utils.h @@ -36,24 +36,12 @@ GHashTable *ot_util_variant_asv_to_hash_table (GVariant *variant); GVariant * ot_util_variant_take_ref (GVariant *variant); -typedef enum { - OT_VARIANT_MAP_TRUSTED = (1 << 0), - OT_VARIANT_MAP_ALLOW_NOENT = (1 << 1) -} OtVariantMapFlags; - -gboolean ot_util_variant_map_at (int dfd, - const char *path, - const GVariantType *type, - OtVariantMapFlags flags, - GVariant **out_variant, - GError **error); - -gboolean ot_util_variant_map_fd (int fd, - goffset offset, - const GVariantType *type, - gboolean trusted, - GVariant **out_variant, - GError **error); +gboolean ot_variant_read_fd (int fd, + goffset offset, + const GVariantType *type, + gboolean trusted, + GVariant **out_variant, + GError **error); GInputStream *ot_variant_read (GVariant *variant); diff --git a/src/ostree/ot-builtin-show.c b/src/ostree/ot-builtin-show.c index f197d7c3..3ab56eb2 100644 --- a/src/ostree/ot-builtin-show.c +++ b/src/ostree/ot-builtin-show.c @@ -58,7 +58,10 @@ do_print_variant_generic (const GVariantType *type, { g_autoptr(GVariant) variant = NULL; - if (!ot_util_variant_map_at (AT_FDCWD, filename, type, TRUE, &variant, error)) + glnx_fd_close int fd = -1; + if (!glnx_openat_rdonly (AT_FDCWD, filename, TRUE, &fd, error)) + return FALSE; + if (!ot_variant_read_fd (fd, 0, type, FALSE, &variant, error)) return FALSE; ot_dump_variant (variant); diff --git a/src/ostree/ot-builtin-summary.c b/src/ostree/ot-builtin-summary.c index abd1f86c..ed9e0b3d 100644 --- a/src/ostree/ot-builtin-summary.c +++ b/src/ostree/ot-builtin-summary.c @@ -217,7 +217,10 @@ ostree_builtin_summary (int argc, char **argv, GCancellable *cancellable, GError if (opt_raw) flags |= OSTREE_DUMP_RAW; - summary_data = ot_file_mapat_bytes (repo->repo_dir_fd, "summary", error); + glnx_fd_close int fd = -1; + if (!glnx_openat_rdonly (repo->repo_dir_fd, "summary", TRUE, &fd, error)) + return FALSE; + summary_data = ot_fd_readall_or_mmap (fd, 0, error); if (!summary_data) return FALSE; From 9350e8a4881fce066e16fadce0240233016bed4b Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Thu, 5 Oct 2017 11:14:41 +0100 Subject: [PATCH 19/98] =?UTF-8?q?lib/repo:=20Clarify=20that=20ostree=5Frep?= =?UTF-8?q?o=5Fremote=5Ffetch=5Fsummary()=20doesn=E2=80=99t=20verify?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Make that a bit clearer in the documentation. Signed-off-by: Philip Withnall Closes: #1253 Approved by: cgwalters --- src/libostree/ostree-repo.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c index 4357d562..59497353 100644 --- a/src/libostree/ostree-repo.c +++ b/src/libostree/ostree-repo.c @@ -1711,6 +1711,9 @@ out: * @NULL. Likewise if the summary file is not signed, @out_signatures is * set to @NULL. In either case the function still returns %TRUE. * + * This method does not verify the signature of the downloaded summary file. + * Use ostree_repo_verify_summary() for that. + * * Parse the summary data into a #GVariant using g_variant_new_from_bytes() * with #OSTREE_SUMMARY_GVARIANT_FORMAT as the format string. * From 7f6af94c5a9a1ffa411636225baf5cb51de08144 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Wed, 4 Oct 2017 06:32:10 -0400 Subject: [PATCH 20/98] lib/utils: Port a bit to decl-after-stmt style Add add some more comments. Closes: #1247 Approved by: jlebon --- src/libotutil/ot-fs-utils.c | 18 +++----- src/libotutil/ot-unix-utils.c | 44 +++++++------------ src/libotutil/ot-variant-utils.c | 75 ++++++++++++++------------------ 3 files changed, 55 insertions(+), 82 deletions(-) diff --git a/src/libotutil/ot-fs-utils.c b/src/libotutil/ot-fs-utils.c index 79ba3cf7..cad27496 100644 --- a/src/libotutil/ot-fs-utils.c +++ b/src/libotutil/ot-fs-utils.c @@ -36,6 +36,9 @@ ot_fdrel_to_gfile (int dfd, const char *path) return g_file_new_for_path (abspath); } +/* Wraps readlinkat(), and sets the `symlink-target` property + * of @target_info. + */ gboolean ot_readlinkat_gfile_info (int dfd, const char *path, @@ -54,7 +57,6 @@ ot_readlinkat_gfile_info (int dfd, return TRUE; } - /** * ot_openat_read_stream: * @dfd: Directory file descriptor @@ -77,16 +79,10 @@ ot_openat_read_stream (int dfd, GCancellable *cancellable, GError **error) { - int fd = -1; - int flags = O_RDONLY | O_NOCTTY | O_CLOEXEC; - - if (!follow) - flags |= O_NOFOLLOW; - - if (TEMP_FAILURE_RETRY (fd = openat (dfd, path, flags, 0)) < 0) - return glnx_throw_errno_prefix (error, "openat(%s)", path); - - *out_istream = g_unix_input_stream_new (fd, TRUE); + glnx_fd_close int fd = -1; + if (!glnx_openat_rdonly (dfd, path, follow, &fd, error)) + return FALSE; + *out_istream = g_unix_input_stream_new (glnx_steal_fd (&fd), TRUE); return TRUE; } diff --git a/src/libotutil/ot-unix-utils.c b/src/libotutil/ot-unix-utils.c index d6c5ee6d..3590de29 100644 --- a/src/libotutil/ot-unix-utils.c +++ b/src/libotutil/ot-unix-utils.c @@ -34,22 +34,19 @@ #include #include +/* Ensure that a pathname component @name does not contain the special Unix + * entries `.` or `..`, and does not contain `/`. + */ gboolean ot_util_filename_validate (const char *name, GError **error) { if (strcmp (name, ".") == 0) - { - return glnx_throw (error, "Invalid self-referential filename '.'"); - } + return glnx_throw (error, "Invalid self-referential filename '.'"); if (strcmp (name, "..") == 0) - { - return glnx_throw (error, "Invalid path uplink filename '..'"); - } + return glnx_throw (error, "Invalid path uplink filename '..'"); if (strchr (name, '/') != NULL) - { - return glnx_throw (error, "Invalid / in filename %s", name); - } + return glnx_throw (error, "Invalid / in filename %s", name); return TRUE; } @@ -58,8 +55,8 @@ ot_split_string_ptrarray (const char *str, char c) { GPtrArray *ret = g_ptr_array_new_with_free_func (g_free); - const char *p; + const char *p; do { p = strchr (str, '/'); if (!p) @@ -77,40 +74,29 @@ ot_split_string_ptrarray (const char *str, return ret; } +/* Given a pathname @path, split it into individual entries in @out_components, + * validating that it does not have backreferences (`..`) etc. + */ gboolean ot_util_path_split_validate (const char *path, GPtrArray **out_components, GError **error) { - gboolean ret = FALSE; - int i; - g_autoptr(GPtrArray) ret_components = NULL; - if (strlen (path) > PATH_MAX) - { - g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, - "Path '%s' is too long", path); - goto out; - } + return glnx_throw (error, "Path '%s' is too long", path); - ret_components = ot_split_string_ptrarray (path, '/'); + g_autoptr(GPtrArray) ret_components = ot_split_string_ptrarray (path, '/'); /* Canonicalize by removing '.' and '', throw an error on .. */ - for (i = ret_components->len-1; i >= 0; i--) + for (int i = ret_components->len-1; i >= 0; i--) { const char *name = ret_components->pdata[i]; if (strcmp (name, "..") == 0) - { - g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, - "Invalid uplink '..' in path %s", path); - goto out; - } + return glnx_throw (error, "Invalid uplink '..' in path %s", path); if (strcmp (name, ".") == 0 || name[0] == '\0') g_ptr_array_remove_index (ret_components, i); } - ret = TRUE; ot_transfer_out_value(out_components, &ret_components); - out: - return ret; + return TRUE; } diff --git a/src/libotutil/ot-variant-utils.c b/src/libotutil/ot-variant-utils.c index d4ae7d9d..1429a3a7 100644 --- a/src/libotutil/ot-variant-utils.c +++ b/src/libotutil/ot-variant-utils.c @@ -28,6 +28,7 @@ #include "otutil.h" +/* Create a new GVariant empty GVariant of type a{sv} */ GVariant * ot_gvariant_new_empty_string_dict (void) { @@ -36,45 +37,42 @@ ot_gvariant_new_empty_string_dict (void) return g_variant_builder_end (&builder); } + +/* Create a new GVariant of type ay from the raw @data pointer */ GVariant * ot_gvariant_new_bytearray (const guchar *data, gsize len) { - gpointer data_copy; - GVariant *ret; - - data_copy = g_memdup (data, len); - ret = g_variant_new_from_data (G_VARIANT_TYPE ("ay"), data_copy, + gpointer data_copy = g_memdup (data, len); + GVariant *ret = g_variant_new_from_data (G_VARIANT_TYPE ("ay"), data_copy, len, FALSE, g_free, data_copy); return ret; } +/* Convert a GBytes into a GVariant of type ay (byte array) */ GVariant * ot_gvariant_new_ay_bytes (GBytes *bytes) { gsize size; - gconstpointer data; - data = g_bytes_get_data (bytes, &size); + gconstpointer data = g_bytes_get_data (bytes, &size); g_bytes_ref (bytes); return g_variant_new_from_data (G_VARIANT_TYPE ("ay"), data, size, TRUE, (GDestroyNotify)g_bytes_unref, bytes); } +/* Convert a GVariant of type a{sv} to a GHashTable */ GHashTable * ot_util_variant_asv_to_hash_table (GVariant *variant) { - GHashTable *ret; - GVariantIter *viter; + + GHashTable *ret = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify)g_variant_unref); + g_autoptr(GVariantIter) viter = g_variant_iter_new (variant); + char *key; GVariant *value; - - ret = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify)g_variant_unref); - viter = g_variant_iter_new (variant); while (g_variant_iter_next (viter, "{s@v}", &key, &value)) g_hash_table_replace (ret, key, g_variant_ref_sink (value)); - - g_variant_iter_free (viter); - + return ret; } @@ -105,40 +103,38 @@ ot_variant_read_fd (int fd, return TRUE; } +/* Get an input stream for a GVariant */ GInputStream * ot_variant_read (GVariant *variant) { - GMemoryInputStream *ret = NULL; - - ret = (GMemoryInputStream*)g_memory_input_stream_new_from_data (g_variant_get_data (variant), - g_variant_get_size (variant), - NULL); + GMemoryInputStream *ret = (GMemoryInputStream*) + g_memory_input_stream_new_from_data (g_variant_get_data (variant), + g_variant_get_size (variant), + NULL); g_object_set_data_full ((GObject*)ret, "ot-variant-data", g_variant_ref (variant), (GDestroyNotify) g_variant_unref); return (GInputStream*)ret; } +/* GVariants are immutable; this function allows generating an open builder + * for a new variant, inherting the data from @variant. + */ GVariantBuilder * ot_util_variant_builder_from_variant (GVariant *variant, const GVariantType *type) { - GVariantBuilder *builder = NULL; - - builder = g_variant_builder_new (type); - + GVariantBuilder *builder = g_variant_builder_new (type); + if (variant != NULL) { - gint i, n; - - n = g_variant_n_children (variant); - for (i = 0; i < n; i++) + const int n = g_variant_n_children (variant); + for (int i = 0; i < n; i++) { - GVariant *child = g_variant_get_child_value (variant, i); + g_autoptr(GVariant) child = g_variant_get_child_value (variant, i); g_variant_builder_add_value (builder, child); - g_variant_unref (child); } } - + return builder; } @@ -159,28 +155,23 @@ ot_variant_bsearch_str (GVariant *array, const char *str, int *out_pos) { - gsize imax, imin; - gsize imid = -1; - gsize n; - - n = g_variant_n_children (array); + const gsize n = g_variant_n_children (array); if (n == 0) return FALSE; - imax = n - 1; - imin = 0; + gsize imax = n - 1; + gsize imin = 0; + gsize imid = -1; while (imax >= imin) { - g_autoptr(GVariant) child = NULL; const char *cur; - int cmp; imid = (imin + imax) / 2; - child = g_variant_get_child_value (array, imid); + g_autoptr(GVariant) child = g_variant_get_child_value (array, imid); g_variant_get_child (child, 0, "&s", &cur, NULL); - cmp = strcmp (cur, str); + int cmp = strcmp (cur, str); if (cmp < 0) imin = imid + 1; else if (cmp > 0) From 2e3889a4eb2e33b6cd0e0cc683ee9f047a756b6e Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Mon, 2 Oct 2017 21:36:10 -0400 Subject: [PATCH 21/98] lib/pull: Change fetcher to return O_TMPFILE A lot of the libostree code is honestly too complex for its own good (this is mostly my fault). The way we do HTTP writes is still one of those. The way the fetcher writes tempfiles, then reads them back in is definitely one of those. Now that we've dropped the "partial object" bits in: https://github.com/ostreedev/ostree/pull/1176 i.e. commit https://github.com/ostreedev/ostree/commit/0488b4870e80ef575d8b0edf6f2a9e5ad54bf4df we can simplify things a lot more by having the fetcher return an `O_TMPFILE` rather than a filename. For trusted archive mirroring, we need to enable linking in the tmpfiles directly. Otherwise for at least content objects they're compressed, so we couldn't link them in. For metadata, we need to do similar logic to what we have around `mmap()` to only grab a tmpfile if the size is large enough. Closes: #1252 Approved by: jlebon --- src/libostree/ostree-fetcher-curl.c | 35 ++++------ src/libostree/ostree-fetcher-soup.c | 30 +++------ src/libostree/ostree-fetcher-util.h | 23 +++++-- src/libostree/ostree-fetcher.h | 5 +- src/libostree/ostree-repo-pull.c | 100 ++++++++++++---------------- 5 files changed, 86 insertions(+), 107 deletions(-) diff --git a/src/libostree/ostree-fetcher-curl.c b/src/libostree/ostree-fetcher-curl.c index dc85d3fe..1f641882 100644 --- a/src/libostree/ostree-fetcher-curl.c +++ b/src/libostree/ostree-fetcher-curl.c @@ -269,13 +269,13 @@ ensure_tmpfile (FetcherRequest *req, GError **error) { if (!req->tmpf.initialized) { - if (!glnx_open_tmpfile_linkable_at (req->fetcher->tmpdir_dfd, ".", - O_WRONLY | O_CLOEXEC, &req->tmpf, - error)) + if (!_ostree_fetcher_tmpf_from_flags (req->flags, req->fetcher->tmpdir_dfd, + &req->tmpf, error)) return FALSE; } return TRUE; } + /* Check for completed transfers, and remove their easy handles */ static void check_multi_info (OstreeFetcher *fetcher) @@ -378,25 +378,19 @@ check_multi_info (OstreeFetcher *fetcher) g_autoptr(GError) local_error = NULL; GError **error = &local_error; - g_autofree char *tmpfile_path = - ostree_fetcher_generate_url_tmpname (eff_url); if (!ensure_tmpfile (req, error)) { g_task_return_error (task, g_steal_pointer (&local_error)); } - /* This should match the libsoup chmod */ - else if (fchmod (req->tmpf.fd, 0644) < 0) + else if (lseek (req->tmpf.fd, 0, SEEK_SET) < 0) { glnx_set_error_from_errno (error); g_task_return_error (task, g_steal_pointer (&local_error)); } - else if (!glnx_link_tmpfile_at (&req->tmpf, GLNX_LINK_TMPFILE_REPLACE, - fetcher->tmpdir_dfd, tmpfile_path, - error)) - g_task_return_error (task, g_steal_pointer (&local_error)); else { - g_task_return_pointer (task, g_steal_pointer (&tmpfile_path), g_free); + /* We return the tmpfile in the _finish wrapper */ + g_task_return_boolean (task, TRUE); } } } @@ -887,26 +881,21 @@ _ostree_fetcher_request_to_tmpfile (OstreeFetcher *self, gboolean _ostree_fetcher_request_to_tmpfile_finish (OstreeFetcher *self, GAsyncResult *result, - char **out_filename, + GLnxTmpfile *out_tmpf, GError **error) { - GTask *task; - FetcherRequest *req; - gpointer ret; - g_return_val_if_fail (g_task_is_valid (result, self), FALSE); g_return_val_if_fail (g_async_result_is_tagged (result, _ostree_fetcher_request_async), FALSE); - task = (GTask*)result; - req = g_task_get_task_data (task); + GTask *task = (GTask*)result; + FetcherRequest *req = g_task_get_task_data (task); - ret = g_task_propagate_pointer (task, error); - if (!ret) + if (!g_task_propagate_boolean (task, error)) return FALSE; g_assert (!req->is_membuf); - g_assert (out_filename); - *out_filename = ret; + *out_tmpf = req->tmpf; + req->tmpf.initialized = FALSE; /* Transfer ownership */ return TRUE; } diff --git a/src/libostree/ostree-fetcher-soup.c b/src/libostree/ostree-fetcher-soup.c index 90986c66..e023d34e 100644 --- a/src/libostree/ostree-fetcher-soup.c +++ b/src/libostree/ostree-fetcher-soup.c @@ -905,11 +905,8 @@ on_stream_read (GObject *object, { if (!pending->is_membuf) { - if (!glnx_open_tmpfile_linkable_at (pending->thread_closure->base_tmpdir_dfd, ".", - O_WRONLY | O_CLOEXEC, &pending->tmpf, &local_error)) - goto out; - /* This should match the libcurl chmod */ - if (!glnx_fchmod (pending->tmpf.fd, 0644, &local_error)) + if (!_ostree_fetcher_tmpf_from_flags (pending->flags, pending->thread_closure->base_tmpdir_dfd, + &pending->tmpf, &local_error)) goto out; pending->out_stream = g_unix_output_stream_new (pending->tmpf.fd, FALSE); } @@ -943,18 +940,13 @@ on_stream_read (GObject *object, } else { - g_autofree char *uristring = - soup_uri_to_string (soup_request_get_uri (pending->request), FALSE); - g_autofree char *tmpfile_path = - ostree_fetcher_generate_url_tmpname (uristring); - if (!glnx_link_tmpfile_at (&pending->tmpf, GLNX_LINK_TMPFILE_REPLACE, - pending->thread_closure->base_tmpdir_dfd, tmpfile_path, - &local_error)) - g_task_return_error (task, g_steal_pointer (&local_error)); + if (lseek (pending->tmpf.fd, 0, SEEK_SET) < 0) + { + glnx_set_error_from_errno (&local_error); + g_task_return_error (task, g_steal_pointer (&local_error)); + } else - g_task_return_pointer (task, - g_steal_pointer (&tmpfile_path), - (GDestroyNotify) g_free); + g_task_return_boolean (task, TRUE); } remove_pending (pending); } @@ -1174,7 +1166,7 @@ _ostree_fetcher_request_to_tmpfile (OstreeFetcher *self, gboolean _ostree_fetcher_request_to_tmpfile_finish (OstreeFetcher *self, GAsyncResult *result, - char **out_filename, + GLnxTmpfile *out_tmpf, GError **error) { GTask *task; @@ -1192,8 +1184,8 @@ _ostree_fetcher_request_to_tmpfile_finish (OstreeFetcher *self, return FALSE; g_assert (!pending->is_membuf); - g_assert (out_filename); - *out_filename = ret; + *out_tmpf = pending->tmpf; + pending->tmpf.initialized = FALSE; /* Transfer ownership */ return TRUE; } diff --git a/src/libostree/ostree-fetcher-util.h b/src/libostree/ostree-fetcher-util.h index 5f1dd36d..29293816 100644 --- a/src/libostree/ostree-fetcher-util.h +++ b/src/libostree/ostree-fetcher-util.h @@ -25,14 +25,23 @@ G_BEGIN_DECLS -/* FIXME - delete this and replace by having fetchers simply - * return O_TMPFILE fds, not file paths. - */ -static inline char * -ostree_fetcher_generate_url_tmpname (const char *url) +static inline gboolean +_ostree_fetcher_tmpf_from_flags (OstreeFetcherRequestFlags flags, + int dfd, + GLnxTmpfile *tmpf, + GError **error) { - return g_compute_checksum_for_string (G_CHECKSUM_SHA256, - url, strlen (url)); + if ((flags & OSTREE_FETCHER_REQUEST_LINKABLE) > 0) + { + if (!glnx_open_tmpfile_linkable_at (dfd, ".", O_RDWR | O_CLOEXEC, tmpf, error)) + return FALSE; + } + else if (!glnx_open_anonymous_tmpfile (O_RDWR | O_CLOEXEC, tmpf, error)) + return FALSE; + + if (!glnx_fchmod (tmpf->fd, 0644, error)) + return FALSE; + return TRUE; } gboolean _ostree_fetcher_mirrored_request_to_membuf (OstreeFetcher *fetcher, diff --git a/src/libostree/ostree-fetcher.h b/src/libostree/ostree-fetcher.h index 8cdd1e11..18aaec40 100644 --- a/src/libostree/ostree-fetcher.h +++ b/src/libostree/ostree-fetcher.h @@ -55,7 +55,8 @@ typedef enum { typedef enum { OSTREE_FETCHER_REQUEST_NUL_TERMINATION = (1 << 0), - OSTREE_FETCHER_REQUEST_OPTIONAL_CONTENT = (1 << 1) + OSTREE_FETCHER_REQUEST_OPTIONAL_CONTENT = (1 << 1), + OSTREE_FETCHER_REQUEST_LINKABLE = (1 << 2), } OstreeFetcherRequestFlags; void @@ -124,7 +125,7 @@ void _ostree_fetcher_request_to_tmpfile (OstreeFetcher *self, gboolean _ostree_fetcher_request_to_tmpfile_finish (OstreeFetcher *self, GAsyncResult *result, - char **out_filename, + GLnxTmpfile *out_tmpf, GError **error); void _ostree_fetcher_request_to_membuf (OstreeFetcher *self, diff --git a/src/libostree/ostree-repo-pull.c b/src/libostree/ostree-repo-pull.c index 57bb1985..9a8c0ebf 100644 --- a/src/libostree/ostree-repo-pull.c +++ b/src/libostree/ostree-repo-pull.c @@ -142,6 +142,7 @@ typedef struct { guint64 start_time; gboolean is_mirror; + gboolean trusted_http_direct; gboolean is_commit_only; OstreeRepoImportFlags importflags; @@ -1018,17 +1019,18 @@ content_fetch_on_complete (GObject *object, GError **error = &local_error; GCancellable *cancellable = NULL; guint64 length; + g_auto(GLnxTmpfile) tmpf = { 0, }; + g_autoptr(GInputStream) tmpf_input = NULL; g_autoptr(GFileInfo) file_info = NULL; g_autoptr(GVariant) xattrs = NULL; g_autoptr(GInputStream) file_in = NULL; g_autoptr(GInputStream) object_input = NULL; - g_auto(OtCleanupUnlinkat) tmp_unlinker = { _ostree_fetcher_get_dfd (fetcher), NULL }; const char *checksum; g_autofree char *checksum_obj = NULL; OstreeObjectType objtype; gboolean free_fetch_data = TRUE; - if (!_ostree_fetcher_request_to_tmpfile_finish (fetcher, result, &tmp_unlinker.path, error)) + if (!_ostree_fetcher_request_to_tmpfile_finish (fetcher, result, &tmpf, error)) goto out; ostree_object_name_deserialize (fetch_data->object, &checksum, &objtype); @@ -1040,48 +1042,31 @@ content_fetch_on_complete (GObject *object, const gboolean verifying_bareuseronly = (pull_data->importflags & _OSTREE_REPO_IMPORT_FLAGS_VERIFY_BAREUSERONLY) > 0; - /* If we're mirroring and writing into an archive repo, and both checksum and - * bareuseronly are turned off, we can directly copy the content rather than - * paying the cost of exploding it, checksumming, and re-gzip. + /* See comments where we set this variable; this is implementing + * the --trusted-http/OSTREE_REPO_PULL_FLAGS_TRUSTED_HTTP flags. */ - const gboolean mirroring_into_archive = - pull_data->is_mirror && pull_data->repo->mode == OSTREE_REPO_MODE_ARCHIVE; - const gboolean import_trusted = !verifying_bareuseronly && - (pull_data->importflags & _OSTREE_REPO_IMPORT_FLAGS_TRUSTED) > 0; - if (mirroring_into_archive && import_trusted) + if (pull_data->trusted_http_direct) { - gboolean have_object; - if (!ostree_repo_has_object (pull_data->repo, OSTREE_OBJECT_TYPE_FILE, checksum, - &have_object, - cancellable, error)) + g_assert (!verifying_bareuseronly); + if (!_ostree_repo_commit_tmpf_final (pull_data->repo, checksum, objtype, + &tmpf, cancellable, error)) goto out; - - if (!have_object) - { - if (!_ostree_repo_commit_path_final (pull_data->repo, checksum, objtype, - &tmp_unlinker, - cancellable, error)) - goto out; - } pull_data->n_fetched_content++; } else { + struct stat stbuf; + if (!glnx_fstat (tmpf.fd, &stbuf, error)) + goto out; /* Non-mirroring path */ + tmpf_input = g_unix_input_stream_new (glnx_steal_fd (&tmpf.fd), TRUE); /* If it appears corrupted, we'll delete it below */ - if (!ostree_content_file_parse_at (TRUE, _ostree_fetcher_get_dfd (fetcher), - tmp_unlinker.path, FALSE, - &file_in, &file_info, &xattrs, - cancellable, error)) + if (!ostree_content_stream_parse (TRUE, tmpf_input, stbuf.st_size, FALSE, + &file_in, &file_info, &xattrs, + cancellable, error)) goto out; - /* Also, delete it now that we've opened it, we'll hold - * a reference to the fd. If we fail to validate or write, then - * the temp space will be cleaned up. - */ - ot_cleanup_unlinkat (&tmp_unlinker); - if (verifying_bareuseronly) { if (!_ostree_validate_bareuseronly_mode_finfo (file_info, checksum, error)) @@ -1161,13 +1146,12 @@ meta_fetch_on_complete (GObject *object, FetchObjectData *fetch_data = user_data; OtPullData *pull_data = fetch_data->pull_data; g_autoptr(GVariant) metadata = NULL; - g_auto(OtCleanupUnlinkat) tmp_unlinker = { _ostree_fetcher_get_dfd (fetcher), NULL }; + g_auto(GLnxTmpfile) tmpf = { 0, }; const char *checksum; g_autofree char *checksum_obj = NULL; OstreeObjectType objtype; g_autoptr(GError) local_error = NULL; GError **error = &local_error; - glnx_fd_close int fd = -1; gboolean free_fetch_data = TRUE; ostree_object_name_deserialize (fetch_data->object, &checksum, &objtype); @@ -1175,7 +1159,7 @@ meta_fetch_on_complete (GObject *object, g_debug ("fetch of %s%s complete", checksum_obj, fetch_data->is_detached_meta ? " (detached)" : ""); - if (!_ostree_fetcher_request_to_tmpfile_finish (fetcher, result, &tmp_unlinker.path, error)) + if (!_ostree_fetcher_request_to_tmpfile_finish (fetcher, result, &tmpf, error)) { if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) { @@ -1218,17 +1202,9 @@ meta_fetch_on_complete (GObject *object, if (objtype == OSTREE_OBJECT_TYPE_TOMBSTONE_COMMIT) goto out; - if (!glnx_openat_rdonly (_ostree_fetcher_get_dfd (fetcher), tmp_unlinker.path, TRUE, &fd, error)) - goto out; - - /* Now delete it, keeping the fd open as the last reference; see comment in - * corresponding content fetch path. - */ - ot_cleanup_unlinkat (&tmp_unlinker); - if (fetch_data->is_detached_meta) { - if (!ot_variant_read_fd (fd, 0, G_VARIANT_TYPE ("a{sv}"), + if (!ot_variant_read_fd (tmpf.fd, 0, G_VARIANT_TYPE ("a{sv}"), FALSE, &metadata, error)) goto out; @@ -1245,7 +1221,7 @@ meta_fetch_on_complete (GObject *object, } else { - if (!ot_variant_read_fd (fd, 0, ostree_metadata_variant_type (objtype), + if (!ot_variant_read_fd (tmpf.fd, 0, ostree_metadata_variant_type (objtype), FALSE, &metadata, error)) goto out; @@ -1314,27 +1290,20 @@ static_deltapart_fetch_on_complete (GObject *object, OstreeFetcher *fetcher = (OstreeFetcher *)object; FetchStaticDeltaData *fetch_data = user_data; OtPullData *pull_data = fetch_data->pull_data; - g_autofree char *temp_path = NULL; + g_auto(GLnxTmpfile) tmpf = { 0, }; g_autoptr(GInputStream) in = NULL; g_autoptr(GVariant) part = NULL; g_autoptr(GError) local_error = NULL; GError **error = &local_error; - glnx_fd_close int fd = -1; gboolean free_fetch_data = TRUE; g_debug ("fetch static delta part %s complete", fetch_data->expected_checksum); - if (!_ostree_fetcher_request_to_tmpfile_finish (fetcher, result, &temp_path, error)) + if (!_ostree_fetcher_request_to_tmpfile_finish (fetcher, result, &tmpf, error)) goto out; - if (!glnx_openat_rdonly (_ostree_fetcher_get_dfd (fetcher), temp_path, TRUE, &fd, error)) - goto out; - - /* From here on, if we fail to apply the delta, we'll re-fetch it */ - if (!glnx_unlinkat (_ostree_fetcher_get_dfd (fetcher), temp_path, 0, error)) - goto out; - - in = g_unix_input_stream_new (fd, FALSE); + /* Transfer ownership of the fd */ + in = g_unix_input_stream_new (glnx_steal_fd (&tmpf.fd), TRUE); /* TODO - make async */ if (!_ostree_static_delta_part_open (in, NULL, 0, fetch_data->expected_checksum, @@ -1979,6 +1948,8 @@ start_fetch (OtPullData *pull_data, else expected_max_size = 0; + if (!is_meta && pull_data->trusted_http_direct) + flags |= OSTREE_FETCHER_REQUEST_LINKABLE; _ostree_fetcher_request_to_tmpfile (pull_data->fetcher, mirrorlist, obj_subpath, flags, expected_max_size, is_meta ? OSTREE_REPO_PULL_METADATA_PRIORITY @@ -3587,6 +3558,11 @@ ostree_repo_pull_with_options (OstreeRepo *self, */ if ((flags & OSTREE_REPO_PULL_FLAGS_UNTRUSTED) == 0) pull_data->importflags |= _OSTREE_REPO_IMPORT_FLAGS_TRUSTED; + + /* Shouldn't be referenced in this path, but just in case. See below + * for more information. + */ + pull_data->trusted_http_direct = FALSE; } else { @@ -3597,6 +3573,18 @@ ostree_repo_pull_with_options (OstreeRepo *self, */ if (flags & OSTREE_REPO_PULL_FLAGS_TRUSTED_HTTP) pull_data->importflags |= _OSTREE_REPO_IMPORT_FLAGS_TRUSTED; + + const gboolean verifying_bareuseronly = + (pull_data->importflags & _OSTREE_REPO_IMPORT_FLAGS_VERIFY_BAREUSERONLY) > 0; + /* If we're mirroring and writing into an archive repo, and both checksum and + * bareuseronly are turned off, we can directly copy the content rather than + * paying the cost of exploding it, checksumming, and re-gzip. + */ + const gboolean mirroring_into_archive = + pull_data->is_mirror && pull_data->repo->mode == OSTREE_REPO_MODE_ARCHIVE; + const gboolean import_trusted = !verifying_bareuseronly && + (pull_data->importflags & _OSTREE_REPO_IMPORT_FLAGS_TRUSTED) > 0; + pull_data->trusted_http_direct = mirroring_into_archive && import_trusted; } /* We can't use static deltas if pulling into an archive repo. */ From a903f96673ec8c42c7ccc60018a56b09539ad8f9 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Wed, 4 Oct 2017 16:55:53 -0400 Subject: [PATCH 22/98] lib/util: Delete some unused functions Hooray, dead code. Closes: #1254 Approved by: jlebon --- Makefile-otutil.am | 1 - src/libotutil/ot-variant-utils.c | 22 ------------------ src/libotutil/ot-variant-utils.h | 4 ---- src/libotutil/otutil.c | 40 -------------------------------- src/libotutil/otutil.h | 2 -- 5 files changed, 69 deletions(-) delete mode 100644 src/libotutil/otutil.c diff --git a/Makefile-otutil.am b/Makefile-otutil.am index ff7533e9..c4c0338d 100644 --- a/Makefile-otutil.am +++ b/Makefile-otutil.am @@ -38,7 +38,6 @@ libotutil_la_SOURCES = \ src/libotutil/ot-gio-utils.h \ src/libotutil/ot-gpg-utils.c \ src/libotutil/ot-gpg-utils.h \ - src/libotutil/otutil.c \ src/libotutil/otutil.h \ src/libotutil/ot-tool-util.c \ src/libotutil/ot-tool-util.h \ diff --git a/src/libotutil/ot-variant-utils.c b/src/libotutil/ot-variant-utils.c index 1429a3a7..afb80be1 100644 --- a/src/libotutil/ot-variant-utils.c +++ b/src/libotutil/ot-variant-utils.c @@ -60,28 +60,6 @@ ot_gvariant_new_ay_bytes (GBytes *bytes) TRUE, (GDestroyNotify)g_bytes_unref, bytes); } -/* Convert a GVariant of type a{sv} to a GHashTable */ -GHashTable * -ot_util_variant_asv_to_hash_table (GVariant *variant) -{ - - GHashTable *ret = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify)g_variant_unref); - g_autoptr(GVariantIter) viter = g_variant_iter_new (variant); - - char *key; - GVariant *value; - while (g_variant_iter_next (viter, "{s@v}", &key, &value)) - g_hash_table_replace (ret, key, g_variant_ref_sink (value)); - - return ret; -} - -GVariant * -ot_util_variant_take_ref (GVariant *variant) -{ - return g_variant_take_ref (variant); -} - /* Create a GVariant in @out_variant that is backed by * the data from @fd, starting at @start. If the data is * large enough, mmap() may be used. @trusted is used diff --git a/src/libotutil/ot-variant-utils.h b/src/libotutil/ot-variant-utils.h index 379e19ac..e6910470 100644 --- a/src/libotutil/ot-variant-utils.h +++ b/src/libotutil/ot-variant-utils.h @@ -32,10 +32,6 @@ GVariant *ot_gvariant_new_ay_bytes (GBytes *bytes); GVariant *ot_gvariant_new_empty_string_dict (void); -GHashTable *ot_util_variant_asv_to_hash_table (GVariant *variant); - -GVariant * ot_util_variant_take_ref (GVariant *variant); - gboolean ot_variant_read_fd (int fd, goffset offset, const GVariantType *type, diff --git a/src/libotutil/otutil.c b/src/libotutil/otutil.c deleted file mode 100644 index 26aed9b0..00000000 --- a/src/libotutil/otutil.c +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2011 Colin Walters - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Colin Walters - */ - -#include "config.h" - -#include "otutil.h" - -#include - -void -ot_ptrarray_add_many (GPtrArray *a, ...) -{ - va_list args; - void *p; - - va_start (args, a); - - while ((p = va_arg (args, void *)) != NULL) - g_ptr_array_add (a, p); - - va_end (args); -} diff --git a/src/libotutil/otutil.h b/src/libotutil/otutil.h index d6fc603d..80acb475 100644 --- a/src/libotutil/otutil.h +++ b/src/libotutil/otutil.h @@ -51,5 +51,3 @@ #include #include #include - -void ot_ptrarray_add_many (GPtrArray *a, ...) G_GNUC_NULL_TERMINATED; From fc33ae018dccbcab633b69474db0811987355212 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Thu, 5 Oct 2017 11:14:17 -0400 Subject: [PATCH 23/98] lib/deltas: Move variant read helper into the deltas code What the deltas code is doing is weird/unfortunate. The name `ot_variant_read()` conflicts too much with `ot_variant_read_fd()`. Since nothing else uses it, move it into the deltas code. Closes: #1254 Approved by: jlebon --- .../ostree-repo-static-delta-compilation.c | 17 +++++++++++++++-- src/libotutil/ot-variant-utils.c | 13 ------------- src/libotutil/ot-variant-utils.h | 2 -- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/libostree/ostree-repo-static-delta-compilation.c b/src/libostree/ostree-repo-static-delta-compilation.c index 759a75a4..a3b28470 100644 --- a/src/libostree/ostree-repo-static-delta-compilation.c +++ b/src/libostree/ostree-repo-static-delta-compilation.c @@ -1141,6 +1141,19 @@ get_fallback_headers (OstreeRepo *self, return TRUE; } +/* Get an input stream for a GVariant */ +static GInputStream * +variant_to_inputstream (GVariant *variant) +{ + GMemoryInputStream *ret = (GMemoryInputStream*) + g_memory_input_stream_new_from_data (g_variant_get_data (variant), + g_variant_get_size (variant), + NULL); + g_object_set_data_full ((GObject*)ret, "ot-variant-data", + g_variant_ref (variant), (GDestroyNotify) g_variant_unref); + return (GInputStream*)ret; +} + /** * ostree_repo_static_delta_generate: * @self: Repo @@ -1349,7 +1362,7 @@ ostree_repo_static_delta_generate (OstreeRepo *self, /* Hardcode xz for now */ compressor = (GConverter*)_ostree_lzma_compressor_new (NULL); compression_type_char = 'x'; - part_payload_in = ot_variant_read (delta_part_content); + part_payload_in = variant_to_inputstream (delta_part_content); part_payload_out = (GMemoryOutputStream*)g_memory_output_stream_new (NULL, 0, g_realloc, g_free); part_payload_compressor = (GConverterOutputStream*)g_converter_output_stream_new ((GOutputStream*)part_payload_out, compressor); @@ -1386,7 +1399,7 @@ ostree_repo_static_delta_generate (OstreeRepo *self, g_ptr_array_add (part_temp_paths, g_steal_pointer (&part_tmpf)); } - part_in = ot_variant_read (delta_part); + part_in = variant_to_inputstream (delta_part); if (!ot_gio_splice_get_checksum (part_temp_outstream, part_in, &part_checksum, cancellable, error)) diff --git a/src/libotutil/ot-variant-utils.c b/src/libotutil/ot-variant-utils.c index afb80be1..11638794 100644 --- a/src/libotutil/ot-variant-utils.c +++ b/src/libotutil/ot-variant-utils.c @@ -81,19 +81,6 @@ ot_variant_read_fd (int fd, return TRUE; } -/* Get an input stream for a GVariant */ -GInputStream * -ot_variant_read (GVariant *variant) -{ - GMemoryInputStream *ret = (GMemoryInputStream*) - g_memory_input_stream_new_from_data (g_variant_get_data (variant), - g_variant_get_size (variant), - NULL); - g_object_set_data_full ((GObject*)ret, "ot-variant-data", - g_variant_ref (variant), (GDestroyNotify) g_variant_unref); - return (GInputStream*)ret; -} - /* GVariants are immutable; this function allows generating an open builder * for a new variant, inherting the data from @variant. */ diff --git a/src/libotutil/ot-variant-utils.h b/src/libotutil/ot-variant-utils.h index e6910470..a59cbffb 100644 --- a/src/libotutil/ot-variant-utils.h +++ b/src/libotutil/ot-variant-utils.h @@ -39,8 +39,6 @@ gboolean ot_variant_read_fd (int fd, GVariant **out_variant, GError **error); -GInputStream *ot_variant_read (GVariant *variant); - GVariantBuilder *ot_util_variant_builder_from_variant (GVariant *variant, const GVariantType *type); From bba7eb80699cb789f31914bc98fc338c46237b37 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Tue, 3 Oct 2017 17:34:06 -0400 Subject: [PATCH 24/98] commit: Add _CONSUME modifier flag For many cases of commit, we can actually optimize things by simply "adopting" the object rather than writing a new copy. For example, in rpm-ostree package layering. We can only make that optimization though if we take ownership of the file. This commit hence adds an API where a caller tells us to do so. For now, that just means we `unlink()` the files/dirs as we go, but we can now later add the "adopt" optimization. Closes: #1255 Approved by: jlebon --- bash/ostree | 1 + man/ostree-commit.xml | 11 +++++++++ src/libostree/ostree-repo-commit.c | 36 ++++++++++++++++++++++++++++++ src/libostree/ostree-repo.h | 2 ++ src/ostree/ot-builtin-commit.c | 4 ++++ tests/basic-test.sh | 12 +++++++++- 6 files changed, 65 insertions(+), 1 deletion(-) diff --git a/bash/ostree b/bash/ostree index 40326102..034f101b 100644 --- a/bash/ostree +++ b/bash/ostree @@ -773,6 +773,7 @@ _ostree_commit() { --link-checkout-speedup --no-xattrs --orphan + --consume --skip-if-unchanged --table-output --tar-autocreate-parents diff --git a/man/ostree-commit.xml b/man/ostree-commit.xml index 8f0037f6..66bc5fff 100644 --- a/man/ostree-commit.xml +++ b/man/ostree-commit.xml @@ -167,6 +167,17 @@ Boston, MA 02111-1307, USA. + + + + + When committing from a local directory (i.e. not an archive or --tree=ref), + assume ownership of the content. This may simply involve deleting it, + but if possible, the content may simply be rename()ed + into the repository rather than creating a new copy. + + + ="PATH" diff --git a/src/libostree/ostree-repo-commit.c b/src/libostree/ostree-repo-commit.c index a9ae4af2..2bffbae3 100644 --- a/src/libostree/ostree-repo-commit.c +++ b/src/libostree/ostree-repo-commit.c @@ -2589,9 +2589,22 @@ write_directory_content_to_mtree_internal (OstreeRepo *self, _ostree_repo_commit_modifier_apply (self, modifier, child_relpath, child_info, &modified_info); const gboolean child_info_was_modified = !_ostree_gfileinfo_equal (child_info, modified_info); + /* We currently only honor the CONSUME flag in the dfd_iter case to avoid even + * more complexity in this function, and it'd mostly only be useful when + * operating on local filesystems anyways. + */ + const gboolean delete_after_commit = dfd_iter && modifier && + (modifier->flags & OSTREE_REPO_COMMIT_MODIFIER_FLAGS_CONSUME); + if (filter_result != OSTREE_REPO_COMMIT_FILTER_ALLOW) { g_ptr_array_remove_index (path, path->len - 1); + if (delete_after_commit) + { + g_assert (dfd_iter); + if (!glnx_shutil_rm_rf_at (dfd_iter->fd, name, cancellable, error)) + return FALSE; + } /* Note: early return */ return TRUE; } @@ -2635,6 +2648,12 @@ write_directory_content_to_mtree_internal (OstreeRepo *self, modifier, path, cancellable, error)) return FALSE; + + if (delete_after_commit) + { + if (!glnx_unlinkat (dfd_iter->fd, name, AT_REMOVEDIR, error)) + return FALSE; + } } } else if (repo_dir) @@ -2711,6 +2730,12 @@ write_directory_content_to_mtree_internal (OstreeRepo *self, error)) return FALSE; } + + if (delete_after_commit) + { + if (!glnx_unlinkat (dfd_iter->fd, name, 0, error)) + return FALSE; + } } g_ptr_array_remove_index (path, path->len - 1); @@ -2991,6 +3016,17 @@ ostree_repo_write_dfd_to_mtree (OstreeRepo *self, cancellable, error)) return FALSE; + /* And now finally remove the toplevel; see also the handling for this flag in + * the write_dfd_iter_to_mtree_internal() function. + */ + const gboolean delete_after_commit = modifier && + (modifier->flags & OSTREE_REPO_COMMIT_MODIFIER_FLAGS_CONSUME); + if (delete_after_commit) + { + if (!glnx_unlinkat (dfd, path, AT_REMOVEDIR, error)) + return FALSE; + } + return TRUE; } diff --git a/src/libostree/ostree-repo.h b/src/libostree/ostree-repo.h index 990573e7..4f73a051 100644 --- a/src/libostree/ostree-repo.h +++ b/src/libostree/ostree-repo.h @@ -630,6 +630,7 @@ typedef OstreeRepoCommitFilterResult (*OstreeRepoCommitFilter) (OstreeRepo *r * @OSTREE_REPO_COMMIT_MODIFIER_FLAGS_GENERATE_SIZES: Generate size information. * @OSTREE_REPO_COMMIT_MODIFIER_FLAGS_CANONICAL_PERMISSIONS: Canonicalize permissions for bare-user-only mode. * @OSTREE_REPO_COMMIT_MODIFIER_FLAGS_ERROR_ON_UNLABELED: Emit an error if configured SELinux policy does not provide a label + * @OSTREE_REPO_COMMIT_MODIFIER_FLAGS_CONSUME: Delete added files/directories after commit; Since: 2017.13 */ typedef enum { OSTREE_REPO_COMMIT_MODIFIER_FLAGS_NONE = 0, @@ -637,6 +638,7 @@ typedef enum { OSTREE_REPO_COMMIT_MODIFIER_FLAGS_GENERATE_SIZES = (1 << 1), OSTREE_REPO_COMMIT_MODIFIER_FLAGS_CANONICAL_PERMISSIONS = (1 << 2), OSTREE_REPO_COMMIT_MODIFIER_FLAGS_ERROR_ON_UNLABELED = (1 << 3), + OSTREE_REPO_COMMIT_MODIFIER_FLAGS_CONSUME = (1 << 4), } OstreeRepoCommitModifierFlags; /** diff --git a/src/ostree/ot-builtin-commit.c b/src/ostree/ot-builtin-commit.c index c1d88b3b..97431062 100644 --- a/src/ostree/ot-builtin-commit.c +++ b/src/ostree/ot-builtin-commit.c @@ -50,6 +50,7 @@ static char *opt_tar_pathname_filter; static gboolean opt_no_xattrs; static char *opt_selinux_policy; static gboolean opt_canonical_permissions; +static gboolean opt_consume; static char **opt_trees; static gint opt_owner_uid = -1; static gint opt_owner_gid = -1; @@ -102,6 +103,7 @@ static GOptionEntry options[] = { { "skip-if-unchanged", 0, 0, G_OPTION_ARG_NONE, &opt_skip_if_unchanged, "If the contents are unchanged from previous commit, do nothing", NULL }, { "statoverride", 0, 0, G_OPTION_ARG_FILENAME, &opt_statoverride_file, "File containing list of modifications to make to permissions", "PATH" }, { "skip-list", 0, 0, G_OPTION_ARG_FILENAME, &opt_skiplist_file, "File containing list of files to skip", "PATH" }, + { "consume", 0, 0, G_OPTION_ARG_NONE, &opt_consume, "Consume (delete) content after commit (for local directories)", NULL }, { "table-output", 0, 0, G_OPTION_ARG_NONE, &opt_table_output, "Output more information in a KEY: VALUE format", NULL }, { "gpg-sign", 0, 0, G_OPTION_ARG_STRING_ARRAY, &opt_key_ids, "GPG Key ID to sign the commit with", "KEY-ID"}, { "gpg-homedir", 0, 0, G_OPTION_ARG_FILENAME, &opt_gpg_homedir, "GPG Homedir to use when looking for keyrings", "HOMEDIR"}, @@ -476,6 +478,8 @@ ostree_builtin_commit (int argc, char **argv, GCancellable *cancellable, GError if (opt_no_xattrs) flags |= OSTREE_REPO_COMMIT_MODIFIER_FLAGS_SKIP_XATTRS; + if (opt_consume) + flags |= OSTREE_REPO_COMMIT_MODIFIER_FLAGS_CONSUME; if (opt_canonical_permissions) flags |= OSTREE_REPO_COMMIT_MODIFIER_FLAGS_CANONICAL_PERMISSIONS; if (opt_generate_sizes) diff --git a/tests/basic-test.sh b/tests/basic-test.sh index a01f437a..037f7b45 100644 --- a/tests/basic-test.sh +++ b/tests/basic-test.sh @@ -19,7 +19,7 @@ set -euo pipefail -echo "1..$((73 + ${extra_basic_tests:-0}))" +echo "1..$((74 + ${extra_basic_tests:-0}))" CHECKOUT_U_ARG="" CHECKOUT_H_ARGS="-H" @@ -177,6 +177,16 @@ assert_file_has_content yet/another/tree/green 'leaf' assert_file_has_content four '4' echo "ok cwd contents" +cd ${test_tmpdir} +rm checkout-test2-l -rf +$OSTREE checkout ${CHECKOUT_H_ARGS} test2 $test_tmpdir/checkout-test2-l +date > $test_tmpdir/checkout-test2-l/newdatefile.txt +$OSTREE commit --link-checkout-speedup --consume -b test2 --tree=dir=$test_tmpdir/checkout-test2-l +assert_not_has_dir $test_tmpdir/checkout-test2-l +# Some of the later tests are sensitive to state +$OSTREE reset test2 test2^ +echo "ok consume (nom nom nom)" + cd ${test_tmpdir} $OSTREE commit ${COMMIT_ARGS} -b test2-no-parent -s '' $test_tmpdir/checkout-test2-4 assert_streq $($OSTREE log test2-no-parent |grep '^commit' | wc -l) "1" From 1c9975cbd12b05927e1969e5675479aea437188b Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Fri, 6 Oct 2017 16:38:08 -0400 Subject: [PATCH 25/98] lib: Add a lighter weight internal checksum wrapper The faster (OpenSSL/GnuTLS) code lived in a `GInputStream` wrapper, and that adds a lot of weight (GObject + vtable calls). Move it into a simple autoptr-struct wrapper, and use it in the metadata path, so we're now using the faster checksums there too. This also drops a malloc there as the new API does hexdigest in place to a buffer. Prep for more work in the commit path to avoid `GInputStream` for local file commits, and ["adopting" files](https://github.com/ostreedev/ostree/pull/1255). Closes: #1256 Approved by: jlebon --- src/libostree/ostree-core-private.h | 3 +- src/libostree/ostree-core.c | 22 +-- src/libostree/ostree-repo-commit.c | 11 +- .../ostree-repo-static-delta-processing.c | 19 +-- src/libostree/ostree-sysroot-deploy.c | 11 +- src/libotutil/ot-checksum-instream.c | 136 +--------------- src/libotutil/ot-checksum-instream.h | 6 - src/libotutil/ot-checksum-utils.c | 147 ++++++++++++++++-- src/libotutil/ot-checksum-utils.h | 37 ++++- 9 files changed, 216 insertions(+), 176 deletions(-) diff --git a/src/libostree/ostree-core-private.h b/src/libostree/ostree-core-private.h index 0658a0cb..70b12b68 100644 --- a/src/libostree/ostree-core-private.h +++ b/src/libostree/ostree-core-private.h @@ -20,6 +20,7 @@ #pragma once #include "ostree-core.h" +#include "otutil.h" #include G_BEGIN_DECLS @@ -77,7 +78,7 @@ gboolean _ostree_write_variant_with_size (GOutputStream *output, GVariant *variant, guint64 alignment_offset, gsize *out_bytes_written, - GChecksum *checksum, + OtChecksum *checksum, GCancellable *cancellable, GError **error); diff --git a/src/libostree/ostree-core.c b/src/libostree/ostree-core.c index 7fa051f2..2fafe99d 100644 --- a/src/libostree/ostree-core.c +++ b/src/libostree/ostree-core.c @@ -358,7 +358,7 @@ write_padding (GOutputStream *output, guint alignment, gsize offset, gsize *out_bytes_written, - GChecksum *checksum, + OtChecksum *checksum, GCancellable *cancellable, GError **error) { @@ -403,7 +403,7 @@ _ostree_write_variant_with_size (GOutputStream *output, GVariant *variant, guint64 alignment_offset, gsize *out_bytes_written, - GChecksum *checksum, + OtChecksum *checksum, GCancellable *cancellable, GError **error) { @@ -458,7 +458,7 @@ _ostree_write_variant_with_size (GOutputStream *output, static gboolean write_file_header_update_checksum (GOutputStream *out, GVariant *header, - GChecksum *checksum, + OtChecksum *checksum, GCancellable *cancellable, GError **error) { @@ -859,18 +859,19 @@ ostree_checksum_file_from_input (GFileInfo *file_info, GError **error) { - g_autoptr(GChecksum) checksum = g_checksum_new (G_CHECKSUM_SHA256); + g_auto(OtChecksum) checksum = { 0, }; + ot_checksum_init (&checksum); if (OSTREE_OBJECT_TYPE_IS_META (objtype)) { - if (!ot_gio_splice_update_checksum (NULL, in, checksum, cancellable, error)) + if (!ot_gio_splice_update_checksum (NULL, in, &checksum, cancellable, error)) return FALSE; } else if (g_file_info_get_file_type (file_info) == G_FILE_TYPE_DIRECTORY) { g_autoptr(GVariant) dirmeta = ostree_create_directory_metadata (file_info, xattrs); - g_checksum_update (checksum, g_variant_get_data (dirmeta), - g_variant_get_size (dirmeta)); + ot_checksum_update (&checksum, g_variant_get_data (dirmeta), + g_variant_get_size (dirmeta)); } else { @@ -878,18 +879,19 @@ ostree_checksum_file_from_input (GFileInfo *file_info, file_header = _ostree_file_header_new (file_info, xattrs); - if (!write_file_header_update_checksum (NULL, file_header, checksum, + if (!write_file_header_update_checksum (NULL, file_header, &checksum, cancellable, error)) return FALSE; if (g_file_info_get_file_type (file_info) == G_FILE_TYPE_REGULAR) { - if (!ot_gio_splice_update_checksum (NULL, in, checksum, cancellable, error)) + if (!ot_gio_splice_update_checksum (NULL, in, &checksum, cancellable, error)) return FALSE; } } - *out_csum = ot_csum_from_gchecksum (checksum); + *out_csum = g_malloc (OSTREE_SHA256_DIGEST_LEN); + ot_checksum_get_digest (&checksum, *out_csum, OSTREE_SHA256_DIGEST_LEN); return TRUE; } diff --git a/src/libostree/ostree-repo-commit.c b/src/libostree/ostree-repo-commit.c index 2bffbae3..377adc75 100644 --- a/src/libostree/ostree-repo-commit.c +++ b/src/libostree/ostree-repo-commit.c @@ -811,14 +811,19 @@ write_metadata_object (OstreeRepo *self, * *original* sha256 to say what commit was being killed. */ const gboolean is_tombstone = (objtype == OSTREE_OBJECT_TYPE_TOMBSTONE_COMMIT); - g_autofree char *actual_checksum = NULL; + char actual_checksum[OSTREE_SHA256_STRING_LEN+1]; if (is_tombstone) { - actual_checksum = g_strdup (expected_checksum); + memcpy (actual_checksum, expected_checksum, sizeof (actual_checksum)); } else { - actual_checksum = g_compute_checksum_for_bytes (G_CHECKSUM_SHA256, buf); + OtChecksum checksum = { 0, }; + ot_checksum_init (&checksum); + gsize len; + const guint8*bufdata = g_bytes_get_data (buf, &len); + ot_checksum_update (&checksum, bufdata, len); + ot_checksum_get_hexdigest (&checksum, actual_checksum, sizeof (actual_checksum)); gboolean have_obj; if (!_ostree_repo_has_loose_object (self, actual_checksum, objtype, &have_obj, cancellable, error)) diff --git a/src/libostree/ostree-repo-static-delta-processing.c b/src/libostree/ostree-repo-static-delta-processing.c index 844de2c6..fca0f216 100644 --- a/src/libostree/ostree-repo-static-delta-processing.c +++ b/src/libostree/ostree-repo-static-delta-processing.c @@ -58,7 +58,7 @@ typedef struct { GLnxTmpfile tmpf; guint64 content_size; GOutputStream *content_out; - GChecksum *content_checksum; + OtChecksum content_checksum; char checksum[OSTREE_SHA256_STRING_LEN+1]; char *read_source_object; int read_source_fd; @@ -277,7 +277,7 @@ _ostree_static_delta_part_execute (OstreeRepo *repo, out: glnx_tmpfile_clear (&state->tmpf); g_clear_object (&state->content_out); - g_clear_pointer (&state->content_checksum, g_checksum_free); + ot_checksum_clear (&state->content_checksum); return ret; } @@ -385,8 +385,8 @@ content_out_write (OstreeRepo *repo, { gsize bytes_written; - if (state->content_checksum) - g_checksum_update (state->content_checksum, buf, len); + if (state->content_checksum.initialized) + ot_checksum_update (&state->content_checksum, buf, len); /* Ignore bytes_written since we discard partial content */ if (!g_output_stream_write_all (state->content_out, @@ -503,10 +503,10 @@ handle_untrusted_content_checksum (OstreeRepo *repo, g_autoptr(GFileInfo) finfo = _ostree_mode_uidgid_to_gfileinfo (state->mode, state->uid, state->gid); g_autoptr(GVariant) header = _ostree_file_header_new (finfo, state->xattrs); - state->content_checksum = g_checksum_new (G_CHECKSUM_SHA256); + ot_checksum_init (&state->content_checksum); gsize bytes_written; - if (!_ostree_write_variant_with_size (NULL, header, 0, &bytes_written, state->content_checksum, + if (!_ostree_write_variant_with_size (NULL, header, 0, &bytes_written, &state->content_checksum, cancellable, error)) return FALSE; @@ -827,9 +827,10 @@ dispatch_close (OstreeRepo *repo, if (!g_output_stream_flush (state->content_out, cancellable, error)) return FALSE; - if (state->content_checksum) + if (state->content_checksum.initialized) { - const char *actual_checksum = g_checksum_get_string (state->content_checksum); + char actual_checksum[OSTREE_SHA256_STRING_LEN+1]; + ot_checksum_get_hexdigest (&state->content_checksum, actual_checksum, sizeof (actual_checksum)); if (strcmp (actual_checksum, state->checksum) != 0) return glnx_throw (error, "Corrupted object %s (actual checksum is %s)", @@ -848,7 +849,7 @@ dispatch_close (OstreeRepo *repo, return FALSE; g_clear_pointer (&state->xattrs, g_variant_unref); - g_clear_pointer (&state->content_checksum, g_checksum_free); + ot_checksum_clear (&state->content_checksum); state->checksum_index++; state->output_target = NULL; diff --git a/src/libostree/ostree-sysroot-deploy.c b/src/libostree/ostree-sysroot-deploy.c index 4f453034..920c0eb4 100644 --- a/src/libostree/ostree-sysroot-deploy.c +++ b/src/libostree/ostree-sysroot-deploy.c @@ -989,13 +989,14 @@ get_kernel_from_tree_usrlib_modules (int deployment_dfd, } /* We found a module directory, compute the checksum */ - g_autoptr(GChecksum) checksum = g_checksum_new (G_CHECKSUM_SHA256); + g_auto(OtChecksum) checksum = { 0, }; + ot_checksum_init (&checksum); glnx_fd_close int fd = -1; /* Checksum the kernel */ if (!glnx_openat_rdonly (ret_layout->boot_dfd, "vmlinuz", TRUE, &fd, error)) return FALSE; g_autoptr(GInputStream) in = g_unix_input_stream_new (fd, FALSE); - if (!ot_gio_splice_update_checksum (NULL, in, checksum, cancellable, error)) + if (!ot_gio_splice_update_checksum (NULL, in, &checksum, cancellable, error)) return FALSE; g_clear_object (&in); (void) close (fd); fd = -1; @@ -1022,11 +1023,13 @@ get_kernel_from_tree_usrlib_modules (int deployment_dfd, ret_layout->initramfs_srcpath = g_strdup (initramfs_path); ret_layout->initramfs_namever = g_strdup_printf ("initramfs-%s.img", kver); in = g_unix_input_stream_new (fd, FALSE); - if (!ot_gio_splice_update_checksum (NULL, in, checksum, cancellable, error)) + if (!ot_gio_splice_update_checksum (NULL, in, &checksum, cancellable, error)) return FALSE; } - ret_layout->bootcsum = g_strdup (g_checksum_get_string (checksum)); + char hexdigest[OSTREE_SHA256_STRING_LEN+1]; + ot_checksum_get_hexdigest (&checksum, hexdigest, sizeof (hexdigest)); + ret_layout->bootcsum = g_strdup (hexdigest); *out_layout = g_steal_pointer (&ret_layout); return TRUE; diff --git a/src/libotutil/ot-checksum-instream.c b/src/libotutil/ot-checksum-instream.c index 368a337d..342b14b4 100644 --- a/src/libotutil/ot-checksum-instream.c +++ b/src/libotutil/ot-checksum-instream.c @@ -22,25 +22,10 @@ #include "ot-checksum-instream.h" #include "ot-checksum-utils.h" -#if defined(HAVE_OPENSSL) -#include -#elif defined(HAVE_GNUTLS) -#include -#include -#endif - G_DEFINE_TYPE (OtChecksumInstream, ot_checksum_instream, G_TYPE_FILTER_INPUT_STREAM) struct _OtChecksumInstreamPrivate { -#if defined(HAVE_OPENSSL) - EVP_MD_CTX *checksum; -#elif defined(HAVE_GNUTLS) - gnutls_digest_algorithm_t checksum_type; - gnutls_hash_hd_t checksum; -#else - GChecksumType checksum_type; - GChecksum *checksum; -#endif + OtChecksum checksum; }; static gssize ot_checksum_instream_read (GInputStream *stream, @@ -54,13 +39,7 @@ ot_checksum_instream_finalize (GObject *object) { OtChecksumInstream *self = (OtChecksumInstream*)object; -#if defined(HAVE_OPENSSL) - EVP_MD_CTX_destroy (self->priv->checksum); -#elif defined(HAVE_GNUTLS) - gnutls_hash_deinit (self->priv->checksum, NULL); -#else - g_checksum_free (self->priv->checksum); -#endif + ot_checksum_clear (&self->priv->checksum); G_OBJECT_CLASS (ot_checksum_instream_parent_class)->finalize (object); } @@ -83,33 +62,6 @@ ot_checksum_instream_init (OtChecksumInstream *self) self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, OT_TYPE_CHECKSUM_INSTREAM, OtChecksumInstreamPrivate); } -#if defined(HAVE_OPENSSL) -static const EVP_MD * -gchecksum_type_to_openssl (GChecksumType checksum_type) -{ - switch (checksum_type) - { - case G_CHECKSUM_SHA256: - return EVP_sha256 (); - default: - /* If there's something else, fill in here */ - g_assert_not_reached (); - } -} -#elif defined(HAVE_GNUTLS) -static gnutls_digest_algorithm_t -gchecksum_type_to_gnutls (GChecksumType checksum_type) -{ - switch (checksum_type) - { - case G_CHECKSUM_SHA256: - return GNUTLS_DIG_SHA256; - default: - g_assert_not_reached (); - } -} -#endif - OtChecksumInstream * ot_checksum_instream_new (GInputStream *base, GChecksumType checksum_type) @@ -124,18 +76,7 @@ ot_checksum_instream_new (GInputStream *base, /* For now */ g_assert (checksum_type == G_CHECKSUM_SHA256); - -#if defined(HAVE_OPENSSL) - stream->priv->checksum = EVP_MD_CTX_create (); - g_assert (stream->priv->checksum); - g_assert (EVP_DigestInit_ex (stream->priv->checksum, gchecksum_type_to_openssl (checksum_type), NULL)); -#elif defined(HAVE_GNUTLS) - stream->priv->checksum_type = gchecksum_type_to_gnutls (checksum_type); - g_assert (!gnutls_hash_init (&stream->priv->checksum, stream->priv->checksum_type)); -#else - stream->priv->checksum = g_checksum_new (checksum_type); - stream->priv->checksum_type = checksum_type; -#endif + ot_checksum_init (&stream->priv->checksum); return (OtChecksumInstream*) (stream); } @@ -157,78 +98,15 @@ ot_checksum_instream_read (GInputStream *stream, cancellable, error); if (res > 0) - { -#if defined(HAVE_OPENSSL) - g_assert (EVP_DigestUpdate (self->priv->checksum, buffer, res)); -#elif defined(HAVE_GNUTLS) - g_assert (!gnutls_hash (self->priv->checksum, buffer, res)); -#else - g_checksum_update (self->priv->checksum, buffer, res); -#endif - } + ot_checksum_update (&self->priv->checksum, buffer, res); return res; } -void -ot_checksum_instream_get_digest (OtChecksumInstream *stream, - guint8 *buffer, - gsize *digest_len) -{ -#if defined(HAVE_OPENSSL) - unsigned len; - EVP_DigestFinal_ex (stream->priv->checksum, buffer, &len); - if (digest_len) - *digest_len = len; -#elif defined(HAVE_GNUTLS) - gnutls_hash_output (stream->priv->checksum, buffer); - if (digest_len) - *digest_len = gnutls_hash_get_len (stream->priv->checksum_type); -#else - g_checksum_get_digest (stream->priv->checksum, buffer, digest_len); -#endif -} - -guint8* -ot_checksum_instream_dup_digest (OtChecksumInstream *stream, - gsize *ret_len) -{ -#if defined(HAVE_OPENSSL) - guint len; - guchar *ret = g_malloc0 (EVP_MAX_MD_SIZE); - g_assert (EVP_DigestFinal_ex (stream->priv->checksum, ret, &len)); -#elif defined(HAVE_GNUTLS) - guint len = gnutls_hash_get_len (stream->priv->checksum_type); - guchar *ret = g_malloc0 (len); - gnutls_hash_output (stream->priv->checksum, ret); -#else - gsize len = g_checksum_type_get_length (stream->priv->checksum_type); - guchar *ret = g_malloc (len); - g_checksum_get_digest (stream->priv->checksum, ret, &len); -#endif - if (ret_len) - *ret_len = len; - return ret; -} - char * ot_checksum_instream_get_string (OtChecksumInstream *stream) { -#if defined(HAVE_OPENSSL) - unsigned len; - guint8 csum[EVP_MAX_MD_SIZE]; - g_assert (EVP_DigestFinal_ex (stream->priv->checksum, csum, &len)); - char *buf = g_malloc (len * 2 + 1); - ot_bin2hex (buf, (guint8*)csum, len); - return buf; -#elif defined(HAVE_GNUTLS) - gsize len; - guint8 *csum = ot_checksum_instream_dup_digest(stream, &len); - char *buf = g_malloc0 (len * 2 + 1); - ot_bin2hex (buf, csum, len); - g_free (csum); - return buf; -#else - return g_strdup (g_checksum_get_string (stream->priv->checksum)); -#endif + char buf[_OSTREE_SHA256_STRING_LEN+1]; + ot_checksum_get_hexdigest (&stream->priv->checksum, buf, sizeof(buf)); + return g_strndup (buf, sizeof(buf)); } diff --git a/src/libotutil/ot-checksum-instream.h b/src/libotutil/ot-checksum-instream.h index 6525aa91..410047a9 100644 --- a/src/libotutil/ot-checksum-instream.h +++ b/src/libotutil/ot-checksum-instream.h @@ -52,12 +52,6 @@ GType ot_checksum_instream_get_type (void) G_GNUC_CONST; OtChecksumInstream * ot_checksum_instream_new (GInputStream *stream, GChecksumType checksum); -void ot_checksum_instream_get_digest (OtChecksumInstream *stream, - guint8 *buffer, - gsize *digest_len); - -guint8* ot_checksum_instream_dup_digest (OtChecksumInstream *stream, - gsize *ret_len); char * ot_checksum_instream_get_string (OtChecksumInstream *stream); G_END_DECLS diff --git a/src/libotutil/ot-checksum-utils.c b/src/libotutil/ot-checksum-utils.c index bd787a3f..beba888b 100644 --- a/src/libotutil/ot-checksum-utils.c +++ b/src/libotutil/ot-checksum-utils.c @@ -22,10 +22,15 @@ #include "config.h" #include "otutil.h" +#if defined(HAVE_OPENSSL) +#include +#elif defined(HAVE_GNUTLS) +#include +#include +#endif #include - void ot_bin2hex (char *out_buf, const guint8 *inbuf, gsize len) { @@ -41,6 +46,119 @@ ot_bin2hex (char *out_buf, const guint8 *inbuf, gsize len) out_buf[j] = '\0'; } +/* I like to think of this as AbstractChecksumProxyFactoryBean. In homage to + * https://news.ycombinator.com/item?id=4549544 + * aka http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/aop/framework/AbstractSingletonProxyFactoryBean.html + */ +typedef struct { + gboolean initialized; +#if defined(HAVE_OPENSSL) + EVP_MD_CTX *checksum; +#elif defined(HAVE_GNUTLS) + gnutls_hash_hd_t checksum; +#else + GChecksum *checksum; +#endif + guint digest_len; +} OtRealChecksum; + +G_STATIC_ASSERT (sizeof (OtChecksum) >= sizeof (OtRealChecksum)); + +void +ot_checksum_init (OtChecksum *checksum) +{ + OtRealChecksum *real = (OtRealChecksum*)checksum; + g_return_if_fail (!real->initialized); +#if defined(HAVE_OPENSSL) + real->checksum = EVP_MD_CTX_create (); + g_assert (real->checksum); + g_assert (EVP_DigestInit_ex (real->checksum, EVP_sha256 (), NULL)); + real->digest_len = EVP_MAX_MD_SIZE; +#elif defined(HAVE_GNUTLS) + g_assert (!gnutls_hash_init (&real->checksum, GNUTLS_DIG_SHA256)); + real->digest_len = gnutls_hash_get_len (GNUTLS_DIG_SHA256); +#else + real->checksum = g_checksum_new (G_CHECKSUM_SHA256); + real->digest_len = g_checksum_type_get_length (G_CHECKSUM_SHA256); +#endif + real->initialized = TRUE; +} + +void +ot_checksum_update (OtChecksum *checksum, + const guint8 *buf, + size_t len) +{ + OtRealChecksum *real = (OtRealChecksum*)checksum; + g_return_if_fail (real->initialized); +#if defined(HAVE_OPENSSL) + g_assert (EVP_DigestUpdate (real->checksum, buf, len)); +#elif defined(HAVE_GNUTLS) + g_assert (!gnutls_hash (real->checksum, buf, len)); +#else + g_checksum_update (real->checksum, buf, len); +#endif +} + +static void +ot_checksum_get_digest_internal (OtRealChecksum *real, + guint8 *buf, + size_t buflen) +{ + g_return_if_fail (real->initialized); + g_assert_cmpint (buflen, ==, _OSTREE_SHA256_DIGEST_LEN); +#if defined(HAVE_OPENSSL) + guint digest_len = buflen; + g_assert (EVP_DigestFinal_ex (real->checksum, digest_buf, &digest_len)); + g_assert_cmpint (digest_len, ==, buflen); +#elif defined(HAVE_GNUTLS) + gnutls_hash_output (real->checksum, buf); +#else + gsize digest_len = buflen; + g_checksum_get_digest (real->checksum, buf, &digest_len); + g_assert_cmpint (digest_len, ==, buflen); +#endif +} + +void +ot_checksum_get_digest (OtChecksum *checksum, + guint8 *buf, + size_t buflen) +{ + OtRealChecksum *real = (OtRealChecksum*)checksum; + ot_checksum_get_digest_internal (real, buf, buflen); + real->initialized = FALSE; +} + +void +ot_checksum_get_hexdigest (OtChecksum *checksum, + char *buf, + size_t buflen) +{ + OtRealChecksum *real = (OtRealChecksum*)checksum; + const guint digest_len = real->digest_len; + guint8 digest_buf[digest_len]; + ot_checksum_get_digest (checksum, digest_buf, digest_len); + ot_bin2hex (buf, (guint8*)digest_buf, digest_len); + real->initialized = FALSE; +} + +void +ot_checksum_clear (OtChecksum *checksum) +{ + OtRealChecksum *real = (OtRealChecksum*)checksum; + if (!real->initialized) + return; +#if defined(HAVE_OPENSSL) + EVP_MD_CTX_destroy (real->checksum); +#elif defined(HAVE_GNUTLS) + gnutls_hash_deinit (real->checksum, NULL); +#else + g_checksum_free (real->checksum); +#endif + real->initialized = FALSE; +} + guchar * ot_csum_from_gchecksum (GChecksum *checksum) { @@ -57,7 +175,7 @@ ot_gio_write_update_checksum (GOutputStream *out, gconstpointer data, gsize len, gsize *out_bytes_written, - GChecksum *checksum, + OtChecksum *checksum, GCancellable *cancellable, GError **error) { @@ -73,14 +191,14 @@ ot_gio_write_update_checksum (GOutputStream *out, } if (checksum) - g_checksum_update (checksum, data, len); + ot_checksum_update (checksum, data, len); return TRUE; } gboolean ot_gio_splice_update_checksum (GOutputStream *out, GInputStream *in, - GChecksum *checksum, + OtChecksum *checksum, GCancellable *cancellable, GError **error) { @@ -92,7 +210,7 @@ ot_gio_splice_update_checksum (GOutputStream *out, char buf[4096]; do { - if (!g_input_stream_read_all (in, buf, sizeof(buf), &bytes_read, cancellable, error)) + if (!g_input_stream_read_all (in, buf, sizeof (buf), &bytes_read, cancellable, error)) return FALSE; if (!ot_gio_write_update_checksum (out, buf, bytes_read, &bytes_written, checksum, cancellable, error)) @@ -119,12 +237,16 @@ ot_gio_splice_get_checksum (GOutputStream *out, GCancellable *cancellable, GError **error) { - g_autoptr(GChecksum) checksum = g_checksum_new (G_CHECKSUM_SHA256); + g_auto(OtChecksum) checksum = { 0, }; + ot_checksum_init (&checksum); - if (!ot_gio_splice_update_checksum (out, in, checksum, cancellable, error)) + if (!ot_gio_splice_update_checksum (out, in, &checksum, cancellable, error)) return FALSE; - g_autofree guchar *ret_csum = ot_csum_from_gchecksum (checksum); + guint8 digest[_OSTREE_SHA256_DIGEST_LEN]; + ot_checksum_get_digest (&checksum, digest, sizeof (digest)); + g_autofree guchar *ret_csum = g_malloc (sizeof (digest)); + memcpy (ret_csum, digest, sizeof (digest)); ot_transfer_out_value (out_csum, &ret_csum); return TRUE; } @@ -151,9 +273,12 @@ ot_checksum_file_at (int dfd, if (!ot_openat_read_stream (dfd, path, TRUE, &in, cancellable, error)) return FALSE; - g_autoptr(GChecksum) checksum = g_checksum_new (checksum_type); - if (!ot_gio_splice_update_checksum (NULL, in, checksum, cancellable, error)) + g_auto(OtChecksum) checksum = { 0, }; + ot_checksum_init (&checksum); + if (!ot_gio_splice_update_checksum (NULL, in, &checksum, cancellable, error)) return FALSE; - return g_strdup (g_checksum_get_string (checksum)); + char hexdigest[_OSTREE_SHA256_STRING_LEN+1]; + ot_checksum_get_hexdigest (&checksum, hexdigest, sizeof (hexdigest)); + return g_strdup (hexdigest); } diff --git a/src/libotutil/ot-checksum-utils.h b/src/libotutil/ot-checksum-utils.h index a0e72dbc..abf3c6db 100644 --- a/src/libotutil/ot-checksum-utils.h +++ b/src/libotutil/ot-checksum-utils.h @@ -21,7 +21,7 @@ #pragma once -#include +#include "libglnx.h" G_BEGIN_DECLS @@ -29,11 +29,42 @@ void ot_bin2hex (char *out_buf, const guint8 *inbuf, gsize len); guchar *ot_csum_from_gchecksum (GChecksum *checksum); +struct OtChecksum { + gboolean initialized; + guint uints[2]; + gpointer data[2]; +}; +typedef struct OtChecksum OtChecksum; + +/* Same as OSTREE_SHA256_DIGEST_LEN, but this header can't depend on that */ +#define _OSTREE_SHA256_DIGEST_LEN (32) +#if defined(OSTREE_SHA256_DIGEST_LEN) && _OSTREE_SHA256_DIGEST_LEN != OSTREE_SHA256_DIGEST_LEN +#error Mismatched OSTREE_SHA256_DIGEST_LEN +#endif +/* See above */ +#define _OSTREE_SHA256_STRING_LEN (64) +#if defined(OSTREE_SHA256_STRING_LEN) && _OSTREE_SHA256_STRING_LEN != OSTREE_SHA256_STRING_LEN +#error Mismatched OSTREE_SHA256_STRING_LEN +#endif + +void ot_checksum_init (OtChecksum *checksum); +void ot_checksum_update (OtChecksum *checksum, + const guint8 *buf, + size_t len); +void ot_checksum_get_digest (OtChecksum *checksum, + guint8 *buf, + size_t buflen); +void ot_checksum_get_hexdigest (OtChecksum *checksum, + char *buf, + size_t buflen); +void ot_checksum_clear (OtChecksum *checksum); +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(OtChecksum, ot_checksum_clear) + gboolean ot_gio_write_update_checksum (GOutputStream *out, gconstpointer data, gsize len, gsize *out_bytes_written, - GChecksum *checksum, + OtChecksum *checksum, GCancellable *cancellable, GError **error); @@ -45,7 +76,7 @@ gboolean ot_gio_splice_get_checksum (GOutputStream *out, gboolean ot_gio_splice_update_checksum (GOutputStream *out, GInputStream *in, - GChecksum *checksum, + OtChecksum *checksum, GCancellable *cancellable, GError **error); From a5b7660c940a200adac1a7d217e4a1cd72719021 Mon Sep 17 00:00:00 2001 From: Dan Nicholson Date: Wed, 11 Oct 2017 14:03:10 +0000 Subject: [PATCH 26/98] lib/deploy: Ignore FIFREEZE/FITHAW errors when already in state If the filesystem is already frozen, FIFREEZE returns EBUSY, and if the filesystem is already thawed, FITHAW returns EINVAL. It's very unlikely these issues would arise on a real ostree system since the sysroot would be locked during the freeze/thaw cycle. However, when multiple fake sysroots are used during the test suite (run as root), the tests could race to run the freeze/thaw cycle without locking. Furthermore, there's no reason why an independent process might be trying to freeze the filesystem while ostree was deploying. Ignore but warn for these errors since there's not much ostree can do about it, anyways. Closes: #1260 Approved by: cgwalters --- src/libostree/ostree-sysroot-deploy.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/libostree/ostree-sysroot-deploy.c b/src/libostree/ostree-sysroot-deploy.c index 920c0eb4..4b2f3707 100644 --- a/src/libostree/ostree-sysroot-deploy.c +++ b/src/libostree/ostree-sysroot-deploy.c @@ -1332,11 +1332,15 @@ fsfreeze_thaw_cycle (OstreeSysroot *self, /* Do a freeze/thaw cycle; TODO add a FIFREEZETHAW ioctl */ if (ioctl (rootfs_dfd, FIFREEZE, 0) != 0) { - /* Not supported, or we're running in the unit tests (as non-root)? + /* Not supported, we're running in the unit tests (as non-root), or + * the filesystem is already frozen (EBUSY). * OK, let's just do a syncfs. */ - if (G_IN_SET (errno, EOPNOTSUPP, EPERM)) + if (G_IN_SET (errno, EOPNOTSUPP, EPERM, EBUSY)) { + /* Warn if the filesystem was already frozen */ + if (errno == EBUSY) + g_debug ("Filesystem already frozen, falling back to syncfs"); if (TEMP_FAILURE_RETRY (syncfs (rootfs_dfd)) != 0) return glnx_throw_errno_prefix (error, "syncfs"); /* Write the completion, and return */ @@ -1349,7 +1353,13 @@ fsfreeze_thaw_cycle (OstreeSysroot *self, } /* And finally thaw, then signal our completion to the watchdog */ if (TEMP_FAILURE_RETRY (ioctl (rootfs_dfd, FITHAW, 0)) != 0) - return glnx_throw_errno_prefix (error, "ioctl(FITHAW)"); + { + /* Warn but don't error if the filesystem was already thawed */ + if (errno == EINVAL) + g_debug ("Filesystem already thawed"); + else + return glnx_throw_errno_prefix (error, "ioctl(FITHAW)"); + } if (write (sock_parent, &c, sizeof (c)) != sizeof (c)) return glnx_throw_errno_prefix (error, "write(watchdog FITHAW complete)"); } From 3604b8152a01cd7316159f2c16c67785523b491a Mon Sep 17 00:00:00 2001 From: Jonathan Lebon Date: Wed, 11 Oct 2017 14:52:56 +0000 Subject: [PATCH 27/98] libotutil/checksum-utils: fix openssl compilation Closes: #1261 Approved by: cgwalters --- src/libotutil/ot-checksum-utils.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/libotutil/ot-checksum-utils.c b/src/libotutil/ot-checksum-utils.c index beba888b..a6a9c0ce 100644 --- a/src/libotutil/ot-checksum-utils.c +++ b/src/libotutil/ot-checksum-utils.c @@ -73,7 +73,7 @@ ot_checksum_init (OtChecksum *checksum) real->checksum = EVP_MD_CTX_create (); g_assert (real->checksum); g_assert (EVP_DigestInit_ex (real->checksum, EVP_sha256 (), NULL)); - real->digest_len = EVP_MAX_MD_SIZE; + real->digest_len = EVP_MD_CTX_size (real->checksum); #elif defined(HAVE_GNUTLS) g_assert (!gnutls_hash_init (&real->checksum, GNUTLS_DIG_SHA256)); real->digest_len = gnutls_hash_get_len (GNUTLS_DIG_SHA256); @@ -81,6 +81,7 @@ ot_checksum_init (OtChecksum *checksum) real->checksum = g_checksum_new (G_CHECKSUM_SHA256); real->digest_len = g_checksum_type_get_length (G_CHECKSUM_SHA256); #endif + g_assert_cmpint (real->digest_len, ==, _OSTREE_SHA256_DIGEST_LEN); real->initialized = TRUE; } @@ -109,7 +110,7 @@ ot_checksum_get_digest_internal (OtRealChecksum *real, g_assert_cmpint (buflen, ==, _OSTREE_SHA256_DIGEST_LEN); #if defined(HAVE_OPENSSL) guint digest_len = buflen; - g_assert (EVP_DigestFinal_ex (real->checksum, digest_buf, &digest_len)); + g_assert (EVP_DigestFinal_ex (real->checksum, buf, &digest_len)); g_assert_cmpint (digest_len, ==, buflen); #elif defined(HAVE_GNUTLS) gnutls_hash_output (real->checksum, buf); From 22869e0b729eb35cbcb7f1ff2c410e026485adcc Mon Sep 17 00:00:00 2001 From: Jonathan Lebon Date: Wed, 11 Oct 2017 14:54:59 +0000 Subject: [PATCH 28/98] ci: compile f26/c7-primary with libcurl/openssl This is how ostree is shipped in those distros. We already have alternative testsuites for testing other HTTP & crypto backends. Closes: #1261 Approved by: cgwalters --- .papr.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.papr.yml b/.papr.yml index 00512eda..5b1acbee 100644 --- a/.papr.yml +++ b/.papr.yml @@ -17,6 +17,7 @@ env: GI_SCANNERFLAGS: '--warn-error' ASAN_OPTIONS: 'detect_leaks=0' # Right now we're not fully clean, but this gets us use-after-free etc # TODO when we're doing leak checks: G_SLICE: "always-malloc" + CONFIGOPTS: '--with-curl --with-openssl' tests: - ci/ci-commitmessage-submodules.sh @@ -41,6 +42,7 @@ host: env: CFLAGS: '' + CONFIGOPTS: '--with-curl --with-openssl' tests: # FIXME revert setting to 7/3/1611 when repos sync From cd8fc8e37a8489f5d15ace8e6dd2ccbb551bc877 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Sat, 7 Oct 2017 09:36:51 -0400 Subject: [PATCH 29/98] lib/core: (refactor) Drop wrapper and unneeded args for variant writing Nothing was using the `bytes_written` data (we always discard partially written tmpfiles), so simplify everything by dropping it. Further, we always passed an offset of `0`, so drop that argument too. (I believe that this was previously used by the "pack files" code that we deleted long ago) Second, we had an unnecessary internal wrapper for this function; drop that too. Closes: #1257 Approved by: jlebon --- src/libostree/ostree-core-private.h | 2 - src/libostree/ostree-core.c | 69 +++---------------- src/libostree/ostree-repo-commit.c | 2 +- .../ostree-repo-static-delta-processing.c | 3 +- 4 files changed, 13 insertions(+), 63 deletions(-) diff --git a/src/libostree/ostree-core-private.h b/src/libostree/ostree-core-private.h index 70b12b68..f964b422 100644 --- a/src/libostree/ostree-core-private.h +++ b/src/libostree/ostree-core-private.h @@ -76,8 +76,6 @@ GVariant *_ostree_zlib_file_header_new (GFileInfo *file_info, gboolean _ostree_write_variant_with_size (GOutputStream *output, GVariant *variant, - guint64 alignment_offset, - gsize *out_bytes_written, OtChecksum *checksum, GCancellable *cancellable, GError **error); diff --git a/src/libostree/ostree-core.c b/src/libostree/ostree-core.c index 2fafe99d..6d7ab0fc 100644 --- a/src/libostree/ostree-core.c +++ b/src/libostree/ostree-core.c @@ -387,7 +387,6 @@ write_padding (GOutputStream *output, * _ostree_write_variant_with_size: * @output: Stream * @variant: A variant - * @alignment_offset: Used to determine whether or not we should write padding bytes * @out_bytes_written: (out): Number of bytes written * @checksum: (allow-none): If provided, update with written data * @cancellable: Cancellable @@ -401,73 +400,29 @@ write_padding (GOutputStream *output, gboolean _ostree_write_variant_with_size (GOutputStream *output, GVariant *variant, - guint64 alignment_offset, - gsize *out_bytes_written, OtChecksum *checksum, GCancellable *cancellable, GError **error) { - guint64 variant_size; - guint32 variant_size_u32_be; - gsize bytes_written; - gsize ret_bytes_written = 0; - /* Write variant size */ - variant_size = g_variant_get_size (variant); + const guint64 variant_size = g_variant_get_size (variant); g_assert (variant_size < G_MAXUINT32); - variant_size_u32_be = GUINT32_TO_BE((guint32) variant_size); + const guint32 variant_size_u32_be = GUINT32_TO_BE((guint32) variant_size); - bytes_written = 0; - if (!ot_gio_write_update_checksum (output, &variant_size_u32_be, 4, - &bytes_written, checksum, - cancellable, error)) + if (!ot_gio_write_update_checksum (output, &variant_size_u32_be, sizeof (variant_size_u32_be), + NULL, checksum, cancellable, error)) return FALSE; - ret_bytes_written += bytes_written; - alignment_offset += bytes_written; + const gsize alignment_offset = sizeof(variant_size_u32_be); - bytes_written = 0; /* Pad to offset of 8, write variant */ - if (!write_padding (output, 8, alignment_offset, &bytes_written, checksum, + if (!write_padding (output, 8, alignment_offset, NULL, checksum, cancellable, error)) return FALSE; - ret_bytes_written += bytes_written; - bytes_written = 0; if (!ot_gio_write_update_checksum (output, g_variant_get_data (variant), - variant_size, &bytes_written, checksum, + variant_size, NULL, checksum, cancellable, error)) return FALSE; - ret_bytes_written += bytes_written; - - if (out_bytes_written) - *out_bytes_written = ret_bytes_written; - return TRUE; -} - -/* - * write_file_header_update_checksum: - * @out: Stream - * @variant: A variant, should be a file header - * @checksum: (allow-none): If provided, update with written data - * @cancellable: Cancellable - * @error: Error - * - * Write a file header variant to the provided @out stream, optionally - * updating @checksum. - */ -static gboolean -write_file_header_update_checksum (GOutputStream *out, - GVariant *header, - OtChecksum *checksum, - GCancellable *cancellable, - GError **error) -{ - gsize bytes_written; - - if (!_ostree_write_variant_with_size (out, header, 0, &bytes_written, checksum, - cancellable, error)) - return FALSE; - return TRUE; } @@ -499,7 +454,7 @@ header_and_input_to_stream (GVariant *file_header, header_out_stream = g_memory_output_stream_new (NULL, 0, g_realloc, g_free); - if (!_ostree_write_variant_with_size (header_out_stream, file_header, 0, NULL, NULL, + if (!_ostree_write_variant_with_size (header_out_stream, file_header, NULL, cancellable, error)) return FALSE; @@ -875,12 +830,10 @@ ostree_checksum_file_from_input (GFileInfo *file_info, } else { - g_autoptr(GVariant) file_header = NULL; + g_autoptr(GVariant) file_header = _ostree_file_header_new (file_info, xattrs); - file_header = _ostree_file_header_new (file_info, xattrs); - - if (!write_file_header_update_checksum (NULL, file_header, &checksum, - cancellable, error)) + if (!_ostree_write_variant_with_size (NULL, file_header, &checksum, + cancellable, error)) return FALSE; if (g_file_info_get_file_type (file_info) == G_FILE_TYPE_REGULAR) diff --git a/src/libostree/ostree-repo-commit.c b/src/libostree/ostree-repo-commit.c index 377adc75..a8d2aa1b 100644 --- a/src/libostree/ostree-repo-commit.c +++ b/src/libostree/ostree-repo-commit.c @@ -648,7 +648,7 @@ write_content_object (OstreeRepo *self, file_meta = _ostree_zlib_file_header_new (file_info, xattrs); - if (!_ostree_write_variant_with_size (temp_out, file_meta, 0, NULL, NULL, + if (!_ostree_write_variant_with_size (temp_out, file_meta, NULL, cancellable, error)) return FALSE; diff --git a/src/libostree/ostree-repo-static-delta-processing.c b/src/libostree/ostree-repo-static-delta-processing.c index fca0f216..092b6ea7 100644 --- a/src/libostree/ostree-repo-static-delta-processing.c +++ b/src/libostree/ostree-repo-static-delta-processing.c @@ -505,8 +505,7 @@ handle_untrusted_content_checksum (OstreeRepo *repo, ot_checksum_init (&state->content_checksum); - gsize bytes_written; - if (!_ostree_write_variant_with_size (NULL, header, 0, &bytes_written, &state->content_checksum, + if (!_ostree_write_variant_with_size (NULL, header, &state->content_checksum, cancellable, error)) return FALSE; From d10593e65d504fd523ddfae5309a51ef189c841e Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Sat, 7 Oct 2017 12:11:05 -0400 Subject: [PATCH 30/98] lib/core: Port a few functions to decl-after-stmt No functional changes, just prep for more work. Closes: #1257 Approved by: jlebon --- src/libostree/ostree-core.c | 79 +++++++++++++++---------------------- 1 file changed, 31 insertions(+), 48 deletions(-) diff --git a/src/libostree/ostree-core.c b/src/libostree/ostree-core.c index 6d7ab0fc..5e8dd874 100644 --- a/src/libostree/ostree-core.c +++ b/src/libostree/ostree-core.c @@ -287,30 +287,24 @@ GVariant * _ostree_file_header_new (GFileInfo *file_info, GVariant *xattrs) { - guint32 uid; - guint32 gid; - guint32 mode; + + guint32 uid = g_file_info_get_attribute_uint32 (file_info, "unix::uid"); + guint32 gid = g_file_info_get_attribute_uint32 (file_info, "unix::gid"); + guint32 mode = g_file_info_get_attribute_uint32 (file_info, "unix::mode"); + const char *symlink_target; - GVariant *ret; - g_autoptr(GVariant) tmp_xattrs = NULL; - - uid = g_file_info_get_attribute_uint32 (file_info, "unix::uid"); - gid = g_file_info_get_attribute_uint32 (file_info, "unix::gid"); - mode = g_file_info_get_attribute_uint32 (file_info, "unix::mode"); - if (g_file_info_get_file_type (file_info) == G_FILE_TYPE_SYMBOLIC_LINK) symlink_target = g_file_info_get_symlink_target (file_info); else symlink_target = ""; + g_autoptr(GVariant) tmp_xattrs = NULL; if (xattrs == NULL) tmp_xattrs = g_variant_ref_sink (g_variant_new_array (G_VARIANT_TYPE ("(ayay)"), NULL, 0)); - ret = g_variant_new ("(uuuus@a(ayay))", GUINT32_TO_BE (uid), - GUINT32_TO_BE (gid), GUINT32_TO_BE (mode), 0, - symlink_target, xattrs ? xattrs : tmp_xattrs); - g_variant_ref_sink (ret); - return ret; + return g_variant_ref_sink (g_variant_new ("(uuuus@a(ayay))", GUINT32_TO_BE (uid), + GUINT32_TO_BE (gid), GUINT32_TO_BE (mode), 0, + symlink_target, xattrs ?: tmp_xattrs)); } /* @@ -324,33 +318,25 @@ GVariant * _ostree_zlib_file_header_new (GFileInfo *file_info, GVariant *xattrs) { - guint64 size; - guint32 uid; - guint32 gid; - guint32 mode; + guint64 size = g_file_info_get_size (file_info); + guint32 uid = g_file_info_get_attribute_uint32 (file_info, "unix::uid"); + guint32 gid = g_file_info_get_attribute_uint32 (file_info, "unix::gid"); + guint32 mode = g_file_info_get_attribute_uint32 (file_info, "unix::mode"); + const char *symlink_target; - GVariant *ret; - g_autoptr(GVariant) tmp_xattrs = NULL; - - size = g_file_info_get_size (file_info); - uid = g_file_info_get_attribute_uint32 (file_info, "unix::uid"); - gid = g_file_info_get_attribute_uint32 (file_info, "unix::gid"); - mode = g_file_info_get_attribute_uint32 (file_info, "unix::mode"); - if (g_file_info_get_file_type (file_info) == G_FILE_TYPE_SYMBOLIC_LINK) symlink_target = g_file_info_get_symlink_target (file_info); else symlink_target = ""; + g_autoptr(GVariant) tmp_xattrs = NULL; if (xattrs == NULL) tmp_xattrs = g_variant_ref_sink (g_variant_new_array (G_VARIANT_TYPE ("(ayay)"), NULL, 0)); - ret = g_variant_new ("(tuuuus@a(ayay))", - GUINT64_TO_BE (size), GUINT32_TO_BE (uid), - GUINT32_TO_BE (gid), GUINT32_TO_BE (mode), 0, - symlink_target, xattrs ? xattrs : tmp_xattrs); - g_variant_ref_sink (ret); - return ret; + return g_variant_ref_sink (g_variant_new ("(tuuuus@a(ayay))", + GUINT64_TO_BE (size), GUINT32_TO_BE (uid), + GUINT32_TO_BE (gid), GUINT32_TO_BE (mode), 0, + symlink_target, xattrs ?: tmp_xattrs)); } static gboolean @@ -445,33 +431,30 @@ header_and_input_to_stream (GVariant *file_header, GCancellable *cancellable, GError **error) { - gpointer header_data; - gsize header_size; - g_autoptr(GInputStream) ret_input = NULL; - g_autoptr(GPtrArray) streams = NULL; - g_autoptr(GOutputStream) header_out_stream = NULL; - g_autoptr(GInputStream) header_in_stream = NULL; - - header_out_stream = g_memory_output_stream_new (NULL, 0, g_realloc, g_free); - + /* Get a memory buffer for the header */ + g_autoptr(GOutputStream) header_out_stream = g_memory_output_stream_new (NULL, 0, g_realloc, g_free); if (!_ostree_write_variant_with_size (header_out_stream, file_header, NULL, cancellable, error)) return FALSE; - if (!g_output_stream_close (header_out_stream, cancellable, error)) return FALSE; - header_size = g_memory_output_stream_get_data_size ((GMemoryOutputStream*) header_out_stream); - header_data = g_memory_output_stream_steal_data ((GMemoryOutputStream*) header_out_stream); - header_in_stream = g_memory_input_stream_new_from_data (header_data, header_size, g_free); + /* Our result stream chain */ + g_autoptr(GPtrArray) streams = g_ptr_array_new_with_free_func ((GDestroyNotify)g_object_unref); - streams = g_ptr_array_new_with_free_func ((GDestroyNotify)g_object_unref); + /* Append the header to the chain */ + const gsize header_size = g_memory_output_stream_get_data_size ((GMemoryOutputStream*) header_out_stream); + gpointer header_data = g_memory_output_stream_steal_data ((GMemoryOutputStream*) header_out_stream); + g_autoptr(GInputStream) header_in_stream = g_memory_input_stream_new_from_data (header_data, header_size, g_free); g_ptr_array_add (streams, g_object_ref (header_in_stream)); + + /* And if we have an input stream, append that */ if (input) g_ptr_array_add (streams, g_object_ref (input)); - ret_input = (GInputStream*)ostree_chain_input_stream_new (streams); + /* Return the result stream */ + g_autoptr(GInputStream) ret_input = (GInputStream*)ostree_chain_input_stream_new (streams); ot_transfer_out_value (out_input, &ret_input); if (out_header_size) *out_header_size = header_size; From bb51a43d8111416bdd8225487ba803c34ad5b69b Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Sun, 8 Oct 2017 15:55:35 -0400 Subject: [PATCH 31/98] lib/core: Use GBytes for file headers This simplifies a lot of code; the header function was structured to write to an input stream, but many callers only wanted the checksum, so it's simpler (and error-free) to simply allocate a whole buffer and checksum that. For the callers that want to write it, it's also still simpler to allocate the buffer and write the whole thing rather than having this function do the writing. A lot of the complexity here again is a legacy of the packfile code, which is dead. This is prep for faster regfile commits where we can avoid `G{In,Out}putStream`. Closes: #1257 Approved by: jlebon --- src/libostree/ostree-core-private.h | 14 +- src/libostree/ostree-core.c | 169 ++++++------------ src/libostree/ostree-repo-commit.c | 13 +- .../ostree-repo-static-delta-processing.c | 7 +- src/libotutil/ot-checksum-utils.h | 8 + 5 files changed, 81 insertions(+), 130 deletions(-) diff --git a/src/libostree/ostree-core-private.h b/src/libostree/ostree-core-private.h index f964b422..d7677f38 100644 --- a/src/libostree/ostree-core-private.h +++ b/src/libostree/ostree-core-private.h @@ -68,17 +68,11 @@ G_BEGIN_DECLS #define _OSTREE_ZLIB_FILE_HEADER_GVARIANT_FORMAT G_VARIANT_TYPE ("(tuuuusa(ayay))") -GVariant *_ostree_file_header_new (GFileInfo *file_info, - GVariant *xattrs); +GBytes *_ostree_file_header_new (GFileInfo *file_info, + GVariant *xattrs); -GVariant *_ostree_zlib_file_header_new (GFileInfo *file_info, - GVariant *xattrs); - -gboolean _ostree_write_variant_with_size (GOutputStream *output, - GVariant *variant, - OtChecksum *checksum, - GCancellable *cancellable, - GError **error); +GBytes *_ostree_zlib_file_header_new (GFileInfo *file_info, + GVariant *xattrs); gboolean _ostree_make_temporary_symlink_at (int tmp_dirfd, diff --git a/src/libostree/ostree-core.c b/src/libostree/ostree-core.c index 5e8dd874..d840433a 100644 --- a/src/libostree/ostree-core.c +++ b/src/libostree/ostree-core.c @@ -39,6 +39,8 @@ G_STATIC_ASSERT(OSTREE_REPO_MODE_ARCHIVE == OSTREE_REPO_MODE_ARCHIVE_Z2); G_STATIC_ASSERT(OSTREE_REPO_MODE_BARE_USER == 2); G_STATIC_ASSERT(OSTREE_REPO_MODE_BARE_USER_ONLY == 3); +static GBytes *variant_to_lenprefixed_buffer (GVariant *variant); + #define ALIGN_VALUE(this, boundary) \ (( ((unsigned long)(this)) + (((unsigned long)(boundary)) -1)) & (~(((unsigned long)(boundary))-1))) @@ -283,7 +285,12 @@ ostree_validate_collection_id (const char *collection_id, GError **error) return TRUE; } -GVariant * +/* The file header is part of the "object stream" format + * that's not compressed. It's comprised of uid,gid,mode, + * and possibly symlink targets from @file_info, as well + * as @xattrs (which if NULL, is taken to be the empty set). + */ +GBytes * _ostree_file_header_new (GFileInfo *file_info, GVariant *xattrs) { @@ -302,19 +309,19 @@ _ostree_file_header_new (GFileInfo *file_info, if (xattrs == NULL) tmp_xattrs = g_variant_ref_sink (g_variant_new_array (G_VARIANT_TYPE ("(ayay)"), NULL, 0)); - return g_variant_ref_sink (g_variant_new ("(uuuus@a(ayay))", GUINT32_TO_BE (uid), - GUINT32_TO_BE (gid), GUINT32_TO_BE (mode), 0, - symlink_target, xattrs ?: tmp_xattrs)); + g_autoptr(GVariant) ret = g_variant_new ("(uuuus@a(ayay))", GUINT32_TO_BE (uid), + GUINT32_TO_BE (gid), GUINT32_TO_BE (mode), 0, + symlink_target, xattrs ?: tmp_xattrs); + return variant_to_lenprefixed_buffer (g_variant_ref_sink (ret)); } -/* - * ostree_zlib_file_header_new: - * @file_info: a #GFileInfo - * @xattrs: (allow-none): Optional extended attribute array - * - * Returns: (transfer full): A new #GVariant containing file header for an archive repository +/* Like _ostree_file_header_new(), but used for the compressed format in archive + * repositories. This format hence lives on disk; normally the uncompressed + * stream format doesn't. Instead for "bare" repositories, the file data is + * stored directly, or for the special case of bare-user repositories, as a + * user.ostreemeta xattr. */ -GVariant * +GBytes * _ostree_zlib_file_header_new (GFileInfo *file_info, GVariant *xattrs) { @@ -333,83 +340,48 @@ _ostree_zlib_file_header_new (GFileInfo *file_info, if (xattrs == NULL) tmp_xattrs = g_variant_ref_sink (g_variant_new_array (G_VARIANT_TYPE ("(ayay)"), NULL, 0)); - return g_variant_ref_sink (g_variant_new ("(tuuuus@a(ayay))", - GUINT64_TO_BE (size), GUINT32_TO_BE (uid), - GUINT32_TO_BE (gid), GUINT32_TO_BE (mode), 0, - symlink_target, xattrs ?: tmp_xattrs)); + g_autoptr(GVariant) ret = g_variant_new ("(tuuuus@a(ayay))", + GUINT64_TO_BE (size), GUINT32_TO_BE (uid), + GUINT32_TO_BE (gid), GUINT32_TO_BE (mode), 0, + symlink_target, xattrs ?: tmp_xattrs); + return variant_to_lenprefixed_buffer (g_variant_ref_sink (ret)); } -static gboolean -write_padding (GOutputStream *output, - guint alignment, - gsize offset, - gsize *out_bytes_written, - OtChecksum *checksum, - GCancellable *cancellable, - GError **error) -{ - guint bits; - guint padding_len; - guchar padding_nuls[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - - if (alignment == 8) - bits = ((offset) & 7); - else - bits = ((offset) & 3); - - if (bits > 0) - { - padding_len = alignment - bits; - if (!ot_gio_write_update_checksum (output, (guchar*)padding_nuls, padding_len, - out_bytes_written, checksum, - cancellable, error)) - return FALSE; - } - - return TRUE; -} - -/* - * _ostree_write_variant_with_size: - * @output: Stream - * @variant: A variant - * @out_bytes_written: (out): Number of bytes written - * @checksum: (allow-none): If provided, update with written data - * @cancellable: Cancellable - * @error: Error - * - * Use this function for serializing a chain of 1 or more variants - * into a stream; the @alignment_offset parameter is used to ensure - * that each variant begins on an 8-byte alignment so it can be safely - * accessed. +/* Serialize a variant to a buffer prefixed with its length. The variant will + * have an 8-byte alignment so it can be safely used with `mmap()`. */ -gboolean -_ostree_write_variant_with_size (GOutputStream *output, - GVariant *variant, - OtChecksum *checksum, - GCancellable *cancellable, - GError **error) +static GBytes * +variant_to_lenprefixed_buffer (GVariant *variant) { + /* This string is really a binary memory buffer */ + g_autoptr(GString) buf = g_string_new (NULL); /* Write variant size */ const guint64 variant_size = g_variant_get_size (variant); g_assert (variant_size < G_MAXUINT32); const guint32 variant_size_u32_be = GUINT32_TO_BE((guint32) variant_size); - if (!ot_gio_write_update_checksum (output, &variant_size_u32_be, sizeof (variant_size_u32_be), - NULL, checksum, cancellable, error)) - return FALSE; - const gsize alignment_offset = sizeof(variant_size_u32_be); + g_string_append_len (buf, (char*)&variant_size_u32_be, sizeof (variant_size_u32_be)); + const gsize alignment_offset = sizeof (variant_size_u32_be); - /* Pad to offset of 8, write variant */ - if (!write_padding (output, 8, alignment_offset, NULL, checksum, - cancellable, error)) - return FALSE; + /* Write NULs for alignment. At the moment this is a constant 4 bytes (i.e. + * align to 8, since the length is 4 bytes). For now, I decided to keep some + * of the (now legacy) more generic logic here in case we want to revive it + * later. + */ + const guint alignment = 8; + const guchar padding_nuls[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + guint bits; + if (alignment == 8) + bits = alignment_offset & 7; /* mod 8 */ + else + bits = alignment_offset & 3; /* mod 4 */ + const guint padding_len = alignment - bits; - if (!ot_gio_write_update_checksum (output, g_variant_get_data (variant), - variant_size, NULL, checksum, - cancellable, error)) - return FALSE; - return TRUE; + if (bits > 0) + g_string_append_len (buf, (char*)padding_nuls, padding_len); + + g_string_append_len (buf, (char*)g_variant_get_data (variant), g_variant_get_size (variant)); + return g_string_free_to_bytes (g_steal_pointer (&buf)); } /* @@ -417,35 +389,23 @@ _ostree_write_variant_with_size (GOutputStream *output, * @file_header: A file header * @input: File raw content stream * @out_input: (out): Serialized object stream - * @out_header_size: (out): Length of the header * @cancellable: Cancellable * @error: Error * * Combines @file_header and @input into a single stream. */ static gboolean -header_and_input_to_stream (GVariant *file_header, +header_and_input_to_stream (GBytes *file_header, GInputStream *input, GInputStream **out_input, - guint64 *out_header_size, GCancellable *cancellable, GError **error) { - /* Get a memory buffer for the header */ - g_autoptr(GOutputStream) header_out_stream = g_memory_output_stream_new (NULL, 0, g_realloc, g_free); - if (!_ostree_write_variant_with_size (header_out_stream, file_header, NULL, - cancellable, error)) - return FALSE; - if (!g_output_stream_close (header_out_stream, cancellable, error)) - return FALSE; - /* Our result stream chain */ g_autoptr(GPtrArray) streams = g_ptr_array_new_with_free_func ((GDestroyNotify)g_object_unref); /* Append the header to the chain */ - const gsize header_size = g_memory_output_stream_get_data_size ((GMemoryOutputStream*) header_out_stream); - gpointer header_data = g_memory_output_stream_steal_data ((GMemoryOutputStream*) header_out_stream); - g_autoptr(GInputStream) header_in_stream = g_memory_input_stream_new_from_data (header_data, header_size, g_free); + g_autoptr(GInputStream) header_in_stream = g_memory_input_stream_new_from_bytes (file_header); g_ptr_array_add (streams, g_object_ref (header_in_stream)); @@ -456,12 +416,11 @@ header_and_input_to_stream (GVariant *file_header, /* Return the result stream */ g_autoptr(GInputStream) ret_input = (GInputStream*)ostree_chain_input_stream_new (streams); ot_transfer_out_value (out_input, &ret_input); - if (out_header_size) - *out_header_size = header_size; return TRUE; } +/* Convert file metadata + file content into an archive-format stream. */ gboolean _ostree_raw_file_to_archive_stream (GInputStream *input, GFileInfo *file_info, @@ -471,21 +430,17 @@ _ostree_raw_file_to_archive_stream (GInputStream *input, GCancellable *cancellable, GError **error) { - g_autoptr(GVariant) file_header = NULL; g_autoptr(GInputStream) zlib_input = NULL; - - file_header = _ostree_zlib_file_header_new (file_info, xattrs); if (input != NULL) { - g_autoptr(GConverter) zlib_compressor = NULL; - - zlib_compressor = G_CONVERTER (g_zlib_compressor_new (G_ZLIB_COMPRESSOR_FORMAT_RAW, compression_level)); + g_autoptr(GConverter) zlib_compressor = + G_CONVERTER (g_zlib_compressor_new (G_ZLIB_COMPRESSOR_FORMAT_RAW, compression_level)); zlib_input = g_converter_input_stream_new (input, zlib_compressor); } + g_autoptr(GBytes) file_header = _ostree_zlib_file_header_new (file_info, xattrs); return header_and_input_to_stream (file_header, zlib_input, out_input, - NULL, cancellable, error); } @@ -578,19 +533,15 @@ ostree_raw_file_to_content_stream (GInputStream *input, GCancellable *cancellable, GError **error) { - g_autoptr(GVariant) file_header = NULL; - guint64 header_size; - - file_header = _ostree_file_header_new (file_info, xattrs); + g_autoptr(GBytes) file_header = _ostree_file_header_new (file_info, xattrs); if (!header_and_input_to_stream (file_header, input, out_input, - &header_size, cancellable, error)) return FALSE; if (out_length) - *out_length = header_size + g_file_info_get_size (file_info); + *out_length = g_bytes_get_size (file_header) + g_file_info_get_size (file_info); return TRUE; } @@ -813,11 +764,9 @@ ostree_checksum_file_from_input (GFileInfo *file_info, } else { - g_autoptr(GVariant) file_header = _ostree_file_header_new (file_info, xattrs); + g_autoptr(GBytes) file_header = _ostree_file_header_new (file_info, xattrs); - if (!_ostree_write_variant_with_size (NULL, file_header, &checksum, - cancellable, error)) - return FALSE; + ot_checksum_update_bytes (&checksum, file_header); if (g_file_info_get_file_type (file_info) == G_FILE_TYPE_REGULAR) { diff --git a/src/libostree/ostree-repo-commit.c b/src/libostree/ostree-repo-commit.c index a8d2aa1b..ad9bc5af 100644 --- a/src/libostree/ostree-repo-commit.c +++ b/src/libostree/ostree-repo-commit.c @@ -631,7 +631,6 @@ write_content_object (OstreeRepo *self, } else { - g_autoptr(GVariant) file_meta = NULL; g_autoptr(GConverter) zlib_compressor = NULL; g_autoptr(GOutputStream) compressed_out_stream = NULL; g_autoptr(GOutputStream) temp_out = NULL; @@ -646,11 +645,15 @@ write_content_object (OstreeRepo *self, return FALSE; temp_out = g_unix_output_stream_new (tmpf.fd, FALSE); - file_meta = _ostree_zlib_file_header_new (file_info, xattrs); + g_autoptr(GBytes) file_meta_header = _ostree_zlib_file_header_new (file_info, xattrs); + gsize file_meta_len; + const guint8* file_meta_buf = g_bytes_get_data (file_meta_header, &file_meta_len); - if (!_ostree_write_variant_with_size (temp_out, file_meta, NULL, - cancellable, error)) - return FALSE; + { gsize bytes_written; + if (!g_output_stream_write_all (temp_out, file_meta_buf, file_meta_len, &bytes_written, + cancellable, error)) + return FALSE; + } if (g_file_info_get_file_type (file_info) == G_FILE_TYPE_REGULAR) { diff --git a/src/libostree/ostree-repo-static-delta-processing.c b/src/libostree/ostree-repo-static-delta-processing.c index 092b6ea7..bf32e02e 100644 --- a/src/libostree/ostree-repo-static-delta-processing.c +++ b/src/libostree/ostree-repo-static-delta-processing.c @@ -501,13 +501,10 @@ handle_untrusted_content_checksum (OstreeRepo *repo, GError **error) { g_autoptr(GFileInfo) finfo = _ostree_mode_uidgid_to_gfileinfo (state->mode, state->uid, state->gid); - g_autoptr(GVariant) header = _ostree_file_header_new (finfo, state->xattrs); + g_autoptr(GBytes) header = _ostree_file_header_new (finfo, state->xattrs); ot_checksum_init (&state->content_checksum); - - if (!_ostree_write_variant_with_size (NULL, header, &state->content_checksum, - cancellable, error)) - return FALSE; + ot_checksum_update_bytes (&state->content_checksum, header); return TRUE; } diff --git a/src/libotutil/ot-checksum-utils.h b/src/libotutil/ot-checksum-utils.h index abf3c6db..2d1aa612 100644 --- a/src/libotutil/ot-checksum-utils.h +++ b/src/libotutil/ot-checksum-utils.h @@ -51,6 +51,14 @@ void ot_checksum_init (OtChecksum *checksum); void ot_checksum_update (OtChecksum *checksum, const guint8 *buf, size_t len); +static inline void +ot_checksum_update_bytes (OtChecksum *checksum, + GBytes *buf) +{ + gsize len; + const guint8 *bufdata = g_bytes_get_data (buf, &len); + ot_checksum_update (checksum, bufdata, len); +} void ot_checksum_get_digest (OtChecksum *checksum, guint8 *buf, size_t buflen); From 3e3d28632d9a3c9cd974531487bdc830c326b184 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Mon, 9 Oct 2017 10:05:20 -0400 Subject: [PATCH 32/98] lib/commit: Make -path commit helper API private It's no longer called directly by the pull code, so make it static. The goal here is to have the pull and local-fs commit paths use higher level more efficient APIs, and eventually make those APIs public. Closes: #1257 Approved by: jlebon --- src/libostree/ostree-repo-commit.c | 19 +++++++++---------- src/libostree/ostree-repo-private.h | 8 -------- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/src/libostree/ostree-repo-commit.c b/src/libostree/ostree-repo-commit.c index ad9bc5af..d045fd3f 100644 --- a/src/libostree/ostree-repo-commit.c +++ b/src/libostree/ostree-repo-commit.c @@ -164,13 +164,13 @@ _ostree_repo_commit_tmpf_final (OstreeRepo *self, /* Given a dfd+path combination (may be regular file or symlink), * rename it into place. */ -gboolean -_ostree_repo_commit_path_final (OstreeRepo *self, - const char *checksum, - OstreeObjectType objtype, - OtCleanupUnlinkat *tmp_path, - GCancellable *cancellable, - GError **error) +static gboolean +commit_path_final (OstreeRepo *self, + const char *checksum, + OstreeObjectType objtype, + OtCleanupUnlinkat *tmp_path, + GCancellable *cancellable, + GError **error) { /* The final renameat() */ char tmpbuf[_OSTREE_LOOSE_PATH_MAX]; @@ -746,9 +746,8 @@ write_content_object (OstreeRepo *self, g_assert_not_reached (); } - if (!_ostree_repo_commit_path_final (self, actual_checksum, OSTREE_OBJECT_TYPE_FILE, - &tmp_unlinker, - cancellable, error)) + if (!commit_path_final (self, actual_checksum, OSTREE_OBJECT_TYPE_FILE, + &tmp_unlinker, cancellable, error)) return FALSE; } else diff --git a/src/libostree/ostree-repo-private.h b/src/libostree/ostree-repo-private.h index 7d50a5b7..bbbb700e 100644 --- a/src/libostree/ostree-repo-private.h +++ b/src/libostree/ostree-repo-private.h @@ -365,14 +365,6 @@ _ostree_repo_commit_tmpf_final (OstreeRepo *self, GCancellable *cancellable, GError **error); -gboolean -_ostree_repo_commit_path_final (OstreeRepo *self, - const char *checksum, - OstreeObjectType objtype, - OtCleanupUnlinkat *tmp_path, - GCancellable *cancellable, - GError **error); - gboolean _ostree_repo_open_content_bare (OstreeRepo *self, const char *checksum, From 1825f03fe77cdc028aa19c6b2f20086381fd2604 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Wed, 11 Oct 2017 09:41:31 -0400 Subject: [PATCH 33/98] tree-wide: Update to new libglnx fd APIs This ends up a lot better IMO. This commit is *mostly* just `s/glnx_close_fd/glnx_autofd`, but there's also a number of hunks like: ``` - if (self->sysroot_fd != -1) - { - (void) close (self->sysroot_fd); - self->sysroot_fd = -1; - } + glnx_close_fd (&self->sysroot_fd); ``` Update submodule: libglnx Closes: #1259 Approved by: jlebon --- libglnx | 2 +- src/libostree/ostree-bootloader-grub2.c | 2 +- src/libostree/ostree-bootloader-uboot.c | 2 +- src/libostree/ostree-core.c | 2 +- src/libostree/ostree-gpg-verifier.c | 4 +- src/libostree/ostree-impl-system-generator.c | 2 +- src/libostree/ostree-repo-checkout.c | 4 +- src/libostree/ostree-repo-commit.c | 8 +-- src/libostree/ostree-repo-finder-mount.c | 4 +- src/libostree/ostree-repo-pull.c | 6 +- src/libostree/ostree-repo-refs.c | 24 ++++---- .../ostree-repo-static-delta-compilation.c | 4 +- src/libostree/ostree-repo-static-delta-core.c | 10 ++-- .../ostree-repo-static-delta-processing.c | 13 +--- src/libostree/ostree-repo.c | 57 ++++++++---------- src/libostree/ostree-sepolicy.c | 2 +- src/libostree/ostree-sysroot-cleanup.c | 2 +- src/libostree/ostree-sysroot-deploy.c | 59 +++++++++---------- src/libostree/ostree-sysroot.c | 12 ++-- src/libotutil/ot-fs-utils.c | 4 +- src/ostree/ostree-trivial-httpd.c | 2 +- src/ostree/ot-admin-builtin-init-fs.c | 2 +- src/ostree/ot-builtin-commit.c | 2 +- src/ostree/ot-builtin-create-usb.c | 2 +- src/ostree/ot-builtin-show.c | 2 +- src/ostree/ot-builtin-summary.c | 2 +- src/ostree/ot-remote-cookie-util.c | 4 +- src/rofiles-fuse/main.c | 2 +- tests/test-repo-finder-mount.c | 12 ++-- 29 files changed, 116 insertions(+), 137 deletions(-) diff --git a/libglnx b/libglnx index e3015443..5362f6bc 160000 --- a/libglnx +++ b/libglnx @@ -1 +1 @@ -Subproject commit e30154431d7eea6397e5502b175ba3b50330140f +Subproject commit 5362f6bc3ff3e30f379e767b203d15c9e56d6f08 diff --git a/src/libostree/ostree-bootloader-grub2.c b/src/libostree/ostree-bootloader-grub2.c index 1366dc95..f0d34809 100644 --- a/src/libostree/ostree-bootloader-grub2.c +++ b/src/libostree/ostree-bootloader-grub2.c @@ -416,7 +416,7 @@ _ostree_bootloader_grub2_write_config (OstreeBootloader *bootloader, } /* Now let's fdatasync() for the new file */ - { glnx_fd_close int new_config_fd = -1; + { glnx_autofd int new_config_fd = -1; if (!glnx_openat_rdonly (AT_FDCWD, gs_file_get_path_cached (new_config_path), TRUE, &new_config_fd, error)) return FALSE; diff --git a/src/libostree/ostree-bootloader-uboot.c b/src/libostree/ostree-bootloader-uboot.c index 81791e1c..2dbaead8 100644 --- a/src/libostree/ostree-bootloader-uboot.c +++ b/src/libostree/ostree-bootloader-uboot.c @@ -73,7 +73,7 @@ append_system_uenv (OstreeBootloaderUboot *self, GCancellable *cancellable, GError **error) { - glnx_fd_close int uenv_fd = -1; + glnx_autofd int uenv_fd = -1; __attribute__((cleanup(_ostree_kernel_args_cleanup))) OstreeKernelArgs *kargs = NULL; const char *uenv_path = NULL; const char *ostree_arg = NULL; diff --git a/src/libostree/ostree-core.c b/src/libostree/ostree-core.c index d840433a..733901f7 100644 --- a/src/libostree/ostree-core.c +++ b/src/libostree/ostree-core.c @@ -670,7 +670,7 @@ ostree_content_file_parse_at (gboolean compressed, GCancellable *cancellable, GError **error) { - glnx_fd_close int fd = -1; + glnx_autofd int fd = -1; if (!glnx_openat_rdonly (parent_dfd, path, TRUE, &fd, error)) return FALSE; diff --git a/src/libostree/ostree-gpg-verifier.c b/src/libostree/ostree-gpg-verifier.c index 17655c1a..4bbf7f2d 100644 --- a/src/libostree/ostree-gpg-verifier.c +++ b/src/libostree/ostree-gpg-verifier.c @@ -177,7 +177,7 @@ _ostree_gpg_verifier_check_signature (OstreeGpgVerifier *self, for (guint i = 0; i < self->key_ascii_files->len; i++) { const char *path = self->key_ascii_files->pdata[i]; - glnx_fd_close int fd = -1; + glnx_autofd int fd = -1; g_auto(gpgme_data_t) kdata = NULL; if (!glnx_openat_rdonly (AT_FDCWD, path, TRUE, &fd, error)) @@ -355,7 +355,7 @@ _ostree_gpg_verifier_add_keyring_dir_at (OstreeGpgVerifier *self, if (g_str_equal (name, "secring.gpg")) continue; - glnx_fd_close int fd = -1; + glnx_autofd int fd = -1; if (!glnx_openat_rdonly (dfd_iter.fd, dent->d_name, TRUE, &fd, error)) return FALSE; diff --git a/src/libostree/ostree-impl-system-generator.c b/src/libostree/ostree-impl-system-generator.c index cc05562b..413e4f60 100644 --- a/src/libostree/ostree-impl-system-generator.c +++ b/src/libostree/ostree-impl-system-generator.c @@ -164,7 +164,7 @@ _ostree_impl_system_generator (const char *ostree_cmdline, /* Prepare to write to the output unit dir; we use the "normal" dir * that overrides /usr, but not /etc. */ - glnx_fd_close int normal_dir_dfd = -1; + glnx_autofd int normal_dir_dfd = -1; if (!glnx_opendirat (AT_FDCWD, normal_dir, TRUE, &normal_dir_dfd, error)) return FALSE; diff --git a/src/libostree/ostree-repo-checkout.c b/src/libostree/ostree-repo-checkout.c index a3dd6887..99896142 100644 --- a/src/libostree/ostree-repo-checkout.c +++ b/src/libostree/ostree-repo-checkout.c @@ -782,7 +782,7 @@ checkout_tree_at_recurse (OstreeRepo *self, } } - glnx_fd_close int destination_dfd = -1; + glnx_autofd int destination_dfd = -1; if (!glnx_opendirat (destination_parent_fd, destination_name, TRUE, &destination_dfd, error)) return FALSE; @@ -947,7 +947,7 @@ checkout_tree_at (OstreeRepo *self, * exists. */ int destination_dfd = destination_parent_fd; - glnx_fd_close int destination_dfd_owned = -1; + glnx_autofd int destination_dfd_owned = -1; if (strcmp (destination_name, ".") != 0) { if (mkdirat (destination_parent_fd, destination_name, 0700) < 0 diff --git a/src/libostree/ostree-repo-commit.c b/src/libostree/ostree-repo-commit.c index d045fd3f..71aa120f 100644 --- a/src/libostree/ostree-repo-commit.c +++ b/src/libostree/ostree-repo-commit.c @@ -1229,7 +1229,7 @@ rename_pending_loose_objects (OstreeRepo *self, /* Ensure that in the case of a power cut all the directory metadata that we want has reached the disk. In particular, we want this before we update the refs to point to these objects. */ - glnx_fd_close int target_dir_fd = -1; + glnx_autofd int target_dir_fd = -1; loose_objpath[2] = 0; @@ -2221,7 +2221,7 @@ ostree_repo_read_commit_detached_metadata (OstreeRepo *self, if (self->commit_stagedir.initialized) { - glnx_fd_close int fd = -1; + glnx_autofd int fd = -1; if (!ot_openat_ignore_enoent (self->commit_stagedir.fd, buf, &fd, error)) return FALSE; if (fd != -1) @@ -2229,7 +2229,7 @@ ostree_repo_read_commit_detached_metadata (OstreeRepo *self, out_metadata, error); } - glnx_fd_close int fd = -1; + glnx_autofd int fd = -1; if (!ot_openat_ignore_enoent (self->objects_dir_fd, buf, &fd, error)) return FALSE; if (fd != -1) @@ -3404,7 +3404,7 @@ import_one_object_direct (OstreeRepo *dest_repo, * that basically just optionally does chown(). Perhaps * in the future we should add flags for those things? */ - glnx_fd_close int src_fd = -1; + glnx_autofd int src_fd = -1; if (!glnx_openat_rdonly (src_repo->objects_dir_fd, loose_path_buf, FALSE, &src_fd, error)) return FALSE; diff --git a/src/libostree/ostree-repo-finder-mount.c b/src/libostree/ostree-repo-finder-mount.c index c385e70c..b41c2c8c 100644 --- a/src/libostree/ostree-repo-finder-mount.c +++ b/src/libostree/ostree-repo-finder-mount.c @@ -328,9 +328,9 @@ ostree_repo_finder_mount_resolve_async (OstreeRepoFinder *finde g_autofree gchar *mount_name = NULL; g_autoptr(GFile) mount_root = NULL; g_autofree gchar *mount_root_path = NULL; - glnx_fd_close int mount_root_dfd = -1; + glnx_autofd int mount_root_dfd = -1; struct stat mount_root_stbuf; - glnx_fd_close int repos_dfd = -1; + glnx_autofd int repos_dfd = -1; gsize i; g_autoptr(GHashTable) repo_to_refs = NULL; /* (element-type UriAndKeyring GHashTable) */ GHashTable *supported_ref_to_checksum; /* (element-type OstreeCollectionRef utf8) */ diff --git a/src/libostree/ostree-repo-pull.c b/src/libostree/ostree-repo-pull.c index 9a8c0ebf..ab69519c 100644 --- a/src/libostree/ostree-repo-pull.c +++ b/src/libostree/ostree-repo-pull.c @@ -547,7 +547,7 @@ write_commitpartial_for (OtPullData *pull_data, GError **error) { g_autofree char *commitpartial_path = _ostree_get_commitpartial_path (checksum); - glnx_fd_close int fd = openat (pull_data->repo->repo_dir_fd, commitpartial_path, O_EXCL | O_CREAT | O_WRONLY | O_CLOEXEC | O_NOCTTY, 0644); + glnx_autofd int fd = openat (pull_data->repo->repo_dir_fd, commitpartial_path, O_EXCL | O_CREAT | O_WRONLY | O_CLOEXEC | O_NOCTTY, 0644); if (fd == -1) { if (errno != EEXIST) @@ -2495,7 +2495,7 @@ _ostree_repo_load_cache_summary_if_same_sig (OstreeRepo *self, return TRUE; const char *summary_cache_sig_file = glnx_strjoina (_OSTREE_SUMMARY_CACHE_DIR, "/", remote, ".sig"); - glnx_fd_close int prev_fd = -1; + glnx_autofd int prev_fd = -1; if (!ot_openat_ignore_enoent (self->cache_dir_fd, summary_cache_sig_file, &prev_fd, error)) return FALSE; if (prev_fd < 0) @@ -2508,7 +2508,7 @@ _ostree_repo_load_cache_summary_if_same_sig (OstreeRepo *self, if (g_bytes_compare (old_sig_contents, summary_sig) == 0) { const char *summary_cache_file = glnx_strjoina (_OSTREE_SUMMARY_CACHE_DIR, "/", remote); - glnx_fd_close int summary_fd = -1; + glnx_autofd int summary_fd = -1; GBytes *summary_data; diff --git a/src/libostree/ostree-repo-refs.c b/src/libostree/ostree-repo-refs.c index 86bdf999..b6bfb0ec 100644 --- a/src/libostree/ostree-repo-refs.c +++ b/src/libostree/ostree-repo-refs.c @@ -150,7 +150,7 @@ find_ref_in_remotes (OstreeRepo *self, GError **error) { g_auto(GLnxDirFdIterator) dfd_iter = { 0, }; - glnx_fd_close int ret_fd = -1; + glnx_autofd int ret_fd = -1; if (!glnx_dirfd_iterator_init_at (self->repo_dir_fd, "refs/remotes", TRUE, &dfd_iter, error)) return FALSE; @@ -158,7 +158,7 @@ find_ref_in_remotes (OstreeRepo *self, while (TRUE) { struct dirent *dent = NULL; - glnx_fd_close int remote_dfd = -1; + glnx_autofd int remote_dfd = -1; if (!glnx_dirfd_iterator_next_dent_ensure_dtype (&dfd_iter, &dent, NULL, error)) return FALSE; @@ -234,7 +234,7 @@ resolve_refspec (OstreeRepo *self, { __attribute__((unused)) GCancellable *cancellable = NULL; g_autofree char *ret_rev = NULL; - glnx_fd_close int target_fd = -1; + glnx_autofd int target_fd = -1; g_return_val_if_fail (ref != NULL, FALSE); @@ -637,7 +637,7 @@ _ostree_repo_list_refs_internal (OstreeRepo *self, { if (S_ISDIR (stbuf.st_mode)) { - glnx_fd_close int base_fd = -1; + glnx_autofd int base_fd = -1; g_autoptr(GString) base_path = g_string_new (""); if (!cut_prefix) g_string_printf (base_path, "%s/", ref_prefix); @@ -652,7 +652,7 @@ _ostree_repo_list_refs_internal (OstreeRepo *self, } else { - glnx_fd_close int prefix_dfd = -1; + glnx_autofd int prefix_dfd = -1; if (!glnx_opendirat (self->repo_dir_fd, prefix_path, TRUE, &prefix_dfd, error)) return FALSE; @@ -667,7 +667,7 @@ _ostree_repo_list_refs_internal (OstreeRepo *self, { g_auto(GLnxDirFdIterator) dfd_iter = { 0, }; g_autoptr(GString) base_path = g_string_new (""); - glnx_fd_close int refs_heads_dfd = -1; + glnx_autofd int refs_heads_dfd = -1; if (!glnx_opendirat (self->repo_dir_fd, "refs/heads", TRUE, &refs_heads_dfd, error)) return FALSE; @@ -687,7 +687,7 @@ _ostree_repo_list_refs_internal (OstreeRepo *self, while (TRUE) { struct dirent *dent; - glnx_fd_close int remote_dfd = -1; + glnx_autofd int remote_dfd = -1; if (!glnx_dirfd_iterator_next_dent_ensure_dtype (&dfd_iter, &dent, cancellable, error)) return FALSE; @@ -992,7 +992,7 @@ _ostree_repo_write_ref (OstreeRepo *self, GCancellable *cancellable, GError **error) { - glnx_fd_close int dfd = -1; + glnx_autofd int dfd = -1; g_return_val_if_fail (remote == NULL || ref->collection_id == NULL, FALSE); g_return_val_if_fail (!(rev != NULL && alias != NULL), FALSE); @@ -1016,7 +1016,7 @@ _ostree_repo_write_ref (OstreeRepo *self, } else if (remote == NULL && ref->collection_id != NULL) { - glnx_fd_close int refs_mirrors_dfd = -1; + glnx_autofd int refs_mirrors_dfd = -1; /* refs/mirrors might not exist in older repositories, so create it. */ if (!glnx_shutil_mkdir_p_at_open (self->repo_dir_fd, "refs/mirrors", 0777, @@ -1039,7 +1039,7 @@ _ostree_repo_write_ref (OstreeRepo *self, } else { - glnx_fd_close int refs_remotes_dfd = -1; + glnx_autofd int refs_remotes_dfd = -1; if (!glnx_opendirat (self->repo_dir_fd, "refs/remotes", TRUE, &refs_remotes_dfd, error)) @@ -1212,7 +1212,7 @@ ostree_repo_list_collection_refs (OstreeRepo *self, if (main_collection_id != NULL && (match_collection_id == NULL || g_strcmp0 (match_collection_id, main_collection_id) == 0)) { - glnx_fd_close int refs_heads_dfd = -1; + glnx_autofd int refs_heads_dfd = -1; if (!glnx_opendirat (self->repo_dir_fd, "refs/heads", TRUE, &refs_heads_dfd, error)) return FALSE; @@ -1237,7 +1237,7 @@ ostree_repo_list_collection_refs (OstreeRepo *self, while (refs_dir_exists) { struct dirent *dent; - glnx_fd_close int subdir_fd = -1; + glnx_autofd int subdir_fd = -1; const gchar *current_collection_id; g_autofree gchar *remote_collection_id = NULL; diff --git a/src/libostree/ostree-repo-static-delta-compilation.c b/src/libostree/ostree-repo-static-delta-compilation.c index a3b28470..67bfc96e 100644 --- a/src/libostree/ostree-repo-static-delta-compilation.c +++ b/src/libostree/ostree-repo-static-delta-compilation.c @@ -1209,12 +1209,12 @@ ostree_repo_static_delta_generate (OstreeRepo *self, g_autoptr(GVariant) to_commit = NULL; const char *opt_filename; g_autofree char *descriptor_name = NULL; - glnx_fd_close int descriptor_dfd = -1; + glnx_autofd int descriptor_dfd = -1; g_autoptr(GVariant) fallback_headers = NULL; g_autoptr(GVariant) detached = NULL; gboolean inline_parts; guint endianness = G_BYTE_ORDER; - glnx_fd_close int tmp_dfd = -1; + glnx_autofd int tmp_dfd = -1; builder.parts = g_ptr_array_new_with_free_func ((GDestroyNotify)ostree_static_delta_part_builder_unref); builder.fallback_objects = g_ptr_array_new_with_free_func ((GDestroyNotify)g_variant_unref); diff --git a/src/libostree/ostree-repo-static-delta-core.c b/src/libostree/ostree-repo-static-delta-core.c index e5133a2b..b2595366 100644 --- a/src/libostree/ostree-repo-static-delta-core.c +++ b/src/libostree/ostree-repo-static-delta-core.c @@ -224,7 +224,7 @@ ostree_repo_static_delta_execute_offline (OstreeRepo *self, const char *dir_or_file_path = gs_file_get_path_cached (dir_or_file); /* First, try opening it as a directory */ - glnx_fd_close int dfd = glnx_opendirat_with_errno (AT_FDCWD, dir_or_file_path, TRUE); + glnx_autofd int dfd = glnx_opendirat_with_errno (AT_FDCWD, dir_or_file_path, TRUE); if (dfd < 0) { if (errno != ENOTDIR) @@ -241,7 +241,7 @@ ostree_repo_static_delta_execute_offline (OstreeRepo *self, else basename = g_strdup ("superblock"); - glnx_fd_close int meta_fd = openat (dfd, basename, O_RDONLY | O_CLOEXEC); + glnx_autofd int meta_fd = openat (dfd, basename, O_RDONLY | O_CLOEXEC); if (meta_fd < 0) return glnx_throw_errno_prefix (error, "openat(%s)", basename); @@ -377,7 +377,7 @@ ostree_repo_static_delta_execute_offline (OstreeRepo *self, else { g_autofree char *relpath = g_strdup_printf ("%u", i); /* TODO avoid malloc here */ - glnx_fd_close int part_fd = openat (dfd, relpath, O_RDONLY | O_CLOEXEC); + glnx_autofd int part_fd = openat (dfd, relpath, O_RDONLY | O_CLOEXEC); if (part_fd < 0) return glnx_throw_errno_prefix (error, "Opening deltapart '%s'", relpath); @@ -525,7 +525,7 @@ show_one_part (OstreeRepo *self, g_print ("PartMeta%u: nobjects=%u size=%" G_GUINT64_FORMAT " usize=%" G_GUINT64_FORMAT "\n", i, (guint)(g_variant_get_size (objects) / OSTREE_STATIC_DELTA_OBJTYPE_CSUM_LEN), size, usize); - glnx_fd_close gint part_fd = openat (self->repo_dir_fd, part_path, O_RDONLY | O_CLOEXEC); + glnx_autofd int part_fd = openat (self->repo_dir_fd, part_path, O_RDONLY | O_CLOEXEC); if (part_fd < 0) return glnx_throw_errno_prefix (error, "openat(%s)", part_path); g_autoptr(GInputStream) part_in = g_unix_input_stream_new (part_fd, FALSE); @@ -767,7 +767,7 @@ _ostree_repo_static_delta_dump (OstreeRepo *self, superblock_path = _ostree_get_relative_static_delta_superblock_path (from, to); - glnx_fd_close int superblock_fd = -1; + glnx_autofd int superblock_fd = -1; if (!glnx_openat_rdonly (self->repo_dir_fd, superblock_path, TRUE, &superblock_fd, error)) return FALSE; if (!ot_variant_read_fd (superblock_fd, 0, diff --git a/src/libostree/ostree-repo-static-delta-processing.c b/src/libostree/ostree-repo-static-delta-processing.c index bf32e02e..6d00e79f 100644 --- a/src/libostree/ostree-repo-static-delta-processing.c +++ b/src/libostree/ostree-repo-static-delta-processing.c @@ -762,11 +762,7 @@ dispatch_set_read_source (OstreeRepo *repo, GLNX_AUTO_PREFIX_ERROR("opcode set-read-source", error); guint64 source_offset; - if (state->read_source_fd != -1) - { - (void) close (state->read_source_fd); - state->read_source_fd = -1; - } + glnx_close_fd (&state->read_source_fd); if (!read_varuint64 (state, &source_offset, error)) return FALSE; @@ -799,12 +795,7 @@ dispatch_unset_read_source (OstreeRepo *repo, if (state->stats_only) return TRUE; /* Early return */ - if (state->read_source_fd != -1) - { - (void) close (state->read_source_fd); - state->read_source_fd = -1; - } - + glnx_close_fd (&state->read_source_fd); g_clear_pointer (&state->read_source_object, g_free); return TRUE; diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c index 59497353..23f158d9 100644 --- a/src/libostree/ostree-repo.c +++ b/src/libostree/ostree-repo.c @@ -488,18 +488,13 @@ ostree_repo_finalize (GObject *object) g_free (self->stagedir_prefix); g_clear_object (&self->repodir_fdrel); g_clear_object (&self->repodir); - if (self->repo_dir_fd != -1) - (void) close (self->repo_dir_fd); + glnx_close_fd (&self->repo_dir_fd); glnx_tmpdir_unset (&self->commit_stagedir); glnx_release_lock_file (&self->commit_stagedir_lock); - if (self->tmp_dir_fd != -1) - (void) close (self->tmp_dir_fd); - if (self->cache_dir_fd != -1) - (void) close (self->cache_dir_fd); - if (self->objects_dir_fd != -1) - (void) close (self->objects_dir_fd); - if (self->uncompressed_objects_dir_fd != -1) - (void) close (self->uncompressed_objects_dir_fd); + glnx_close_fd (&self->tmp_dir_fd); + glnx_close_fd (&self->cache_dir_fd); + glnx_close_fd (&self->objects_dir_fd); + glnx_close_fd (&self->uncompressed_objects_dir_fd); g_clear_object (&self->sysroot_dir); g_weak_ref_clear (&self->sysroot); g_free (self->remotes_config_dir); @@ -734,7 +729,7 @@ ostree_repo_open_at (int dfd, GCancellable *cancellable, GError **error) { - glnx_fd_close int repo_dfd = -1; + glnx_autofd int repo_dfd = -1; if (!glnx_opendirat (dfd, path, TRUE, &repo_dfd, error)) return NULL; @@ -1463,7 +1458,7 @@ ostree_repo_remote_gpg_import (OstreeRepo *self, gpgme_import_status_t import_status; g_autofree char *source_tmp_dir = NULL; g_autofree char *target_tmp_dir = NULL; - glnx_fd_close int target_temp_fd = -1; + glnx_autofd int target_temp_fd = -1; g_autoptr(GPtrArray) keys = NULL; struct stat stbuf; gpgme_error_t gpg_error; @@ -1596,7 +1591,7 @@ ostree_repo_remote_gpg_import (OstreeRepo *self, } else if (errno == ENOENT) { - glnx_fd_close int fd = -1; + glnx_autofd int fd = -1; /* Create an empty pubring.gpg file prior to importing keys. This * prevents gpg2 from creating a pubring.kbx file in the new keybox @@ -1815,7 +1810,7 @@ repo_create_at_internal (int dfd, return FALSE; if (errno == 0) { - glnx_fd_close int repo_dfd = -1; + glnx_autofd int repo_dfd = -1; if (!glnx_opendirat (dfd, path, TRUE, &repo_dfd, error)) return FALSE; @@ -1831,7 +1826,7 @@ repo_create_at_internal (int dfd, return glnx_throw_errno_prefix (error, "mkdirat"); } - glnx_fd_close int repo_dfd = -1; + glnx_autofd int repo_dfd = -1; if (!glnx_opendirat (dfd, path, TRUE, &repo_dfd, error)) return FALSE; @@ -1922,7 +1917,7 @@ ostree_repo_create (OstreeRepo *self, g_variant_builder_add (builder, "{s@v}", "collection-id", g_variant_new_variant (g_variant_new_string (self->collection_id))); - glnx_fd_close int repo_dir_fd = -1; + glnx_autofd int repo_dir_fd = -1; if (!repo_create_at_internal (AT_FDCWD, repopath, mode, g_variant_builder_end (builder), &repo_dir_fd, @@ -1966,7 +1961,7 @@ ostree_repo_create_at (int dfd, GCancellable *cancellable, GError **error) { - glnx_fd_close int repo_dfd = -1; + glnx_autofd int repo_dfd = -1; if (!repo_create_at_internal (dfd, path, mode, options, &repo_dfd, cancellable, error)) return NULL; @@ -2531,14 +2526,12 @@ ostree_repo_set_cache_dir (OstreeRepo *self, GCancellable *cancellable, GError **error) { - int fd; - + glnx_autofd int fd = -1; if (!glnx_opendirat (dfd, path, TRUE, &fd, error)) return FALSE; - if (self->cache_dir_fd != -1) - close (self->cache_dir_fd); - self->cache_dir_fd = fd; + glnx_close_fd (&self->cache_dir_fd); + self->cache_dir_fd = glnx_steal_fd (&fd); return TRUE; } @@ -2814,7 +2807,7 @@ load_metadata_internal (OstreeRepo *self, GError **error) { char loose_path_buf[_OSTREE_LOOSE_PATH_MAX]; - glnx_fd_close int fd = -1; + glnx_autofd int fd = -1; g_autoptr(GInputStream) ret_stream = NULL; g_autoptr(GVariant) ret_variant = NULL; @@ -2932,7 +2925,7 @@ repo_load_file_archive (OstreeRepo *self, char loose_path_buf[_OSTREE_LOOSE_PATH_MAX]; _ostree_loose_path (loose_path_buf, checksum, OSTREE_OBJECT_TYPE_FILE, self->mode); - glnx_fd_close int fd = -1; + glnx_autofd int fd = -1; if (!ot_openat_ignore_enoent (self->objects_dir_fd, loose_path_buf, &fd, error)) return FALSE; @@ -2988,7 +2981,7 @@ _ostree_repo_load_file_bare (OstreeRepo *self, } struct stat stbuf; - glnx_fd_close int fd = -1; + glnx_autofd int fd = -1; g_autofree char *ret_symlink = NULL; g_autoptr(GVariant) ret_xattrs = NULL; char loose_path_buf[_OSTREE_LOOSE_PATH_MAX]; @@ -3062,7 +3055,7 @@ _ostree_repo_load_file_bare (OstreeRepo *self, ret_symlink = g_strndup (targetbuf, target_size); } /* In the symlink case, we don't want to return the bare-user fd */ - (void) close (glnx_steal_fd (&fd)); + glnx_close_fd (&fd); } } else if (self->mode == OSTREE_REPO_MODE_BARE_USER_ONLY) @@ -3138,7 +3131,7 @@ ostree_repo_load_file (OstreeRepo *self, cancellable, error); else { - glnx_fd_close int fd = -1; + glnx_autofd int fd = -1; struct stat stbuf; g_autofree char *symlink_target = NULL; g_autoptr(GVariant) ret_xattrs = NULL; @@ -4182,14 +4175,14 @@ ostree_repo_add_gpg_signature_summary (OstreeRepo *self, GCancellable *cancellable, GError **error) { - glnx_fd_close int fd = -1; + glnx_autofd int fd = -1; if (!glnx_openat_rdonly (self->repo_dir_fd, "summary", TRUE, &fd, error)) return FALSE; g_autoptr(GBytes) summary_data = ot_fd_readall_or_mmap (fd, 0, error); if (!summary_data) return FALSE; /* Note that fd is reused below */ - (void) close (glnx_steal_fd (&fd)); + glnx_close_fd (&fd); g_autoptr(GVariant) existing_signatures = NULL; if (!ot_openat_ignore_enoent (self->repo_dir_fd, "summary.sig", &fd, error)) @@ -4239,7 +4232,7 @@ find_keyring (OstreeRepo *self, GCancellable *cancellable, GError **error) { - glnx_fd_close int fd = -1; + glnx_autofd int fd = -1; if (!ot_openat_ignore_enoent (self->repo_dir_fd, remote->keyring, &fd, error)) return FALSE; @@ -4748,7 +4741,7 @@ ostree_repo_regenerate_summary (OstreeRepo *self, return FALSE; g_autofree char *superblock = _ostree_get_relative_static_delta_superblock_path ((from && from[0]) ? from : NULL, to); - glnx_fd_close int superblock_file_fd = -1; + glnx_autofd int superblock_file_fd = -1; if (!glnx_openat_rdonly (self->repo_dir_fd, superblock, TRUE, &superblock_file_fd, error)) return FALSE; @@ -4965,7 +4958,7 @@ _ostree_repo_allocate_tmpdir (int tmpdir_dfd, dent->d_type != DT_DIR) continue; - glnx_fd_close int target_dfd = -1; + glnx_autofd int target_dfd = -1; if (!glnx_opendirat (dfd_iter.fd, dent->d_name, FALSE, &target_dfd, &local_error)) { diff --git a/src/libostree/ostree-sepolicy.c b/src/libostree/ostree-sepolicy.c index ab045970..410cf194 100644 --- a/src/libostree/ostree-sepolicy.c +++ b/src/libostree/ostree-sepolicy.c @@ -203,7 +203,7 @@ get_policy_checksum (char **out_csum, g_autofree char *best_policy = NULL; int best_version = 0; - glnx_fd_close int bindir_dfd = -1; + glnx_autofd int bindir_dfd = -1; if (!glnx_opendirat (AT_FDCWD, bindir_path, TRUE, &bindir_dfd, error)) return FALSE; diff --git a/src/libostree/ostree-sysroot-cleanup.c b/src/libostree/ostree-sysroot-cleanup.c index a01334e3..7a6ac1e9 100644 --- a/src/libostree/ostree-sysroot-cleanup.c +++ b/src/libostree/ostree-sysroot-cleanup.c @@ -282,7 +282,7 @@ cleanup_old_deployments (OstreeSysroot *self, if (!g_hash_table_lookup (active_deployment_dirs, deployment_path)) { struct stat stbuf; - glnx_fd_close int deployment_fd = -1; + glnx_autofd int deployment_fd = -1; if (!glnx_opendirat (self->sysroot_fd, deployment_path, TRUE, &deployment_fd, error)) diff --git a/src/libostree/ostree-sysroot-deploy.c b/src/libostree/ostree-sysroot-deploy.c index 4b2f3707..c1f5af9e 100644 --- a/src/libostree/ostree-sysroot-deploy.c +++ b/src/libostree/ostree-sysroot-deploy.c @@ -164,7 +164,7 @@ copy_dir_recurse (int src_parent_dfd, GError **error) { g_auto(GLnxDirFdIterator) src_dfd_iter = { 0, }; - glnx_fd_close int dest_dfd = -1; + glnx_autofd int dest_dfd = -1; struct dirent *dent; if (!glnx_dirfd_iterator_init_at (src_parent_dfd, name, TRUE, &src_dfd_iter, error)) @@ -226,8 +226,8 @@ ensure_directory_from_template (int orig_etc_fd, GCancellable *cancellable, GError **error) { - glnx_fd_close int src_dfd = -1; - glnx_fd_close int target_dfd = -1; + glnx_autofd int src_dfd = -1; + glnx_autofd int target_dfd = -1; g_assert (path != NULL); g_assert (*path != '/' && *path != '\0'); @@ -297,7 +297,7 @@ copy_modified_config_file (int orig_etc_fd, if (!glnx_fstatat (modified_etc_fd, path, &modified_stbuf, AT_SYMLINK_NOFOLLOW, error)) return glnx_prefix_error (error, "Reading modified config file"); - glnx_fd_close int dest_parent_dfd = -1; + glnx_autofd int dest_parent_dfd = -1; if (strchr (path, '/') != NULL) { g_autofree char *parent = g_path_get_dirname (path); @@ -393,7 +393,7 @@ merge_configuration_from (OstreeSysroot *sysroot, GCancellable *cancellable, GError **error) { - glnx_fd_close int owned_merge_deployment_dfd = -1; + glnx_autofd int owned_merge_deployment_dfd = -1; const OstreeSysrootDebugFlags flags = sysroot->debug_flags; g_assert (merge_deployment != NULL && new_deployment != NULL); @@ -443,13 +443,13 @@ merge_configuration_from (OstreeSysroot *sysroot, _ostree_sysroot_emit_journal_msg (sysroot, msg); } - glnx_fd_close int orig_etc_fd = -1; + glnx_autofd int orig_etc_fd = -1; if (!glnx_opendirat (merge_deployment_dfd, "usr/etc", TRUE, &orig_etc_fd, error)) return FALSE; - glnx_fd_close int modified_etc_fd = -1; + glnx_autofd int modified_etc_fd = -1; if (!glnx_opendirat (merge_deployment_dfd, "etc", TRUE, &modified_etc_fd, error)) return FALSE; - glnx_fd_close int new_etc_fd = -1; + glnx_autofd int new_etc_fd = -1; if (!glnx_opendirat (new_deployment_dfd, "etc", TRUE, &new_etc_fd, error)) return FALSE; @@ -508,7 +508,7 @@ checkout_deployment_tree (OstreeSysroot *sysroot, const char *csum = ostree_deployment_get_csum (deployment); g_autofree char *checkout_target_name = NULL; g_autofree char *osdeploy_path = NULL; - glnx_fd_close int osdeploy_dfd = -1; + glnx_autofd int osdeploy_dfd = -1; int ret_fd; osdeploy_path = g_strconcat ("ostree/deploy/", ostree_deployment_get_osname (deployment), "/deploy", NULL); @@ -899,8 +899,7 @@ typedef struct { static void _ostree_kernel_layout_free (OstreeKernelLayout *layout) { - if (layout->boot_dfd != -1) - (void) close (layout->boot_dfd); + glnx_close_fd (&layout->boot_dfd); g_free (layout->kernel_srcpath); g_free (layout->kernel_namever); g_free (layout->initramfs_srcpath); @@ -991,7 +990,7 @@ get_kernel_from_tree_usrlib_modules (int deployment_dfd, /* We found a module directory, compute the checksum */ g_auto(OtChecksum) checksum = { 0, }; ot_checksum_init (&checksum); - glnx_fd_close int fd = -1; + glnx_autofd int fd = -1; /* Checksum the kernel */ if (!glnx_openat_rdonly (ret_layout->boot_dfd, "vmlinuz", TRUE, &fd, error)) return FALSE; @@ -999,7 +998,7 @@ get_kernel_from_tree_usrlib_modules (int deployment_dfd, if (!ot_gio_splice_update_checksum (NULL, in, &checksum, cancellable, error)) return FALSE; g_clear_object (&in); - (void) close (fd); fd = -1; + glnx_close_fd (&fd); /* Look for an initramfs, but it's optional; since there wasn't any precedent * for this, let's be a bit conservative and support both `initramfs.img` and @@ -1238,8 +1237,8 @@ fsfreeze_thaw_cycle (OstreeSysroot *self, int sockpair[2]; if (socketpair (AF_UNIX, SOCK_SEQPACKET | SOCK_CLOEXEC, 0, sockpair) < 0) return glnx_throw_errno_prefix (error, "socketpair"); - glnx_fd_close int sock_parent = sockpair[0]; - glnx_fd_close int sock_watchdog = sockpair[1]; + glnx_autofd int sock_parent = sockpair[0]; + glnx_autofd int sock_watchdog = sockpair[1]; pid_t pid = fork (); if (pid < 0) @@ -1249,7 +1248,7 @@ fsfreeze_thaw_cycle (OstreeSysroot *self, char c = '!'; if (pid == 0) /* Child watchdog/unfreezer process. */ { - (void) close (glnx_steal_fd (&sock_parent)); + glnx_close_fd (&sock_parent); /* Daemonize, and mask SIGINT/SIGTERM, so we're likely to survive e.g. * someone doing a `systemctl restart rpm-ostreed` or a Ctrl-C of * `ostree admin upgrade`. We don't daemonize though if testing so @@ -1306,7 +1305,7 @@ fsfreeze_thaw_cycle (OstreeSysroot *self, } else /* Parent process. */ { - (void) close (glnx_steal_fd (&sock_watchdog)); + glnx_close_fd (&sock_watchdog); /* Wait for the watchdog to say it's set up; mainly that it's * masked SIGTERM successfully. */ @@ -1390,7 +1389,7 @@ full_system_sync (OstreeSysroot *self, out_stats->root_syncfs_msec = (end_msec - start_msec); start_msec = g_get_monotonic_time () / 1000; - glnx_fd_close int boot_dfd = -1; + glnx_autofd int boot_dfd = -1; if (!glnx_opendirat (self->sysroot_fd, "boot", TRUE, &boot_dfd, error)) return FALSE; if (!fsfreeze_thaw_cycle (self, boot_dfd, cancellable, error)) @@ -1425,7 +1424,7 @@ create_new_bootlinks (OstreeSysroot *self, GCancellable *cancellable, GError **error) { - glnx_fd_close int ostree_dfd = -1; + glnx_autofd int ostree_dfd = -1; if (!glnx_opendirat (self->sysroot_fd, "ostree", TRUE, &ostree_dfd, error)) return FALSE; @@ -1450,7 +1449,7 @@ create_new_bootlinks (OstreeSysroot *self, if (!glnx_shutil_mkdir_p_at (ostree_dfd, ostree_subbootdir_name, 0755, cancellable, error)) return FALSE; - glnx_fd_close int ostree_subbootdir_dfd = -1; + glnx_autofd int ostree_subbootdir_dfd = -1; if (!glnx_opendirat (ostree_dfd, ostree_subbootdir_name, FALSE, &ostree_subbootdir_dfd, error)) return FALSE; @@ -1487,7 +1486,7 @@ swap_bootlinks (OstreeSysroot *self, GCancellable *cancellable, GError **error) { - glnx_fd_close int ostree_dfd = -1; + glnx_autofd int ostree_dfd = -1; if (!glnx_opendirat (self->sysroot_fd, "ostree", TRUE, &ostree_dfd, error)) return FALSE; @@ -1558,7 +1557,7 @@ install_deployment_kernel (OstreeSysroot *sysroot, { OstreeBootconfigParser *bootconfig = ostree_deployment_get_bootconfig (deployment); g_autofree char *deployment_dirpath = ostree_sysroot_get_deployment_dirpath (sysroot, deployment); - glnx_fd_close int deployment_dfd = -1; + glnx_autofd int deployment_dfd = -1; if (!glnx_opendirat (sysroot->sysroot_fd, deployment_dirpath, FALSE, &deployment_dfd, error)) return FALSE; @@ -1569,7 +1568,7 @@ install_deployment_kernel (OstreeSysroot *sysroot, cancellable, error)) return FALSE; - glnx_fd_close int boot_dfd = -1; + glnx_autofd int boot_dfd = -1; if (!glnx_opendirat (sysroot->sysroot_fd, "boot", TRUE, &boot_dfd, error)) return FALSE; @@ -1583,7 +1582,7 @@ install_deployment_kernel (OstreeSysroot *sysroot, if (!glnx_shutil_mkdir_p_at (boot_dfd, bootcsumdir, 0775, cancellable, error)) return FALSE; - glnx_fd_close int bootcsum_dfd = -1; + glnx_autofd int bootcsum_dfd = -1; if (!glnx_opendirat (boot_dfd, bootcsumdir, TRUE, &bootcsum_dfd, error)) return FALSE; @@ -1714,7 +1713,7 @@ install_deployment_kernel (OstreeSysroot *sysroot, g_autofree char *options_key = _ostree_kernel_args_to_string (kargs); ostree_bootconfig_parser_set (bootconfig, "options", options_key); - glnx_fd_close int bootconf_dfd = -1; + glnx_autofd int bootconf_dfd = -1; if (!glnx_opendirat (boot_dfd, bootconfdir, TRUE, &bootconf_dfd, error)) return FALSE; @@ -1759,7 +1758,7 @@ swap_bootloader (OstreeSysroot *sysroot, GCancellable *cancellable, GError **error) { - glnx_fd_close int boot_dfd = -1; + glnx_autofd int boot_dfd = -1; g_assert ((current_bootversion == 0 && new_bootversion == 1) || (current_bootversion == 1 && new_bootversion == 0)); @@ -2254,7 +2253,7 @@ allocate_deployserial (OstreeSysroot *self, g_autoptr(GPtrArray) tmp_current_deployments = g_ptr_array_new_with_free_func (g_object_unref); - glnx_fd_close int deploy_dfd = -1; + glnx_autofd int deploy_dfd = -1; if (!glnx_opendirat (self->sysroot_fd, "ostree/deploy", TRUE, &deploy_dfd, error)) return FALSE; @@ -2309,7 +2308,7 @@ ostree_sysroot_deploy_tree (OstreeSysroot *self, osname = ostree_deployment_get_osname (self->booted_deployment); const char *osdeploypath = glnx_strjoina ("ostree/deploy/", osname); - glnx_fd_close int os_deploy_dfd = -1; + glnx_autofd int os_deploy_dfd = -1; if (!glnx_opendirat (self->sysroot_fd, osdeploypath, TRUE, &os_deploy_dfd, error)) return FALSE; @@ -2330,7 +2329,7 @@ ostree_sysroot_deploy_tree (OstreeSysroot *self, ostree_deployment_set_origin (new_deployment, origin); /* Check out the userspace tree onto the filesystem */ - glnx_fd_close int deployment_dfd = -1; + glnx_autofd int deployment_dfd = -1; if (!checkout_deployment_tree (self, repo, new_deployment, &deployment_dfd, cancellable, error)) { @@ -2476,7 +2475,7 @@ ostree_sysroot_deployment_set_mutable (OstreeSysroot *self, return FALSE; g_autofree char *deployment_path = ostree_sysroot_get_deployment_dirpath (self, deployment); - glnx_fd_close int fd = -1; + glnx_autofd int fd = -1; if (!glnx_opendirat (self->sysroot_fd, deployment_path, TRUE, &fd, error)) return FALSE; diff --git a/src/libostree/ostree-sysroot.c b/src/libostree/ostree-sysroot.c index 984e16d5..d320e220 100644 --- a/src/libostree/ostree-sysroot.c +++ b/src/libostree/ostree-sysroot.c @@ -296,11 +296,7 @@ _ostree_sysroot_bump_mtime (OstreeSysroot *self, void ostree_sysroot_unload (OstreeSysroot *self) { - if (self->sysroot_fd != -1) - { - (void) close (self->sysroot_fd); - self->sysroot_fd = -1; - } + glnx_close_fd (&self->sysroot_fd); } /** @@ -638,7 +634,7 @@ parse_deployment (OstreeSysroot *self, &treecsum, &deployserial, error)) return FALSE; - glnx_fd_close int deployment_dfd = -1; + glnx_autofd int deployment_dfd = -1; if (!glnx_opendirat (self->sysroot_fd, relative_boot_link, TRUE, &deployment_dfd, error)) return FALSE; @@ -1438,7 +1434,7 @@ ostree_sysroot_init_osname (OstreeSysroot *self, if (mkdirat (self->sysroot_fd, deploydir, 0777) < 0) return glnx_throw_errno_prefix (error, "Creating %s", deploydir); - glnx_fd_close int dfd = -1; + glnx_autofd int dfd = -1; if (!glnx_opendirat (self->sysroot_fd, deploydir, TRUE, &dfd, error)) return FALSE; @@ -1694,7 +1690,7 @@ ostree_sysroot_deployment_unlock (OstreeSysroot *self, return FALSE; g_autofree char *deployment_path = ostree_sysroot_get_deployment_dirpath (self, deployment); - glnx_fd_close int deployment_dfd = -1; + glnx_autofd int deployment_dfd = -1; if (!glnx_opendirat (self->sysroot_fd, deployment_path, TRUE, &deployment_dfd, error)) return FALSE; diff --git a/src/libotutil/ot-fs-utils.c b/src/libotutil/ot-fs-utils.c index cad27496..0dea3a9c 100644 --- a/src/libotutil/ot-fs-utils.c +++ b/src/libotutil/ot-fs-utils.c @@ -79,7 +79,7 @@ ot_openat_read_stream (int dfd, GCancellable *cancellable, GError **error) { - glnx_fd_close int fd = -1; + glnx_autofd int fd = -1; if (!glnx_openat_rdonly (dfd, path, follow, &fd, error)) return FALSE; *out_istream = g_unix_input_stream_new (glnx_steal_fd (&fd), TRUE); @@ -127,7 +127,7 @@ ot_dfd_iter_init_allow_noent (int dfd, gboolean *out_exists, GError **error) { - glnx_fd_close int fd = glnx_opendirat_with_errno (dfd, path, TRUE); + glnx_autofd int fd = glnx_opendirat_with_errno (dfd, path, TRUE); if (fd < 0) { if (errno != ENOENT) diff --git a/src/ostree/ostree-trivial-httpd.c b/src/ostree/ostree-trivial-httpd.c index e173fc38..b9909c8e 100644 --- a/src/ostree/ostree-trivial-httpd.c +++ b/src/ostree/ostree-trivial-httpd.c @@ -353,7 +353,7 @@ do_get (OtTrivialHttpd *self, if (msg->method == SOUP_METHOD_GET) { - glnx_fd_close int fd = -1; + glnx_autofd int fd = -1; g_autoptr(GMappedFile) mapping = NULL; gsize buffer_length, file_size; SoupRange *ranges; diff --git a/src/ostree/ot-admin-builtin-init-fs.c b/src/ostree/ot-admin-builtin-init-fs.c index c5a9781f..3ef9017f 100644 --- a/src/ostree/ot-admin-builtin-init-fs.c +++ b/src/ostree/ot-admin-builtin-init-fs.c @@ -57,7 +57,7 @@ ot_admin_builtin_init_fs (int argc, char **argv, GCancellable *cancellable, GErr const char *sysroot_path = argv[1]; - glnx_fd_close int root_dfd = -1; + glnx_autofd int root_dfd = -1; if (!glnx_opendirat (AT_FDCWD, sysroot_path, TRUE, &root_dfd, error)) return FALSE; diff --git a/src/ostree/ot-builtin-commit.c b/src/ostree/ot-builtin-commit.c index 97431062..b10e8d2d 100644 --- a/src/ostree/ot-builtin-commit.c +++ b/src/ostree/ot-builtin-commit.c @@ -501,7 +501,7 @@ ostree_builtin_commit (int argc, char **argv, GCancellable *cancellable, GError &filter_data, NULL); if (opt_selinux_policy) { - glnx_fd_close int rootfs_dfd = -1; + glnx_autofd int rootfs_dfd = -1; if (!glnx_opendirat (AT_FDCWD, opt_selinux_policy, TRUE, &rootfs_dfd, error)) { g_prefix_error (error, "selinux-policy: "); diff --git a/src/ostree/ot-builtin-create-usb.c b/src/ostree/ot-builtin-create-usb.c index c77dbcba..2812f348 100644 --- a/src/ostree/ot-builtin-create-usb.c +++ b/src/ostree/ot-builtin-create-usb.c @@ -80,7 +80,7 @@ ostree_builtin_create_usb (int argc, const char *mount_root_path = argv[1]; struct stat mount_root_stbuf; - glnx_fd_close int mount_root_dfd = -1; + glnx_autofd int mount_root_dfd = -1; if (!glnx_opendirat (AT_FDCWD, mount_root_path, TRUE, &mount_root_dfd, error)) return FALSE; if (!glnx_fstat (mount_root_dfd, &mount_root_stbuf, error)) diff --git a/src/ostree/ot-builtin-show.c b/src/ostree/ot-builtin-show.c index 3ab56eb2..c4b586b1 100644 --- a/src/ostree/ot-builtin-show.c +++ b/src/ostree/ot-builtin-show.c @@ -58,7 +58,7 @@ do_print_variant_generic (const GVariantType *type, { g_autoptr(GVariant) variant = NULL; - glnx_fd_close int fd = -1; + glnx_autofd int fd = -1; if (!glnx_openat_rdonly (AT_FDCWD, filename, TRUE, &fd, error)) return FALSE; if (!ot_variant_read_fd (fd, 0, type, FALSE, &variant, error)) diff --git a/src/ostree/ot-builtin-summary.c b/src/ostree/ot-builtin-summary.c index ed9e0b3d..15998efd 100644 --- a/src/ostree/ot-builtin-summary.c +++ b/src/ostree/ot-builtin-summary.c @@ -217,7 +217,7 @@ ostree_builtin_summary (int argc, char **argv, GCancellable *cancellable, GError if (opt_raw) flags |= OSTREE_DUMP_RAW; - glnx_fd_close int fd = -1; + glnx_autofd int fd = -1; if (!glnx_openat_rdonly (repo->repo_dir_fd, "summary", TRUE, &fd, error)) return FALSE; summary_data = ot_fd_readall_or_mmap (fd, 0, error); diff --git a/src/ostree/ot-remote-cookie-util.c b/src/ostree/ot-remote-cookie-util.c index 6f7b4c2b..3baaf78c 100644 --- a/src/ostree/ot-remote-cookie-util.c +++ b/src/ostree/ot-remote-cookie-util.c @@ -79,7 +79,7 @@ ot_parse_cookies_at (int dfd, const char *path, { OtCookieParser *parser; g_autofree char *cookies_content = NULL; - glnx_fd_close int infd = -1; + glnx_autofd int infd = -1; infd = openat (dfd, path, O_RDONLY | O_CLOEXEC); if (infd < 0) @@ -143,7 +143,7 @@ ot_add_cookie_at (int dfd, const char *jar_path, const char *name, const char *value, GError **error) { - glnx_fd_close int fd = openat (dfd, jar_path, O_WRONLY | O_APPEND | O_CREAT, 0644); + glnx_autofd int fd = openat (dfd, jar_path, O_WRONLY | O_APPEND | O_CREAT, 0644); if (fd < 0) return glnx_throw_errno_prefix (error, "open(%s)", jar_path); diff --git a/src/rofiles-fuse/main.c b/src/rofiles-fuse/main.c index b80c916d..97c91b60 100644 --- a/src/rofiles-fuse/main.c +++ b/src/rofiles-fuse/main.c @@ -268,7 +268,7 @@ callback_chown (const char *path, uid_t uid, gid_t gid) static int callback_truncate (const char *path, off_t size) { - glnx_fd_close int fd = -1; + glnx_autofd int fd = -1; path = ENSURE_RELPATH (path); VERIFY_WRITE(path); diff --git a/tests/test-repo-finder-mount.c b/tests/test-repo-finder-mount.c index 10b253f7..6722f2db 100644 --- a/tests/test-repo-finder-mount.c +++ b/tests/test-repo-finder-mount.c @@ -154,7 +154,7 @@ assert_create_repos_dir (Fixture *fixture, int *out_repos_dfd, GMount **out_mount) { - glnx_fd_close int repos_dfd = -1; + glnx_autofd int repos_dfd = -1; g_autoptr(GError) error = NULL; g_autofree gchar *path = g_build_filename (mount_root_name, ".ostree", "repos.d", NULL); @@ -242,7 +242,7 @@ assert_create_repo_dir (Fixture *fixture, gchar **out_uri, ...) { - glnx_fd_close int ref_dfd = -1; + glnx_autofd int ref_dfd = -1; g_autoptr(OstreeRepo) repo = NULL; g_autoptr(GError) error = NULL; va_list args; @@ -318,9 +318,9 @@ test_repo_finder_mount_mixed_mounts (Fixture *fixture, g_autoptr(GMount) repo1_mount = NULL; g_autoptr(GMount) repo2_mount = NULL; g_autoptr(GFile) non_removable_root = NULL; - glnx_fd_close int no_repos_repos = -1; - glnx_fd_close int repo1_repos = -1; - glnx_fd_close int repo2_repos = -1; + glnx_autofd int no_repos_repos = -1; + glnx_autofd int repo1_repos = -1; + glnx_autofd int repo2_repos = -1; g_autoptr(OstreeRepo) repo1_repo_a = NULL, repo1_repo_b = NULL; g_autoptr(OstreeRepo) repo2_repo_a = NULL; g_autofree gchar *repo1_repo_a_uri = NULL, *repo1_repo_b_uri = NULL; @@ -464,7 +464,7 @@ test_repo_finder_mount_well_known (Fixture *fixture, g_autoptr(GError) error = NULL; g_autoptr(GList) mounts = NULL; /* (element-type OstreeMockMount) */ g_autoptr(GMount) mount = NULL; - glnx_fd_close int repos = -1; + glnx_autofd int repos = -1; g_autoptr(OstreeRepo) repo_a = NULL, repo_b = NULL; g_autofree gchar *repo_a_uri = NULL, *repo_b_uri = NULL; g_autofree gchar *ref_a_checksum = NULL, *ref_b_checksum = NULL; From 8f6ec62bfb149ec8dfb6076228dd64e5df27a76b Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Wed, 11 Oct 2017 17:02:02 -0400 Subject: [PATCH 34/98] lib/deploy: Use _exit() for FIFREEZE watchdog This works around an (IMO) SpiderMonkey bug - it tries to clean up in a shared library destructor, but doesn't install a `pthread_atfork()` handler to unset its state. Closes: https://github.com/ostreedev/ostree/issues/1262 Closes: #1264 Approved by: dbnicholson --- src/libostree/ostree-sysroot-deploy.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/libostree/ostree-sysroot-deploy.c b/src/libostree/ostree-sysroot-deploy.c index c1f5af9e..c34e0097 100644 --- a/src/libostree/ostree-sysroot-deploy.c +++ b/src/libostree/ostree-sysroot-deploy.c @@ -1301,7 +1301,12 @@ fsfreeze_thaw_cycle (OstreeSysroot *self, } if (debug_fifreeze) g_printerr ("fifreeze watchdog was run\n"); - exit (EXIT_SUCCESS); + /* We use _exit() rather than exit() to avoid tripping over any shared + * libraries in process that aren't fork() safe; for example gjs/spidermonkey: + * https://github.com/ostreedev/ostree/issues/1262 + * This doesn't help for the err()/errx() calls above, but eh... + */ + _exit (EXIT_SUCCESS); } else /* Parent process. */ { From 057482761becb312a735b9f9d57d124edf8a6819 Mon Sep 17 00:00:00 2001 From: Jonathan Lebon Date: Tue, 10 Oct 2017 18:13:40 +0000 Subject: [PATCH 35/98] tests: drop unused variable Closes: #1263 Approved by: cgwalters --- tests/test-repo-finder-config.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/test-repo-finder-config.c b/tests/test-repo-finder-config.c index b89aaee4..428e02eb 100644 --- a/tests/test-repo-finder-config.c +++ b/tests/test-repo-finder-config.c @@ -66,8 +66,6 @@ static void teardown (Fixture *fixture, gconstpointer test_data) { - g_autoptr(GError) error = NULL; - /* Recursively remove the temporary directory. */ (void)glnx_tmpdir_delete (&fixture->tmpdir, NULL, NULL); From 60b5925c549288171a38d97ad06cb4693a7f8107 Mon Sep 17 00:00:00 2001 From: Jonathan Lebon Date: Wed, 11 Oct 2017 15:46:52 +0000 Subject: [PATCH 36/98] ostree/checksum: port to new decl style No functional changes, prep for patch. (Well, I did add a new `success` member in the async struct so that we return `FALSE` if we failed). Closes: #1263 Approved by: cgwalters --- src/ostree/ot-builtin-checksum.c | 54 ++++++++++++++------------------ 1 file changed, 23 insertions(+), 31 deletions(-) diff --git a/src/ostree/ot-builtin-checksum.c b/src/ostree/ot-builtin-checksum.c index 5ca6eed3..0bc98d3d 100644 --- a/src/ostree/ot-builtin-checksum.c +++ b/src/ostree/ot-builtin-checksum.c @@ -38,6 +38,7 @@ static GOptionEntry options[] = { typedef struct { GError **error; + gboolean success; GMainLoop *loop; } AsyncChecksumData; @@ -46,50 +47,41 @@ on_checksum_received (GObject *obj, GAsyncResult *result, gpointer user_data) { - g_autofree guchar *csum = NULL; - g_autofree char *checksum = NULL; AsyncChecksumData *data = user_data; - if (ostree_checksum_file_async_finish ((GFile*)obj, result, &csum, data->error)) + g_autofree guchar *csum = NULL; + data->success = ostree_checksum_file_async_finish ((GFile*)obj, result, &csum, data->error); + if (data->success) { - checksum = ostree_checksum_from_bytes (csum); + g_autofree char *checksum = ostree_checksum_from_bytes (csum); g_print ("%s\n", checksum); } - + g_main_loop_quit (data->loop); } gboolean ostree_builtin_checksum (int argc, char **argv, GCancellable *cancellable, GError **error) { - g_autoptr(GOptionContext) context = NULL; - gboolean ret = FALSE; - g_autoptr(GFile) f = NULL; + g_autoptr(GOptionContext) context = + g_option_context_new ("PATH - Checksum a file or directory"); + if (!ostree_option_context_parse (context, options, &argc, &argv, + OSTREE_BUILTIN_FLAG_NO_REPO, NULL, cancellable, error)) + return FALSE; + + if (argc < 2) + return glnx_throw (error, "A filename must be given"); + const char *path = argv[1]; + + g_autoptr(GFile) f = g_file_new_for_path (path); + g_autoptr(GMainLoop) loop = g_main_loop_new (NULL, FALSE); + AsyncChecksumData data = { 0, }; - context = g_option_context_new ("PATH - Checksum a file or directory"); - - if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NO_REPO, NULL, cancellable, error)) - goto out; - - if (argc > 1) - f = g_file_new_for_path (argv[1]); - else - { - g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, - "A filename must be given"); - goto out; - } - - data.loop = g_main_loop_new (NULL, FALSE); + data.loop = loop; data.error = error; - ostree_checksum_file_async (f, OSTREE_OBJECT_TYPE_FILE, G_PRIORITY_DEFAULT, cancellable, on_checksum_received, &data); - + ostree_checksum_file_async (f, OSTREE_OBJECT_TYPE_FILE, G_PRIORITY_DEFAULT, cancellable, + on_checksum_received, &data); g_main_loop_run (data.loop); - - ret = TRUE; - out: - if (data.loop) - g_main_loop_unref (data.loop); - return ret; + return data.success; } From 077d2718ad5ef58935ecb03f7757302250753c09 Mon Sep 17 00:00:00 2001 From: Jonathan Lebon Date: Wed, 11 Oct 2017 14:52:02 +0000 Subject: [PATCH 37/98] lib/core: add ostree_checksum_file_at API This is like `ostree_checksum_file` but fd-relative. This will be used by https://github.com/ostreedev/ostree/pull/1258. AFAICT, we actually didn't have any tests that check the `checksum` CLI. Add a basic one here to test the old code as well as the new code. Closes: #1263 Approved by: cgwalters --- apidoc/ostree-sections.txt | 1 + bash/ostree | 1 + man/ostree-checksum.xml | 13 ++++++ src/libostree/libostree-devel.sym | 4 +- src/libostree/ostree-core.c | 75 +++++++++++++++++++++++++++++++ src/libostree/ostree-core.h | 21 +++++++++ src/ostree/ot-builtin-checksum.c | 44 ++++++++++++------ tests/basic-test.sh | 29 +++++++++++- 8 files changed, 173 insertions(+), 15 deletions(-) diff --git a/apidoc/ostree-sections.txt b/apidoc/ostree-sections.txt index e5ce157c..1ba02cfc 100644 --- a/apidoc/ostree-sections.txt +++ b/apidoc/ostree-sections.txt @@ -135,6 +135,7 @@ ostree_raw_file_to_archive_z2_stream_with_options ostree_raw_file_to_content_stream ostree_checksum_file_from_input ostree_checksum_file +ostree_checksum_file_at ostree_checksum_file_async ostree_checksum_file_async_finish ostree_create_directory_metadata diff --git a/bash/ostree b/bash/ostree index 034f101b..c132a43f 100644 --- a/bash/ostree +++ b/bash/ostree @@ -745,6 +745,7 @@ _ostree_checkout() { _ostree_checksum() { local boolean_options=" $main_boolean_options + --ignore-xattrs " case "$cur" in diff --git a/man/ostree-checksum.xml b/man/ostree-checksum.xml index 53914782..c6e16a8b 100644 --- a/man/ostree-checksum.xml +++ b/man/ostree-checksum.xml @@ -61,6 +61,19 @@ Boston, MA 02111-1307, USA. + + Options + + + + + + Ignore extended attributes when checksumming. + + + + + Example $ ostree checksum file1 diff --git a/src/libostree/libostree-devel.sym b/src/libostree/libostree-devel.sym index 896d2b75..07d99f15 100644 --- a/src/libostree/libostree-devel.sym +++ b/src/libostree/libostree-devel.sym @@ -19,6 +19,8 @@ /* Add new symbols here. Release commits should copy this section into -released.sym. */ LIBOSTREE_2017.13 { +global: + ostree_checksum_file_at; } LIBOSTREE_2017.12; /* Stub section for the stable release *after* this development one; don't @@ -27,6 +29,6 @@ LIBOSTREE_2017.13 { * with whatever the next version with new symbols will be. LIBOSTREE_2017.$NEWVERSION { global: - someostree_symbol_deleteme; + someostree_symbol_deleteme; } LIBOSTREE_2017.$LASTSTABLE; */ diff --git a/src/libostree/ostree-core.c b/src/libostree/ostree-core.c index 733901f7..615f5dec 100644 --- a/src/libostree/ostree-core.c +++ b/src/libostree/ostree-core.c @@ -832,6 +832,81 @@ ostree_checksum_file (GFile *f, return TRUE; } +/** + * ostree_checksum_file_at: + * @dfd: Directory file descriptor + * @path: Subpath + * @stbuf (allow-none): Optional stat buffer + * @objtype: Object type + * @flags: Flags + * @out_checksum (out) (transfer full): Return location for hex checksum + * @cancellable: Cancellable + * @error: Error + * + * Compute the OSTree checksum for a given file. This is an fd-relative version + * of ostree_checksum_file() which also takes flags and fills in a caller + * allocated buffer. + * + * Since: 2017.13 + */ +gboolean +ostree_checksum_file_at (int dfd, + const char *path, + struct stat *stbuf, + OstreeObjectType objtype, + OstreeChecksumFlags flags, + char **out_checksum, + GCancellable *cancellable, + GError **error) +{ + g_return_val_if_fail (out_checksum != NULL, FALSE); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return FALSE; + + struct stat local_stbuf; + if (stbuf == NULL) + { + stbuf = &local_stbuf; + if (!glnx_fstatat (dfd, path, stbuf, AT_SYMLINK_NOFOLLOW, error)) + return FALSE; + } + + g_autoptr(GFileInfo) file_info = _ostree_stbuf_to_gfileinfo (stbuf); + + g_autoptr(GInputStream) in = NULL; + if (S_ISREG (stbuf->st_mode)) + { + glnx_autofd int fd = -1; + if (!glnx_openat_rdonly (dfd, path, FALSE, &fd, error)) + return FALSE; + in = g_unix_input_stream_new (glnx_steal_fd (&fd), TRUE); + } + else if (S_ISLNK (stbuf->st_mode)) + { + if (!ot_readlinkat_gfile_info (dfd, path, file_info, cancellable, error)) + return FALSE; + } + + const gboolean ignore_xattrs = + ((flags & OSTREE_CHECKSUM_FLAGS_IGNORE_XATTRS) > 0); + + g_autoptr(GVariant) xattrs = NULL; + if (!ignore_xattrs && objtype == OSTREE_OBJECT_TYPE_FILE) + { + if (!glnx_dfd_name_get_all_xattrs (dfd, path, &xattrs, cancellable, error)) + return FALSE; + } + + g_autofree guchar *csum_bytes = NULL; + if (!ostree_checksum_file_from_input (file_info, xattrs, in, objtype, + &csum_bytes, cancellable, error)) + return FALSE; + + *out_checksum = ostree_checksum_from_bytes (csum_bytes); + return TRUE; +} + typedef struct { GFile *f; OstreeObjectType objtype; diff --git a/src/libostree/ostree-core.h b/src/libostree/ostree-core.h index aae86d54..979b35a2 100644 --- a/src/libostree/ostree-core.h +++ b/src/libostree/ostree-core.h @@ -21,6 +21,7 @@ #pragma once +#include #include #include @@ -420,6 +421,26 @@ gboolean ostree_checksum_file (GFile *f, GCancellable *cancellable, GError **error); +/** + * OstreeChecksumFlags: + * + * Since: 2017.13 + */ +typedef enum { + OSTREE_CHECKSUM_FLAGS_NONE = 0, + OSTREE_CHECKSUM_FLAGS_IGNORE_XATTRS = (1 << 0), +} OstreeChecksumFlags; + +_OSTREE_PUBLIC +gboolean ostree_checksum_file_at (int dfd, + const char *path, + struct stat *stbuf, + OstreeObjectType objtype, + OstreeChecksumFlags flags, + char **out_checksum, + GCancellable *cancellable, + GError **error); + _OSTREE_PUBLIC void ostree_checksum_file_async (GFile *f, OstreeObjectType objtype, diff --git a/src/ostree/ot-builtin-checksum.c b/src/ostree/ot-builtin-checksum.c index 0bc98d3d..008c4fe7 100644 --- a/src/ostree/ot-builtin-checksum.c +++ b/src/ostree/ot-builtin-checksum.c @@ -32,7 +32,10 @@ * man page (man/ostree-checksum.xml) when changing the option list. */ +static gboolean opt_ignore_xattrs; + static GOptionEntry options[] = { + { "ignore-xattrs", 0, 0, G_OPTION_ARG_NONE, &opt_ignore_xattrs, "Don't include xattrs in checksum", NULL }, { NULL } }; @@ -49,12 +52,14 @@ on_checksum_received (GObject *obj, { AsyncChecksumData *data = user_data; - g_autofree guchar *csum = NULL; - data->success = ostree_checksum_file_async_finish ((GFile*)obj, result, &csum, data->error); + g_autofree guchar *csum_bytes = NULL; + data->success = + ostree_checksum_file_async_finish ((GFile*)obj, result, &csum_bytes, data->error); if (data->success) { - g_autofree char *checksum = ostree_checksum_from_bytes (csum); - g_print ("%s\n", checksum); + char csum[OSTREE_SHA256_STRING_LEN+1]; + ostree_checksum_inplace_from_bytes (csum_bytes, csum); + g_print ("%s\n", csum); } g_main_loop_quit (data->loop); @@ -73,15 +78,28 @@ ostree_builtin_checksum (int argc, char **argv, GCancellable *cancellable, GErro return glnx_throw (error, "A filename must be given"); const char *path = argv[1]; - g_autoptr(GFile) f = g_file_new_for_path (path); - g_autoptr(GMainLoop) loop = g_main_loop_new (NULL, FALSE); + /* for test coverage, use the async API if no flags are needed */ + if (!opt_ignore_xattrs) + { + g_autoptr(GFile) f = g_file_new_for_path (path); + g_autoptr(GMainLoop) loop = g_main_loop_new (NULL, FALSE); - AsyncChecksumData data = { 0, }; + AsyncChecksumData data = { 0, }; - data.loop = loop; - data.error = error; - ostree_checksum_file_async (f, OSTREE_OBJECT_TYPE_FILE, G_PRIORITY_DEFAULT, cancellable, - on_checksum_received, &data); - g_main_loop_run (data.loop); - return data.success; + data.loop = loop; + data.error = error; + ostree_checksum_file_async (f, OSTREE_OBJECT_TYPE_FILE, G_PRIORITY_DEFAULT, + cancellable, on_checksum_received, &data); + g_main_loop_run (data.loop); + return data.success; + } + + g_autofree char *checksum = NULL; + if (!ostree_checksum_file_at (AT_FDCWD, path, NULL, OSTREE_OBJECT_TYPE_FILE, + OSTREE_CHECKSUM_FLAGS_IGNORE_XATTRS, &checksum, + cancellable, error)) + return FALSE; + + g_print ("%s\n", checksum); + return TRUE; } diff --git a/tests/basic-test.sh b/tests/basic-test.sh index 037f7b45..4aae6b33 100644 --- a/tests/basic-test.sh +++ b/tests/basic-test.sh @@ -19,7 +19,7 @@ set -euo pipefail -echo "1..$((74 + ${extra_basic_tests:-0}))" +echo "1..$((75 + ${extra_basic_tests:-0}))" CHECKOUT_U_ARG="" CHECKOUT_H_ARGS="-H" @@ -238,6 +238,33 @@ fi assert_file_has_content err.txt "No such metadata object" echo "ok commit orphaned" +cd ${test_tmpdir} +# in bare-user-only mode, we canonicalize ownership to 0:0, so checksums won't +# match -- we could add a --ignore-ownership option I suppose? +if is_bare_user_only_repo repo; then + echo "ok # SKIP checksums won't match up in bare-user-only" +else + $OSTREE fsck + CHECKSUM_FLAG= + if [ -n "${OSTREE_NO_XATTRS:-}" ]; then + CHECKSUM_FLAG=--ignore-xattrs + fi + rm -rf checksum-test + $OSTREE checkout test2 checksum-test + find checksum-test/ -type f | while read fn; do + checksum=$($CMD_PREFIX ostree checksum $CHECKSUM_FLAG $fn) + objpath=repo/objects/${checksum::2}/${checksum:2}.file + assert_has_file $objpath + # running `ostree checksum` on the obj might not necessarily match, let's + # just check that they have the same content to confirm that it's + # (probably) the originating file + object_content_checksum=$(sha256sum $objpath | cut -f1 -d' ') + checkout_content_checksum=$(sha256sum $fn | cut -f1 -d' ') + assert_streq "$object_content_checksum" "$checkout_content_checksum" + done + echo "ok checksum CLI" +fi + cd ${test_tmpdir} $OSTREE diff test2^ test2 > diff-test2 assert_file_has_content diff-test2 'D */a/5' From a1986b1a8083ef4f840973f1c73d932a52e43644 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Thu, 12 Oct 2017 10:46:25 -0400 Subject: [PATCH 38/98] lib/deltas: Check cancellable during processing Let's react to `Ctrl-C` faster here. Noticed while I was doing an update on my desktop and playing with cancellation. Closes: #1266 Approved by: jlebon --- src/libostree/ostree-repo-static-delta-processing.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/libostree/ostree-repo-static-delta-processing.c b/src/libostree/ostree-repo-static-delta-processing.c index 6d00e79f..84fed682 100644 --- a/src/libostree/ostree-repo-static-delta-processing.c +++ b/src/libostree/ostree-repo-static-delta-processing.c @@ -229,6 +229,9 @@ _ostree_static_delta_part_execute (OstreeRepo *repo, state->oplen--; state->opdata++; + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + goto out; + switch (opcode) { case OSTREE_STATIC_DELTA_OP_OPEN_SPLICE_AND_CLOSE: From 2a9c5efe1d10b79681b0ee638994ead375be6597 Mon Sep 17 00:00:00 2001 From: Matthew Leeds Date: Fri, 13 Oct 2017 14:49:07 -0700 Subject: [PATCH 39/98] lib/utils: Check for invalid UTF-8 in filenames In case a filename contains invalid UTF-8 characters, libostree will pass it to g_variant_builder_add() in create_tree_variant_from_hashes() anyway, which leads to a critical warning from glib and an invalid commit. This commit makes ostree print a useful error and exit instead. Closes: #1271 Approved by: cgwalters --- src/libotutil/ot-unix-utils.c | 2 ++ tests/basic-test.sh | 10 +++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/libotutil/ot-unix-utils.c b/src/libotutil/ot-unix-utils.c index 3590de29..d05c8926 100644 --- a/src/libotutil/ot-unix-utils.c +++ b/src/libotutil/ot-unix-utils.c @@ -47,6 +47,8 @@ ot_util_filename_validate (const char *name, return glnx_throw (error, "Invalid path uplink filename '..'"); if (strchr (name, '/') != NULL) return glnx_throw (error, "Invalid / in filename %s", name); + if (!g_utf8_validate (name, -1, NULL)) + return glnx_throw (error, "Invalid UTF-8 in filename %s", name); return TRUE; } diff --git a/tests/basic-test.sh b/tests/basic-test.sh index 4aae6b33..3abefd10 100644 --- a/tests/basic-test.sh +++ b/tests/basic-test.sh @@ -19,7 +19,7 @@ set -euo pipefail -echo "1..$((75 + ${extra_basic_tests:-0}))" +echo "1..$((76 + ${extra_basic_tests:-0}))" CHECKOUT_U_ARG="" CHECKOUT_H_ARGS="-H" @@ -371,6 +371,14 @@ echo "ok commit from ref with modifier" $OSTREE commit ${COMMIT_ARGS} -b trees/test2 -s 'ref with / in it' --tree=ref=test2 echo "ok commit ref with /" +mkdir badutf8 +echo "invalid utf8 filename" > badutf8/$(printf '\x80') +if $OSTREE commit ${COMMIT_ARGS} -b badutf8 --tree=dir=badutf8 2>err.txt; then + assert_not_reached "commit filename with invalid UTF-8" +fi +assert_file_has_content err.txt "Invalid UTF-8 in filename" +echo "ok commit bad UTF-8" + old_rev=$($OSTREE rev-parse test2) $OSTREE ls -R -C test2 $OSTREE commit ${COMMIT_ARGS} --skip-if-unchanged -b trees/test2 -s 'should not be committed' --tree=ref=test2 From 950318936286b1b1ffcc2894a846af447e8dab12 Mon Sep 17 00:00:00 2001 From: Jonathan Lebon Date: Tue, 10 Oct 2017 18:14:10 +0000 Subject: [PATCH 40/98] lib/checkout: fallback to checksum for UNION_IDENTICAL There's a subtle issue going on with the way we use `UNION_IDENTICAL` now in rpm-ostree. Basically, the crux of the issue is that we checkout the whole tree from the system repo, but then overlay packages by checking out from the pkgcache repo. This is an easy way to break the assumption that we will be merging hardlinks from the same repo. This ends up causing issues like: https://github.com/projectatomic/rpm-ostree/issues/1047 There, `vim-minimal` is already part of the host and has an object for `/usr/share/man/man1/ex.1.gz`. `vim-common` has that same file, but because it's unpacked in the pkgcache repo first, the hardlinks are not the same. There are a few ways we *could* work around this in rpm-ostree itself, e.g. by re-establishing hardlinks when we do the content pull into the system repo, but it still felt somewhat hacky. Let's just do this the proper way and fall back to checksumming the target file if needed, which is what librpm does as well in this case. Note that we only checksum if they're not hard links, but they're the same size. Closes: #1258 Approved by: cgwalters --- src/libostree/ostree-core-private.h | 1 + src/libostree/ostree-core.c | 18 ++++++++++++++++++ src/libostree/ostree-repo-checkout.c | 26 +++++++++++++++++++++++--- tests/basic-test.sh | 6 ++++++ 4 files changed, 48 insertions(+), 3 deletions(-) diff --git a/src/libostree/ostree-core-private.h b/src/libostree/ostree-core-private.h index d7677f38..d8b93b29 100644 --- a/src/libostree/ostree-core-private.h +++ b/src/libostree/ostree-core-private.h @@ -83,6 +83,7 @@ _ostree_make_temporary_symlink_at (int tmp_dirfd, GFileInfo * _ostree_stbuf_to_gfileinfo (const struct stat *stbuf); gboolean _ostree_gfileinfo_equal (GFileInfo *a, GFileInfo *b); +gboolean _ostree_stbuf_equal (struct stat *stbuf_a, struct stat *stbuf_b); GFileInfo * _ostree_mode_uidgid_to_gfileinfo (mode_t mode, uid_t uid, gid_t gid); static inline void diff --git a/src/libostree/ostree-core.c b/src/libostree/ostree-core.c index 615f5dec..542c54bf 100644 --- a/src/libostree/ostree-core.c +++ b/src/libostree/ostree-core.c @@ -1576,6 +1576,24 @@ _ostree_gfileinfo_equal (GFileInfo *a, GFileInfo *b) return TRUE; } +/* Same motives as _ostree_gfileinfo_equal(), but for stat structs. */ +gboolean +_ostree_stbuf_equal (struct stat *stbuf_a, struct stat *stbuf_b) +{ + /* trivial case */ + if (stbuf_a == stbuf_b) + return TRUE; + if (stbuf_a->st_mode != stbuf_b->st_mode) + return FALSE; + if (S_ISREG (stbuf_a->st_mode) && (stbuf_a->st_size != stbuf_b->st_size)) + return FALSE; + if (stbuf_a->st_uid != stbuf_b->st_uid) + return FALSE; + if (stbuf_a->st_gid != stbuf_b->st_gid) + return FALSE; + return TRUE; +} + /* Many parts of libostree only care about mode,uid,gid - this creates * a new GFileInfo with those fields see. */ diff --git a/src/libostree/ostree-repo-checkout.c b/src/libostree/ostree-repo-checkout.c index 99896142..d144d03e 100644 --- a/src/libostree/ostree-repo-checkout.c +++ b/src/libostree/ostree-repo-checkout.c @@ -374,7 +374,8 @@ hardlink_add_tmp_name (OstreeRepo *self, static gboolean checkout_file_hardlink (OstreeRepo *self, - OstreeRepoCheckoutAtOptions *options, + const char *checksum, + OstreeRepoCheckoutAtOptions *options, const char *loose_path, int destination_dfd, const char *destination_name, @@ -436,10 +437,28 @@ checkout_file_hardlink (OstreeRepo *self, if (!glnx_fstatat (destination_dfd, destination_name, &dest_stbuf, AT_SYMLINK_NOFOLLOW, error)) return FALSE; - const gboolean is_identical = + gboolean is_identical = (src_stbuf.st_dev == dest_stbuf.st_dev && src_stbuf.st_ino == dest_stbuf.st_ino); + if (!is_identical && (_ostree_stbuf_equal (&src_stbuf, &dest_stbuf))) + { + /* As a last resort, do a checksum comparison. This is the case currently + * with rpm-ostree pkg layering where we overlay from the pkgcache repo onto + * a tree checked out from the system repo. Once those are united, we + * shouldn't hit this anymore. https://github.com/ostreedev/ostree/pull/1258 + * */ + OstreeChecksumFlags flags = 0; + if (self->disable_xattrs) + flags |= OSTREE_CHECKSUM_FLAGS_IGNORE_XATTRS; + g_autofree char *actual_checksum = NULL; + if (!ostree_checksum_file_at (destination_dfd, destination_name, + &dest_stbuf, OSTREE_OBJECT_TYPE_FILE, + flags, &actual_checksum, cancellable, error)) + return FALSE; + + is_identical = g_str_equal (checksum, actual_checksum); + } if (is_identical) ret_result = HARDLINK_RESULT_SKIP_EXISTED; else if (options->overwrite_mode == OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_FILES) @@ -563,6 +582,7 @@ checkout_one_file_at (OstreeRepo *repo, the cache, which is in "bare" form */ _ostree_loose_path (loose_path_buf, checksum, OSTREE_OBJECT_TYPE_FILE, OSTREE_REPO_MODE_BARE); if (!checkout_file_hardlink (current_repo, + checksum, options, loose_path_buf, destination_dfd, destination_name, @@ -652,7 +672,7 @@ checkout_one_file_at (OstreeRepo *repo, } g_mutex_unlock (&repo->cache_lock); - if (!checkout_file_hardlink (repo, options, loose_path_buf, + if (!checkout_file_hardlink (repo, checksum, options, loose_path_buf, destination_dfd, destination_name, FALSE, &hardlink_res, cancellable, error)) diff --git a/tests/basic-test.sh b/tests/basic-test.sh index 3abefd10..9c22fe34 100644 --- a/tests/basic-test.sh +++ b/tests/basic-test.sh @@ -546,6 +546,12 @@ for x in $(seq 3); do assert_file_has_content union-identical-test/usr/share/licenses/${v} GPL done done +# now checkout the first pkg in force copy mode to make sure we can checksum +rm union-identical-test -rf +$OSTREE checkout --force-copy union-identical-pkg1 union-identical-test +for x in 2 3; do + $OSTREE checkout ${CHECKOUT_H_ARGS} --union-identical union-identical-pkg${x} union-identical-test +done echo "ok checkout union identical merges" # Make conflicting packages, one with regfile, one with symlink From a4723dafed722008ed1ee3c952b7ff8e3d9b9a45 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Mon, 16 Oct 2017 12:51:04 +0100 Subject: [PATCH 41/98] Cope with xattr syscalls raising EOPNOTSUPP ENOTSUP and EOPNOTSUPP are numerically equal on most Linux ports, but inexplicably differ on PA-RISC (hppa) and possibly other rare architectures. Signed-off-by: Simon McVittie Closes: #1275 Approved by: cgwalters --- src/ostree/ot-builtin-create-usb.c | 2 +- tests/libostreetest.c | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/ostree/ot-builtin-create-usb.c b/src/ostree/ot-builtin-create-usb.c index 2812f348..97b0059a 100644 --- a/src/ostree/ot-builtin-create-usb.c +++ b/src/ostree/ot-builtin-create-usb.c @@ -113,7 +113,7 @@ ostree_builtin_create_usb (int argc, OstreeRepoMode mode = OSTREE_REPO_MODE_BARE_USER; if (TEMP_FAILURE_RETRY (fgetxattr (mount_root_dfd, "user.test", NULL, 0)) < 0 && - errno == ENOTSUP) + (errno == ENOTSUP || errno == EOPNOTSUPP)) mode = OSTREE_REPO_MODE_ARCHIVE; g_debug ("%s: Creating repository in mode %u", G_STRFUNC, mode); diff --git a/tests/libostreetest.c b/tests/libostreetest.c index 496ff740..11949c98 100644 --- a/tests/libostreetest.c +++ b/tests/libostreetest.c @@ -85,8 +85,10 @@ ot_check_relabeling (gboolean *can_relabel, g_autoptr(GBytes) bytes = glnx_fgetxattr_bytes (tmpf.fd, "security.selinux", &local_error); if (!bytes) { - /* libglnx preserves errno */ - if (G_IN_SET (errno, ENOTSUP, ENODATA)) + /* libglnx preserves errno. The EOPNOTSUPP case can't be part of a + * 'case' statement because on most but not all architectures, + * it's numerically equal to ENOTSUP. */ + if (G_IN_SET (errno, ENOTSUP, ENODATA) || errno == EOPNOTSUPP) { *can_relabel = FALSE; return TRUE; @@ -99,7 +101,7 @@ ot_check_relabeling (gboolean *can_relabel, const guint8 *data = g_bytes_get_data (bytes, &data_len); if (fsetxattr (tmpf.fd, "security.selinux", data, data_len, 0) < 0) { - if (errno == ENOTSUP) + if (errno == ENOTSUP || errno == EOPNOTSUPP) { *can_relabel = FALSE; return TRUE; @@ -122,7 +124,7 @@ ot_check_user_xattrs (gboolean *has_user_xattrs, if (fsetxattr (tmpf.fd, "user.test", "novalue", strlen ("novalue"), 0) < 0) { - if (errno == ENOTSUP) + if (errno == ENOTSUP || errno == EOPNOTSUPP) { *has_user_xattrs = FALSE; return TRUE; From e1357de27563b875f385e32981d698f7eac687cd Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Tue, 3 Oct 2017 21:26:50 +0100 Subject: [PATCH 42/98] Make sure *.am.inc are up to date before `make dist` v2017.12 didn't include test-libglnx-shutil.c, but if you re-run autogen.sh (as we do in Debian, to update the Autotools build system) it will try to build it. Signed-off-by: Simon McVittie Closes: #1274 Approved by: cgwalters --- Makefile.am | 11 +++++++++++ autogen.sh | 3 ++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index b542d3c1..48d0830f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -90,13 +90,24 @@ endif # end ENABLE_RUST libglnx_srcpath := $(srcdir)/libglnx libglnx_cflags := $(OT_DEP_GIO_UNIX_CFLAGS) "-I$(libglnx_srcpath)" libglnx_libs := $(OT_DEP_GIO_UNIX_LIBS) +# See also autogen.sh and https://github.com/ostreedev/ostree/pull/1274/ +# +# v2017.12 didn't include test-libglnx-shutil.c, but if you re-run +# autogen.sh (as we do in Debian, to update the Autotools build system) +# it will try to build it. +$(srcdir)/libglnx/Makefile-libglnx.am.inc: $(srcdir)/libglnx/Makefile-libglnx.am + sed -e 's,$(libglnx_srcpath),libglnx,g' < $< > $@ include libglnx/Makefile-libglnx.am.inc EXTRA_DIST += libglnx/Makefile-libglnx.am noinst_LTLIBRARIES += libglnx.la libbsdiff_srcpath := $(srcdir)/bsdiff + libbsdiff_cflags := $(OT_DEP_GIO_UNIX_CFLAGS) "-I$(bsdiff_srcpath)" libbsdiff_libs := $(OT_DEP_GIO_UNIX_LIBS) +# See the comment for the similar libglnx bit above +$(srcdir)/bsdiff/Makefile-bsdiff.am.inc: $(srcdir)/bsdiff/Makefile-bsdiff.am.inc + sed -e 's,$(libbsdiff_srcpath),bsdiff,g' < $< > $@ include bsdiff/Makefile-bsdiff.am.inc EXTRA_DIST += bsdiff/Makefile-bsdiff.am noinst_LTLIBRARIES += libbsdiff.la diff --git a/autogen.sh b/autogen.sh index 17f6abf4..689bba8f 100755 --- a/autogen.sh +++ b/autogen.sh @@ -31,7 +31,8 @@ fi if ! test -f libglnx/README.md || ! test -f bsdiff/README.md; then git submodule update --init fi -# Workaround automake bug with subdir-objects and computed paths +# Workaround automake bug with subdir-objects and computed paths; if +# changing this, please also change Makefile.am. sed -e 's,$(libglnx_srcpath),libglnx,g' < libglnx/Makefile-libglnx.am >libglnx/Makefile-libglnx.am.inc sed -e 's,$(libbsdiff_srcpath),bsdiff,g' < bsdiff/Makefile-bsdiff.am >bsdiff/Makefile-bsdiff.am.inc From 22029d71c977674cfc1baebdbd9b769840a1b68c Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Fri, 13 Oct 2017 15:22:10 -0400 Subject: [PATCH 43/98] lib/pull: Drop duplicate/different error for GPG but no detached meta Prep for a later patch to do GPG verification before writing commit objects; `_ostree_repo_gpg_verify_with_metadata()` already handles this, and so dropping this gives us consistent error messages. Closes: #1269 Approved by: jlebon --- src/libostree/ostree-repo-pull.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/libostree/ostree-repo-pull.c b/src/libostree/ostree-repo-pull.c index ab69519c..faea1a2f 100644 --- a/src/libostree/ostree-repo-pull.c +++ b/src/libostree/ostree-repo-pull.c @@ -1363,14 +1363,6 @@ gpg_verify_unwritten_commit (OtPullData *pull_data, g_autoptr(OstreeGpgVerifyResult) result = NULL; g_autoptr(GBytes) signed_data = g_variant_get_data_as_bytes (commit); - if (!detached_metadata) - { - g_set_error (error, OSTREE_GPG_ERROR, OSTREE_GPG_ERROR_NO_SIGNATURE, - "Commit %s: no detached metadata found for GPG verification", - checksum); - return FALSE; - } - result = _ostree_repo_gpg_verify_with_metadata (pull_data->repo, signed_data, detached_metadata, From 1c108d1b68fd8792e799c5d7b139223178924f98 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Fri, 13 Oct 2017 14:51:34 -0400 Subject: [PATCH 44/98] lib/pull: Also do commit GPG verification before writing I was working on a patch to do build on the work done to import content objects async to do the same for metadata, but right now we basically rely on writing them first to do the GPG verification when scanning. Things will be cleaner for that if we can pass the commit object directly into `scan_commit_object()` and consistently use `gpg_verify_unwritten_commit()`. We're careful here to continue to do it both ways (but at most one time), to account for the case where a bad commit has been pulled and written - we need to keep failing GPG verification there. Closes: #1269 Approved by: jlebon --- src/libostree/ostree-repo-pull.c | 96 ++++++++++++++++++++++++++------ 1 file changed, 79 insertions(+), 17 deletions(-) diff --git a/src/libostree/ostree-repo-pull.c b/src/libostree/ostree-repo-pull.c index faea1a2f..bcfd15d5 100644 --- a/src/libostree/ostree-repo-pull.c +++ b/src/libostree/ostree-repo-pull.c @@ -105,11 +105,12 @@ typedef struct { GVariant *summary; GHashTable *summary_deltas_checksums; GHashTable *ref_original_commits; /* Maps checksum to commit, used by timestamp checks */ + GHashTable *gpg_verified_commits; /* Set of commits that have been verified */ GPtrArray *static_delta_superblocks; GHashTable *expected_commit_sizes; /* Maps commit checksum to known size */ GHashTable *commit_to_depth; /* Maps commit checksum maximum depth */ GHashTable *scanned_metadata; /* Maps object name to itself */ - GHashTable *fetched_detached_metadata; /* Set */ + GHashTable *fetched_detached_metadata; /* Map */ GHashTable *requested_metadata; /* Maps object name to itself */ GHashTable *requested_content; /* Maps checksum to itself */ GHashTable *requested_fallback_content; /* Maps checksum to itself */ @@ -192,6 +193,13 @@ typedef struct { OstreeCollectionRef *requested_ref; /* (nullable) */ } ScanObjectQueueData; +static void +variant_or_null_unref (gpointer data) +{ + if (data) + g_variant_unref (data); +} + static void start_fetch (OtPullData *pull_data, FetchObjectData *fetch); static void start_fetch_deltapart (OtPullData *pull_data, FetchStaticDeltaData *fetch); @@ -219,6 +227,14 @@ static gboolean scan_one_metadata_object (OtPullData *pull_data, GCancellable *cancellable, GError **error); static void scan_object_queue_data_free (ScanObjectQueueData *scan_data); +static gboolean +gpg_verify_unwritten_commit (OtPullData *pull_data, + const char *checksum, + GVariant *commit, + GVariant *detached_metadata, + GCancellable *cancellable, + GError **error); + static gboolean update_progress (gpointer user_data) @@ -1170,7 +1186,7 @@ meta_fetch_on_complete (GObject *object, /* Now that we've at least tried to fetch it, we can proceed to * scan/fetch the commit object */ - g_hash_table_add (pull_data->fetched_detached_metadata, g_strdup (checksum)); + g_hash_table_insert (pull_data->fetched_detached_metadata, g_strdup (checksum), NULL); if (!fetch_data->object_is_stored) enqueue_one_object_request (pull_data, checksum, objtype, fetch_data->path, FALSE, FALSE, fetch_data->requested_ref); @@ -1212,7 +1228,7 @@ meta_fetch_on_complete (GObject *object, pull_data->cancellable, error)) goto out; - g_hash_table_add (pull_data->fetched_detached_metadata, g_strdup (checksum)); + g_hash_table_insert (pull_data->fetched_detached_metadata, g_strdup (checksum), g_steal_pointer (&metadata)); if (!fetch_data->object_is_stored) enqueue_one_object_request (pull_data, checksum, objtype, fetch_data->path, FALSE, FALSE, fetch_data->requested_ref); @@ -1225,9 +1241,41 @@ meta_fetch_on_complete (GObject *object, FALSE, &metadata, error)) goto out; - /* Write the commitpartial file now while we're still fetching data */ + /* For commit objects, compute the hash and check the GPG signature before + * writing to the repo, and also write the .commitpartial to say that + * we're still processing this commit. + */ if (objtype == OSTREE_OBJECT_TYPE_COMMIT) { + /* Verify checksum */ + OtChecksum hasher = { 0, }; + ot_checksum_init (&hasher); + { g_autoptr(GBytes) bytes = g_variant_get_data_as_bytes (metadata); + ot_checksum_update_bytes (&hasher, bytes); + } + char hexdigest[OSTREE_SHA256_STRING_LEN+1]; + ot_checksum_get_hexdigest (&hasher, hexdigest, sizeof (hexdigest)); + + if (strcmp (checksum, hexdigest) != 0) + { + (void) glnx_throw (error, "Corrupted %s object %s (actual checksum is %s)", + ostree_object_type_to_string (objtype), + checksum, hexdigest); + goto out; + } + + /* Do GPG verification. `detached_data` may be NULL if no detached + * metadata was found during pull; that's handled by + * gpg_verify_unwritten_commit(). If we ever change the pull code to + * not always fetch detached metadata, this bit will have to learn how + * to look up from the disk state as well, or insert the on-disk + * metadata into this hash. + */ + GVariant *detached_data = g_hash_table_lookup (pull_data->fetched_detached_metadata, checksum); + if (!gpg_verify_unwritten_commit (pull_data, checksum, metadata, detached_data, + pull_data->cancellable, error)) + goto out; + if (!write_commitpartial_for (pull_data, checksum, error)) goto out; } @@ -1347,6 +1395,14 @@ process_verify_result (OtPullData *pull_data, if (!ostree_gpg_verify_result_require_valid_signature (result, error)) return FALSE; + + /* We now check both *before* writing the commit, and after. Because the + * behavior used to be only verifiying after writing, we need to handle + * the case of "written but not verified". But we also don't want to check + * twice, as that'd result in duplicate signals. + */ + g_hash_table_add (pull_data->gpg_verified_commits, g_strdup (checksum)); + return TRUE; } @@ -1360,16 +1416,15 @@ gpg_verify_unwritten_commit (OtPullData *pull_data, { if (pull_data->gpg_verify) { - g_autoptr(OstreeGpgVerifyResult) result = NULL; - g_autoptr(GBytes) signed_data = g_variant_get_data_as_bytes (commit); + /* Shouldn't happen, but see comment in process_verify_result() */ + if (g_hash_table_contains (pull_data->gpg_verified_commits, checksum)) + return TRUE; - result = _ostree_repo_gpg_verify_with_metadata (pull_data->repo, - signed_data, - detached_metadata, - pull_data->remote_name, - NULL, NULL, - cancellable, - error); + g_autoptr(GBytes) signed_data = g_variant_get_data_as_bytes (commit); + g_autoptr(OstreeGpgVerifyResult) result = + _ostree_repo_gpg_verify_with_metadata (pull_data->repo, signed_data, + detached_metadata, pull_data->remote_name, + NULL, NULL, cancellable, error); if (!process_verify_result (pull_data, checksum, result, error)) return FALSE; } @@ -1548,7 +1603,11 @@ scan_commit_object (OtPullData *pull_data, GINT_TO_POINTER (depth)); } - if (pull_data->gpg_verify) + /* See comment in process_verify_result() - we now gpg check before writing, + * but also ensure we've done it here if not already. + */ + if (pull_data->gpg_verify && + !g_hash_table_contains (pull_data->gpg_verified_commits, checksum)) { g_autoptr(OstreeGpgVerifyResult) result = NULL; @@ -1761,7 +1820,7 @@ scan_one_metadata_object (OtPullData *pull_data, * add it to the hash to avoid re-fetching it below. */ if (objtype == OSTREE_OBJECT_TYPE_COMMIT) - g_hash_table_add (pull_data->fetched_detached_metadata, g_strdup (checksum)); + g_hash_table_insert (pull_data->fetched_detached_metadata, g_strdup (checksum), NULL); pull_data->n_imported_metadata++; is_stored = TRUE; is_requested = TRUE; @@ -1791,7 +1850,7 @@ scan_one_metadata_object (OtPullData *pull_data, return FALSE; /* See comment above */ if (objtype == OSTREE_OBJECT_TYPE_COMMIT) - g_hash_table_add (pull_data->fetched_detached_metadata, g_strdup (checksum)); + g_hash_table_insert (pull_data->fetched_detached_metadata, g_strdup (checksum), NULL); is_stored = TRUE; is_requested = TRUE; pull_data->n_imported_metadata++; @@ -3269,10 +3328,12 @@ ostree_repo_pull_with_options (OstreeRepo *self, pull_data->ref_original_commits = g_hash_table_new_full (ostree_collection_ref_hash, ostree_collection_ref_equal, (GDestroyNotify)NULL, (GDestroyNotify)g_variant_unref); + pull_data->gpg_verified_commits = g_hash_table_new_full (g_str_hash, g_str_equal, + (GDestroyNotify)g_free, NULL); pull_data->scanned_metadata = g_hash_table_new_full (ostree_hash_object_name, g_variant_equal, (GDestroyNotify)g_variant_unref, NULL); pull_data->fetched_detached_metadata = g_hash_table_new_full (g_str_hash, g_str_equal, - (GDestroyNotify)g_free, NULL); + (GDestroyNotify)g_free, (GDestroyNotify)variant_or_null_unref); pull_data->requested_content = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify)g_free, NULL); pull_data->requested_fallback_content = g_hash_table_new_full (g_str_hash, g_str_equal, @@ -4232,6 +4293,7 @@ ostree_repo_pull_with_options (OstreeRepo *self, g_clear_pointer (&pull_data->fetched_detached_metadata, (GDestroyNotify) g_hash_table_unref); g_clear_pointer (&pull_data->summary_deltas_checksums, (GDestroyNotify) g_hash_table_unref); g_clear_pointer (&pull_data->ref_original_commits, (GDestroyNotify) g_hash_table_unref); + g_clear_pointer (&pull_data->gpg_verified_commits, (GDestroyNotify) g_hash_table_unref); g_clear_pointer (&pull_data->requested_content, (GDestroyNotify) g_hash_table_unref); g_clear_pointer (&pull_data->requested_fallback_content, (GDestroyNotify) g_hash_table_unref); g_clear_pointer (&pull_data->requested_metadata, (GDestroyNotify) g_hash_table_unref); From 9b3e01be301fbad2d1b9611c4eaa83f675f0c04b Mon Sep 17 00:00:00 2001 From: Dan Nicholson Date: Mon, 16 Oct 2017 16:24:16 +0000 Subject: [PATCH 45/98] build: Fix bsdiff Makefile circular dependency The intended use was to have the .am.inc generated from the .am like the libglnx one. Without this, make was detecting a circular dependency and dropping the rule: make: Circular bsdiff/Makefile-bsdiff.am.inc <- bsdiff/Makefile-bsdiff.am.inc dependency dropped. Closes: #1276 Approved by: jlebon --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index 48d0830f..7f913ab5 100644 --- a/Makefile.am +++ b/Makefile.am @@ -106,7 +106,7 @@ libbsdiff_srcpath := $(srcdir)/bsdiff libbsdiff_cflags := $(OT_DEP_GIO_UNIX_CFLAGS) "-I$(bsdiff_srcpath)" libbsdiff_libs := $(OT_DEP_GIO_UNIX_LIBS) # See the comment for the similar libglnx bit above -$(srcdir)/bsdiff/Makefile-bsdiff.am.inc: $(srcdir)/bsdiff/Makefile-bsdiff.am.inc +$(srcdir)/bsdiff/Makefile-bsdiff.am.inc: $(srcdir)/bsdiff/Makefile-bsdiff.am sed -e 's,$(libbsdiff_srcpath),bsdiff,g' < $< > $@ include bsdiff/Makefile-bsdiff.am.inc EXTRA_DIST += bsdiff/Makefile-bsdiff.am From 729790bedc1aaad7ea29ea6010bf39eb8c3943ba Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Sat, 14 Oct 2017 10:17:02 -0400 Subject: [PATCH 46/98] tests/basic: Add missing ${COMMIT_ARGS} for bare-user-only I was working on "adopt" and hit corruption; turns out we were missing the `--canonical-permissions` arg in this existing test. (Need to abstract all of this more) Closes: #1272 Approved by: jlebon --- tests/basic-test.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/basic-test.sh b/tests/basic-test.sh index 9c22fe34..57269314 100644 --- a/tests/basic-test.sh +++ b/tests/basic-test.sh @@ -181,8 +181,9 @@ cd ${test_tmpdir} rm checkout-test2-l -rf $OSTREE checkout ${CHECKOUT_H_ARGS} test2 $test_tmpdir/checkout-test2-l date > $test_tmpdir/checkout-test2-l/newdatefile.txt -$OSTREE commit --link-checkout-speedup --consume -b test2 --tree=dir=$test_tmpdir/checkout-test2-l +$OSTREE commit ${COMMIT_ARGS} --link-checkout-speedup --consume -b test2 --tree=dir=$test_tmpdir/checkout-test2-l assert_not_has_dir $test_tmpdir/checkout-test2-l +$OSTREE fsck # Some of the later tests are sensitive to state $OSTREE reset test2 test2^ echo "ok consume (nom nom nom)" From 16c31a9b580c91ca670c3cdd7143e106ec842ea7 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Fri, 13 Oct 2017 22:17:56 -0400 Subject: [PATCH 47/98] lib/commit: Implement "adoption" with CONSUME flag For checkouts that are on the same device, for regular files we can simply "adopt" existing files. This is useful in the "build from subtrees" pattern that happens with e.g. `rpm-ostree install` as well as flatpak and gnome-continuous. New files are things like an updated `ldconfig` cache, etc. And particularly for `rpm-ostree` we always regenerate the rpmdb, which for e.g. this workstation is `61MB`. We probably should have done this from the start, and instead had a `--copy` flag to commit, but obviously we have to be backwards compatible. There's more to do here - the biggest gap is probably for `bare-user` repos, which are often used with things like `rpm-ostree compose tree` for host systems. But we can do that later. Closes: #1272 Approved by: jlebon --- src/libostree/ostree-repo-commit.c | 224 +++++++++++++++++++++++++---- tests/basic-test.sh | 28 +++- 2 files changed, 222 insertions(+), 30 deletions(-) diff --git a/src/libostree/ostree-repo-commit.c b/src/libostree/ostree-repo-commit.c index 71aa120f..2bcf6ed7 100644 --- a/src/libostree/ostree-repo-commit.c +++ b/src/libostree/ostree-repo-commit.c @@ -38,6 +38,18 @@ #include "ostree-checksum-input-stream.h" #include "ostree-varint.h" +/* In most cases, we write into a staging dir for commit, but we also allow + * direct writes into objects/ for e.g. hardlink imports. + */ +static int +commit_dest_dfd (OstreeRepo *self) +{ + if (self->in_transaction) + return self->commit_stagedir.fd; + else + return self->objects_dir_fd; +} + /* The objects/ directory has a two-character directory prefix for checksums * to avoid putting lots of files in a single directory. This technique * is quite old, but Git also uses it for example. @@ -143,12 +155,7 @@ _ostree_repo_commit_tmpf_final (OstreeRepo *self, char tmpbuf[_OSTREE_LOOSE_PATH_MAX]; _ostree_loose_path (tmpbuf, checksum, objtype, self->mode); - int dest_dfd; - if (self->in_transaction) - dest_dfd = self->commit_stagedir.fd; - else - dest_dfd = self->objects_dir_fd; - + int dest_dfd = commit_dest_dfd (self); if (!_ostree_repo_ensure_loose_objdir_at (dest_dfd, tmpbuf, cancellable, error)) return FALSE; @@ -176,12 +183,7 @@ commit_path_final (OstreeRepo *self, char tmpbuf[_OSTREE_LOOSE_PATH_MAX]; _ostree_loose_path (tmpbuf, checksum, objtype, self->mode); - int dest_dfd; - if (self->in_transaction) - dest_dfd = self->commit_stagedir.fd; - else - dest_dfd = self->objects_dir_fd; - + int dest_dfd = commit_dest_dfd (self); if (!_ostree_repo_ensure_loose_objdir_at (dest_dfd, tmpbuf, cancellable, error)) return FALSE; @@ -788,6 +790,113 @@ write_content_object (OstreeRepo *self, return TRUE; } +/* A fast path for local commits to `bare` or `bare-user-only` + * repos - we basically checksum the file and do a renameat() + * into place. + * + * This could be enhanced down the line to handle cases where we have a modified + * stat struct in place; e.g. for `bare` we could do the `chown`, or chmod etc., + * and reset the xattrs. + * + * We could also do this for bare-user, would just involve adding the xattr (and + * potentially deleting other ones...not sure if we'd really want e.g. the + * security.selinux xattr on setuid binaries and the like to live on). + */ +static gboolean +adopt_and_commit_regfile (OstreeRepo *self, + int dfd, + const char *name, + GFileInfo *finfo, + GVariant *xattrs, + char *out_checksum_buf, + GCancellable *cancellable, + GError **error) +{ + g_assert (G_IN_SET (self->mode, OSTREE_REPO_MODE_BARE, OSTREE_REPO_MODE_BARE_USER_ONLY)); + g_autoptr(GBytes) header = _ostree_file_header_new (finfo, xattrs); + + g_auto(OtChecksum) hasher = { 0, }; + ot_checksum_init (&hasher); + ot_checksum_update_bytes (&hasher, header); + + glnx_fd_close int fd = -1; + if (!glnx_openat_rdonly (dfd, name, FALSE, &fd, error)) + return FALSE; + + (void)posix_fadvise (fd, 0, 0, POSIX_FADV_SEQUENTIAL); + + /* See also https://gist.github.com/cgwalters/0df0d15199009664549618c2188581f0 + * and https://github.com/coreutils/coreutils/blob/master/src/ioblksize.h + * Turns out bigger block size is better; down the line we should use their + * same heuristics. + */ + char buf[16*1024]; + while (TRUE) + { + ssize_t bytes_read = read (fd, buf, sizeof (buf)); + if (bytes_read < 0) + return glnx_throw_errno_prefix (error, "read"); + if (bytes_read == 0) + break; + + ot_checksum_update (&hasher, (guint8*)buf, bytes_read); + } + + ot_checksum_get_hexdigest (&hasher, out_checksum_buf, OSTREE_SHA256_STRING_LEN+1); + const char *checksum = out_checksum_buf; + + /* TODO: dedup this with commit_path_final() */ + char loose_path[_OSTREE_LOOSE_PATH_MAX]; + _ostree_loose_path (loose_path, checksum, OSTREE_OBJECT_TYPE_FILE, self->mode); + + const guint32 src_dev = g_file_info_get_attribute_uint32 (finfo, "unix::device"); + const guint64 src_inode = g_file_info_get_attribute_uint64 (finfo, "unix::inode"); + + int dest_dfd = commit_dest_dfd (self); + if (!_ostree_repo_ensure_loose_objdir_at (dest_dfd, loose_path, + cancellable, error)) + return FALSE; + + struct stat dest_stbuf; + if (!glnx_fstatat_allow_noent (dest_dfd, loose_path, &dest_stbuf, AT_SYMLINK_NOFOLLOW, error)) + return FALSE; + /* Is the source actually the same device/inode? This can happen with hardlink + * checkouts, which is a bit overly conservative for bare-user-only right now. + * If so, we can't use renameat() since from `man 2 renameat`: + * + * "If oldpath and newpath are existing hard links referring to the same file, + * then rename() does nothing, and returns a success status." + */ + if (errno != ENOENT + && src_dev == dest_stbuf.st_dev + && src_inode == dest_stbuf.st_ino) + { + if (!glnx_unlinkat (dfd, name, 0, error)) + return FALSE; + + /* Early return */ + return TRUE; + } + + /* For bare-user-only we need to canonicalize perms */ + if (self->mode == OSTREE_REPO_MODE_BARE_USER_ONLY) + { + const guint32 src_mode = g_file_info_get_attribute_uint32 (finfo, "unix::mode"); + if (fchmod (fd, src_mode & 0755) < 0) + return glnx_throw_errno_prefix (error, "fchmod"); + } + if (renameat (dfd, name, dest_dfd, loose_path) == -1) + { + if (errno != EEXIST) + return glnx_throw_errno_prefix (error, "Storing file '%s'", name); + /* We took ownership here, so delete it */ + if (!glnx_unlinkat (dfd, name, 0, error)) + return FALSE; + } + + return TRUE; +} + /* Main driver for writing a metadata (non-content) object. */ static gboolean write_metadata_object (OstreeRepo *self, @@ -2568,6 +2677,11 @@ write_dfd_iter_to_mtree_internal (OstreeRepo *self, GCancellable *cancellable, GError **error); +typedef enum { + WRITE_DIR_CONTENT_FLAGS_NONE = 0, + WRITE_DIR_CONTENT_FLAGS_CAN_ADOPT = 1, +} WriteDirContentFlags; + /* Given either a dir_enum or a dfd_iter, writes the directory entry to the mtree. For * subdirs, we go back through either write_dfd_iter_to_mtree_internal (dfd_iter case) or * write_directory_to_mtree_internal (dir_enum case) which will do the actual dirmeta + @@ -2577,6 +2691,7 @@ write_directory_content_to_mtree_internal (OstreeRepo *self, OstreeRepoFile *repo_dir, GFileEnumerator *dir_enum, GLnxDirFdIterator *dfd_iter, + WriteDirContentFlags writeflags, GFileInfo *child_info, OstreeMutableTree *mtree, OstreeRepoCommitModifier *modifier, @@ -2602,6 +2717,8 @@ write_directory_content_to_mtree_internal (OstreeRepo *self, */ const gboolean delete_after_commit = dfd_iter && modifier && (modifier->flags & OSTREE_REPO_COMMIT_MODIFIER_FLAGS_CONSUME); + const gboolean canonical_permissions = modifier && + (modifier->flags & OSTREE_REPO_COMMIT_MODIFIER_FLAGS_CANONICAL_PERMISSIONS); if (filter_result != OSTREE_REPO_COMMIT_FILTER_ALLOW) { @@ -2677,8 +2794,6 @@ write_directory_content_to_mtree_internal (OstreeRepo *self, guint64 file_obj_length; g_autoptr(GInputStream) file_input = NULL; g_autoptr(GInputStream) file_object_input = NULL; - g_autofree guchar *child_file_csum = NULL; - g_autofree char *tmp_checksum = NULL; g_autoptr(GVariant) xattrs = NULL; gboolean xattrs_were_modified; @@ -2688,22 +2803,63 @@ write_directory_content_to_mtree_internal (OstreeRepo *self, return FALSE; /* only check the devino cache if the file info & xattrs were not modified */ + const gboolean modified_file_meta = child_info_was_modified || xattrs_were_modified; const char *loose_checksum = NULL; - if (!child_info_was_modified && !xattrs_were_modified) + if (!modified_file_meta) { guint32 dev = g_file_info_get_attribute_uint32 (child_info, "unix::device"); guint64 inode = g_file_info_get_attribute_uint64 (child_info, "unix::inode"); loose_checksum = devino_cache_lookup (self, modifier, dev, inode); } + /* A big prerequisite list of conditions for whether or not we can + * "adopt", i.e. just checksum and rename() into place + */ + const gboolean can_adopt_basic = + file_type == G_FILE_TYPE_REGULAR + && dfd_iter != NULL + && delete_after_commit + && (writeflags | WRITE_DIR_CONTENT_FLAGS_CAN_ADOPT) > 0; + gboolean can_adopt = can_adopt_basic; + /* If basic prerquisites are met, check repo mode specific ones */ + if (can_adopt) + { + /* For bare repos, we could actually chown/reset the xattrs, but let's + * do the basic optimizations here first. + */ + if (self->mode == OSTREE_REPO_MODE_BARE) + can_adopt = !modified_file_meta; + else if (self->mode == OSTREE_REPO_MODE_BARE_USER_ONLY) + can_adopt = canonical_permissions; + else + /* This covers bare-user and archive. See comments in adopt_and_commit_regfile() + * for notes on adding bare-user later here. + */ + can_adopt = FALSE; + } + gboolean did_adopt = FALSE; + + /* The very fast path - we have a devino cache hit, nothing to write */ if (loose_checksum) { if (!ostree_mutable_tree_replace_file (mtree, name, loose_checksum, error)) return FALSE; } + /* Next fast path - we can "adopt" the file */ + else if (can_adopt) + { + char checksum[OSTREE_SHA256_STRING_LEN+1]; + if (!adopt_and_commit_regfile (self, dfd_iter->fd, name, modified_info, xattrs, + checksum, cancellable, error)) + return FALSE; + if (!ostree_mutable_tree_replace_file (mtree, name, checksum, error)) + return FALSE; + did_adopt = TRUE; + } else { + /* Generic path - convert to object stream, commit that */ if (g_file_info_get_file_type (modified_info) == G_FILE_TYPE_REGULAR) { if (dir_enum != NULL) @@ -2722,23 +2878,27 @@ write_directory_content_to_mtree_internal (OstreeRepo *self, } } - if (!ostree_raw_file_to_content_stream (file_input, - modified_info, xattrs, - &file_object_input, &file_obj_length, - cancellable, error)) - return FALSE; - if (!ostree_repo_write_content (self, NULL, file_object_input, file_obj_length, + if (!ostree_raw_file_to_content_stream (file_input, + modified_info, xattrs, + &file_object_input, &file_obj_length, + cancellable, error)) + return FALSE; + g_autofree guchar *child_file_csum = NULL; + if (!ostree_repo_write_content (self, NULL, file_object_input, file_obj_length, &child_file_csum, cancellable, error)) - return FALSE; + return FALSE; - g_free (tmp_checksum); - tmp_checksum = ostree_checksum_from_bytes (child_file_csum); - if (!ostree_mutable_tree_replace_file (mtree, name, tmp_checksum, - error)) - return FALSE; + char tmp_checksum[OSTREE_SHA256_STRING_LEN+1]; + ostree_checksum_inplace_from_bytes (child_file_csum, tmp_checksum); + if (!ostree_mutable_tree_replace_file (mtree, name, tmp_checksum, + error)) + return FALSE; } - if (delete_after_commit) + /* Process delete_after_commit. In the adoption case though, we already + * took ownership of the file above, usually via a renameat(). + */ + if (delete_after_commit && !did_adopt) { if (!glnx_unlinkat (dfd_iter->fd, name, 0, error)) return FALSE; @@ -2837,6 +2997,7 @@ write_directory_to_mtree_internal (OstreeRepo *self, break; if (!write_directory_content_to_mtree_internal (self, repo_dir, dir_enum, NULL, + WRITE_DIR_CONTENT_FLAGS_NONE, child_info, mtree, modifier, path, cancellable, error)) @@ -2905,6 +3066,11 @@ write_dfd_iter_to_mtree_internal (OstreeRepo *self, return TRUE; } + /* See if this dir is on the same device; if so we can adopt (if enabled) */ + WriteDirContentFlags flags = 0; + if (dir_stbuf.st_dev == self->device) + flags |= WRITE_DIR_CONTENT_FLAGS_CAN_ADOPT; + while (TRUE) { struct dirent *dent; @@ -2937,7 +3103,7 @@ write_dfd_iter_to_mtree_internal (OstreeRepo *self, } if (!write_directory_content_to_mtree_internal (self, NULL, NULL, src_dfd_iter, - child_info, + flags, child_info, mtree, modifier, path, cancellable, error)) return FALSE; diff --git a/tests/basic-test.sh b/tests/basic-test.sh index 57269314..decaf603 100644 --- a/tests/basic-test.sh +++ b/tests/basic-test.sh @@ -19,7 +19,7 @@ set -euo pipefail -echo "1..$((76 + ${extra_basic_tests:-0}))" +echo "1..$((77 + ${extra_basic_tests:-0}))" CHECKOUT_U_ARG="" CHECKOUT_H_ARGS="-H" @@ -186,8 +186,34 @@ assert_not_has_dir $test_tmpdir/checkout-test2-l $OSTREE fsck # Some of the later tests are sensitive to state $OSTREE reset test2 test2^ +$OSTREE prune --refs-only echo "ok consume (nom nom nom)" +# Test adopt +cd ${test_tmpdir} +rm checkout-test2-l -rf +$OSTREE checkout ${CHECKOUT_H_ARGS} test2 $test_tmpdir/checkout-test2-l +echo 'a file to consume 🍔' > $test_tmpdir/checkout-test2-l/eatme.txt +# Save a link to it for device/inode comparison +ln $test_tmpdir/checkout-test2-l/eatme.txt $test_tmpdir/eatme-savedlink.txt +$OSTREE commit ${COMMIT_ARGS} --link-checkout-speedup --consume -b test2 --tree=dir=$test_tmpdir/checkout-test2-l +$OSTREE fsck +# Adoption isn't implemented for bare-user yet +eatme_objpath=$(ostree_file_path_to_object_path repo test2 /eatme.txt) +if grep -q '^mode=bare$' repo/config || is_bare_user_only_repo repo; then + assert_files_hardlinked ${test_tmpdir}/eatme-savedlink.txt ${eatme_objpath} +else + if files_are_hardlinked ${test_tmpdir}/eatme-savedlink.txt ${eatme_objpath}; then + fatal "bare-user adopted?" + fi +fi +assert_not_has_dir $test_tmpdir/checkout-test2-l +# Some of the later tests are sensitive to state +$OSTREE reset test2 test2^ +$OSTREE prune --refs-only +rm -f ${test_tmpdir}/eatme-savedlink.txt +echo "ok adopt" + cd ${test_tmpdir} $OSTREE commit ${COMMIT_ARGS} -b test2-no-parent -s '' $test_tmpdir/checkout-test2-4 assert_streq $($OSTREE log test2-no-parent |grep '^commit' | wc -l) "1" From e744f2ad6f620c2d0a5d178cb6115625090ab3e4 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Mon, 16 Oct 2017 14:35:17 -0400 Subject: [PATCH 48/98] lib: Use a common helper function to compare checksums So we get a consistent error message; came up in a PR review. Closes: #1277 Approved by: jlebon --- src/libostree/ostree-core-private.h | 6 ++++++ src/libostree/ostree-core.c | 16 ++++++++++++++++ src/libostree/ostree-repo-commit.c | 19 +++++++++++-------- src/libostree/ostree-repo-pull.c | 18 ++++-------------- tests/test-pull-corruption.sh | 4 ++-- 5 files changed, 39 insertions(+), 24 deletions(-) diff --git a/src/libostree/ostree-core-private.h b/src/libostree/ostree-core-private.h index d8b93b29..22d725a0 100644 --- a/src/libostree/ostree-core-private.h +++ b/src/libostree/ostree-core-private.h @@ -141,6 +141,12 @@ _ostree_validate_bareuseronly_mode_finfo (GFileInfo *finfo, return _ostree_validate_bareuseronly_mode (content_mode, checksum, error); } +gboolean +_ostree_compare_object_checksum (OstreeObjectType objtype, + const char *expected, + const char *actual, + GError **error); + gboolean _ostree_parse_delta_name (const char *delta_name, char **out_from, diff --git a/src/libostree/ostree-core.c b/src/libostree/ostree-core.c index 542c54bf..50a2e4fa 100644 --- a/src/libostree/ostree-core.c +++ b/src/libostree/ostree-core.c @@ -1004,6 +1004,22 @@ ostree_checksum_file_async_finish (GFile *f, return TRUE; } +/* Common helper to compare checksums for an object, so we have a consistent + * error message. + */ +gboolean +_ostree_compare_object_checksum (OstreeObjectType objtype, + const char *expected, + const char *actual, + GError **error) +{ + if (!g_str_equal (expected, actual)) + return glnx_throw (error, "Corrupted %s object; checksum expected='%s' actual='%s'", + ostree_object_type_to_string (objtype), + expected, actual); + return TRUE; +} + /** * ostree_create_directory_metadata: * @dir_info: a #GFileInfo containing directory information diff --git a/src/libostree/ostree-repo-commit.c b/src/libostree/ostree-repo-commit.c index 2bcf6ed7..140ea34f 100644 --- a/src/libostree/ostree-repo-commit.c +++ b/src/libostree/ostree-repo-commit.c @@ -685,10 +685,12 @@ write_content_object (OstreeRepo *self, else { actual_checksum = actual_checksum_owned = ot_checksum_instream_get_string (checksum_input); - if (expected_checksum && strcmp (actual_checksum, expected_checksum) != 0) - return glnx_throw (error, "Corrupted %s object %s (actual checksum is %s)", - ostree_object_type_to_string (OSTREE_OBJECT_TYPE_FILE), - expected_checksum, actual_checksum); + if (expected_checksum) + { + if (!_ostree_compare_object_checksum (OSTREE_OBJECT_TYPE_FILE, expected_checksum, actual_checksum, + error)) + return FALSE; + } } g_assert (actual_checksum != NULL); /* Pacify static analysis */ @@ -954,10 +956,11 @@ write_metadata_object (OstreeRepo *self, return TRUE; } - if (expected_checksum && strcmp (actual_checksum, expected_checksum) != 0) - return glnx_throw (error, "Corrupted %s object %s (actual checksum is %s)", - ostree_object_type_to_string (objtype), - expected_checksum, actual_checksum); + if (expected_checksum) + { + if (!_ostree_compare_object_checksum (objtype, expected_checksum, actual_checksum, error)) + return FALSE; + } } /* Ok, checksum is known, let's get the data */ diff --git a/src/libostree/ostree-repo-pull.c b/src/libostree/ostree-repo-pull.c index bcfd15d5..2e9b0bd7 100644 --- a/src/libostree/ostree-repo-pull.c +++ b/src/libostree/ostree-repo-pull.c @@ -1005,13 +1005,8 @@ content_fetch_on_write_complete (GObject *object, checksum_obj = ostree_object_to_string (checksum, objtype); g_debug ("write of %s complete", checksum_obj); - if (strcmp (checksum, expected_checksum) != 0) - { - g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, - "Corrupted content object; checksum expected='%s' actual='%s'", - expected_checksum, checksum); - goto out; - } + if (!_ostree_compare_object_checksum (objtype, expected_checksum, checksum, error)) + goto out; pull_data->n_fetched_content++; /* Was this a delta fallback? */ @@ -1256,13 +1251,8 @@ meta_fetch_on_complete (GObject *object, char hexdigest[OSTREE_SHA256_STRING_LEN+1]; ot_checksum_get_hexdigest (&hasher, hexdigest, sizeof (hexdigest)); - if (strcmp (checksum, hexdigest) != 0) - { - (void) glnx_throw (error, "Corrupted %s object %s (actual checksum is %s)", - ostree_object_type_to_string (objtype), - checksum, hexdigest); - goto out; - } + if (!_ostree_compare_object_checksum (objtype, checksum, hexdigest, error)) + goto out; /* Do GPG verification. `detached_data` may be NULL if no detached * metadata was found during pull; that's handled by diff --git a/tests/test-pull-corruption.sh b/tests/test-pull-corruption.sh index 3696acc4..ea29a87c 100755 --- a/tests/test-pull-corruption.sh +++ b/tests/test-pull-corruption.sh @@ -89,7 +89,7 @@ if ! skip_one_without_user_xattrs; then if ${CMD_PREFIX} ostree --repo=repo pull-local --untrusted ostree-srv/gnomerepo main 2>err.txt; then assert_not_reached "pull-local --untrusted worked?" fi - assert_file_has_content err.txt "Corrupted commit object ${corruptrev}.*actual checksum is ${rev}" + assert_file_has_content_literal err.txt "Corrupted commit object; checksum expected='${corruptrev}' actual='${rev}'" rm repo err.txt -rf ostree_repo_init repo --mode=bare-user @@ -97,6 +97,6 @@ if ! skip_one_without_user_xattrs; then if ${CMD_PREFIX} ostree --repo=repo pull origin main 2>err.txt; then assert_not_reached "pull unexpectedly succeeded!" fi - assert_file_has_content err.txt "Corrupted commit object ${corruptrev}.*actual checksum is ${rev}" + assert_file_has_content_literal err.txt "Corrupted commit object; checksum expected='${corruptrev}' actual='${rev}'" echo "ok pull commit corruption" fi From 464965e6b4897f9c6d4487ca10eb5bc60ad9a670 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Mon, 16 Oct 2017 15:29:38 -0400 Subject: [PATCH 49/98] lib/sysroot: Fix error handling when mounting overlayfs fails This isn't perfect, but at least we fix an error-overwrite error, and in practice `ostree admin unlock` isn't wrapped by `rpm-ostree` yet, so spew to stderr is OK. Closes: https://github.com/ostreedev/ostree/issues/1273 Closes: #1279 Approved by: guyshapiro --- src/libostree/ostree-sysroot.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/libostree/ostree-sysroot.c b/src/libostree/ostree-sysroot.c index d320e220..ac418486 100644 --- a/src/libostree/ostree-sysroot.c +++ b/src/libostree/ostree-sysroot.c @@ -22,6 +22,7 @@ #include "otutil.h" #include #include +#include #include #include "ostree.h" @@ -1764,11 +1765,15 @@ ostree_sysroot_deployment_unlock (OstreeSysroot *self, return glnx_throw_errno_prefix (error, "fork"); else if (mount_child == 0) { - /* Child process. Do NOT use any GLib API here. */ + /* Child process. Do NOT use any GLib API here; it's not generally fork() safe. + * + * TODO: report errors across a pipe (or use the journal?) rather than + * spewing to stderr. + */ if (fchdir (deployment_dfd) < 0) - exit (EXIT_FAILURE); + err (1, "fchdir"); if (mount ("overlay", "/usr", "overlay", 0, ovl_options) < 0) - exit (EXIT_FAILURE); + err (1, "mount"); exit (EXIT_SUCCESS); } else @@ -1779,7 +1784,7 @@ ostree_sysroot_deployment_unlock (OstreeSysroot *self, if (TEMP_FAILURE_RETRY (waitpid (mount_child, &estatus, 0)) < 0) return glnx_throw_errno_prefix (error, "waitpid() on mount helper"); if (!g_spawn_check_exit_status (estatus, error)) - return glnx_throw_errno_prefix (error, "overlayfs mount helper"); + return glnx_prefix_error (error, "Failed overlayfs mount"); } } From 95afe2848d65a8062f4a76adb1ab80b6bcc4d79e Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Fri, 13 Oct 2017 18:14:17 -0400 Subject: [PATCH 50/98] tests: Add test-pull-bareuseronly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I was going to fix a bug in the static deltas code and I noticed we were missing `pull-test.sh` coverage for bareuseronly 🙈. Obviously fixing this requires duplicating some of the bits we have in `basic-test.sh`; need to hoist that into `libtest.sh`. For now though let's get the coverage. Closes: #1270 Approved by: jlebon --- Makefile-tests.am | 1 + tests/pull-test.sh | 69 ++++++++++++++++++++++----------- tests/test-pull-bareuseronly.sh | 28 +++++++++++++ 3 files changed, 75 insertions(+), 23 deletions(-) create mode 100755 tests/test-pull-bareuseronly.sh diff --git a/Makefile-tests.am b/Makefile-tests.am index 7cf2b19a..42e73fa0 100644 --- a/Makefile-tests.am +++ b/Makefile-tests.am @@ -69,6 +69,7 @@ _installed_or_uninstalled_test_scripts = \ tests/test-parent.sh \ tests/test-pull-bare.sh \ tests/test-pull-bareuser.sh \ + tests/test-pull-bareuseronly.sh \ tests/test-pull-commit-only.sh \ tests/test-pull-depth.sh \ tests/test-pull-mirror-summary.sh \ diff --git a/tests/pull-test.sh b/tests/pull-test.sh index 2afc0aca..b2613fc7 100644 --- a/tests/pull-test.sh +++ b/tests/pull-test.sh @@ -27,9 +27,26 @@ function repo_init() { ${CMD_PREFIX} ostree --repo=repo remote add origin $(cat httpd-address)/ostree/gnomerepo "$@" } +repo_init --no-gpg-verify + +# See also the copy of this in basic-test.sh +COMMIT_ARGS="" +CHECKOUT_U_ARG="" +CHECKOUT_H_ARGS="-H" +if is_bare_user_only_repo repo; then + COMMIT_ARGS="--canonical-permissions" + # Also, since we can't check out uid=0 files we need to check out in user mode + CHECKOUT_U_ARG="-U" + CHECKOUT_H_ARGS="-U -H" +else + if grep -E -q '^mode=bare-user' repo/config; then + CHECKOUT_H_ARGS="-U -H" + fi +fi + function verify_initial_contents() { rm checkout-origin-main -rf - $OSTREE checkout origin/main checkout-origin-main + $OSTREE checkout ${CHECKOUT_H_ARGS} origin/main checkout-origin-main cd checkout-origin-main assert_file_has_content firstfile '^first$' assert_file_has_content baz/cow '^moo$' @@ -61,7 +78,7 @@ echo "ok pull mirror" mkdir otherbranch echo someothercontent > otherbranch/someothercontent -${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo commit -b otherbranch --tree=dir=otherbranch +${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo commit ${COMMIT_ARGS} -b otherbranch --tree=dir=otherbranch ${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo summary -u rm mirrorrepo -rf # All refs @@ -88,9 +105,9 @@ echo "ok pull mirror (ref subset with summary)" cd ${test_tmpdir} rm checkout-origin-main -rf -$OSTREE --repo=ostree-srv/gnomerepo checkout main checkout-origin-main +$OSTREE --repo=ostree-srv/gnomerepo checkout ${CHECKOUT_U_ARG} main checkout-origin-main echo moomoo > checkout-origin-main/baz/cow -${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo commit -b main -s "" --tree=dir=checkout-origin-main +${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo commit ${COMMIT_ARGS} -b main -s "" --tree=dir=checkout-origin-main ${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo static-delta generate main ${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo summary -u ${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo fsck @@ -115,11 +132,12 @@ ${CMD_PREFIX} ostree --repo=mirrorrepo pull --bareuseronly-files origin main echo "ok pull (bareuseronly, safe)" rm checkout-origin-main -rf -$OSTREE --repo=ostree-srv/gnomerepo checkout main checkout-origin-main +$OSTREE --repo=ostree-srv/gnomerepo checkout ${CHECKOUT_U_ARG} main checkout-origin-main cat > statoverride.txt < checkout-origin-main/some-setuid +# Don't use ${COMMIT_ARGS} as we don't want --canonical-permissions with bare-user-only ${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo commit -b content-with-suid --statoverride=statoverride.txt --tree=dir=checkout-origin-main ${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo summary -u # Verify we reject it both when unpacking and when mirroring @@ -140,7 +158,8 @@ echo "ok pull (bareuseronly mirror)" # Corruption tests cd ${test_tmpdir} repo_init --no-gpg-verify -if ! is_bare_user_only_repo repo && ! skip_one_without_user_xattrs; then +if ! is_bare_user_only_repo repo; then +if ! skip_one_without_user_xattrs; then if is_bare_user_only_repo repo; then cacherepomode=bare-user-only else @@ -193,15 +212,19 @@ if ! is_bare_user_only_repo repo && ! skip_one_without_user_xattrs; then repo_init --no-gpg-verify echo "ok corruption" fi +else +# bareuseronly case, we don't mark it as SKIP at the moment +echo "ok corruption (skipped)" +fi cd ${test_tmpdir} rm mirrorrepo/refs/remotes/* -rf ${CMD_PREFIX} ostree --repo=mirrorrepo prune --refs-only ${CMD_PREFIX} ostree --repo=mirrorrepo pull origin main rm checkout-origin-main -rf -$OSTREE --repo=ostree-srv/gnomerepo checkout main checkout-origin-main +$OSTREE --repo=ostree-srv/gnomerepo checkout ${CHECKOUT_U_ARG} main checkout-origin-main echo yetmorecontent > checkout-origin-main/baz/cowtest -${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo commit -b main -s "" --tree=dir=checkout-origin-main +${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo commit ${COMMIT_ARGS} -b main -s "" --tree=dir=checkout-origin-main rev=$(${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo rev-parse main) ${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo static-delta generate main ${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo summary -u @@ -223,8 +246,8 @@ cd ${test_tmpdir} rm otherrepo -rf ostree_repo_init otherrepo --mode=archive rm checkout-origin-main -rf -${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo checkout main checkout-origin-main -${CMD_PREFIX} ostree --repo=otherrepo commit -b localbranch --tree=dir=checkout-origin-main +${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo checkout ${CHECKOUT_U_ARG} main checkout-origin-main +${CMD_PREFIX} ostree --repo=otherrepo commit ${COMMIT_ARGS} -b localbranch --tree=dir=checkout-origin-main ${CMD_PREFIX} ostree --repo=otherrepo remote add --set=gpg-verify=false origin file://$(pwd)/ostree-srv/gnomerepo ${CMD_PREFIX} ostree --repo=otherrepo pull origin main rm mirrorrepo-local -rf @@ -247,7 +270,7 @@ assert_file_has_content_literal err.txt "error: Refspec 'nosuchbranch' not found echo "ok pull-local nonexistent branch" cd ${test_tmpdir} -${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo commit -b main -s "Metadata string" --add-detached-metadata-string=SIGNATURE=HANCOCK --tree=ref=main +${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo commit ${COMMIT_ARGS} -b main -s "Metadata string" --add-detached-metadata-string=SIGNATURE=HANCOCK --tree=ref=main ${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo summary -u ${CMD_PREFIX} ostree --repo=repo pull origin main ${CMD_PREFIX} ostree --repo=repo fsck @@ -278,13 +301,13 @@ origrev=$(${CMD_PREFIX} ostree --repo=repo rev-parse main) # Check we can pull the same commit with timestamp checking enabled ${CMD_PREFIX} ostree --repo=repo pull -T origin main assert_streq ${origrev} "$(${CMD_PREFIX} ostree --repo=repo rev-parse main)" -newrev=$(${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo commit -b main --tree=ref=main) +newrev=$(${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo commit ${COMMIT_ARGS} -b main --tree=ref=main) ${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo summary -u # New commit with timestamp checking ${CMD_PREFIX} ostree --repo=repo pull -T origin main assert_not_streq "${origrev}" "${newrev}" assert_streq ${newrev} "$(${CMD_PREFIX} ostree --repo=repo rev-parse main)" -newrev2=$(${CMD_PREFIX} ostree --timestamp="October 25 1985" --repo=ostree-srv/gnomerepo commit -b main --tree=ref=main) +newrev2=$(${CMD_PREFIX} ostree --timestamp="October 25 1985" --repo=ostree-srv/gnomerepo commit ${COMMIT_ARGS} -b main --tree=ref=main) ${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo summary -u if ${CMD_PREFIX} ostree --repo=repo pull -T origin main 2>err.txt; then fatal "pulled older commit with timestamp checking enabled?" @@ -304,12 +327,12 @@ ${CMD_PREFIX} ostree --repo=repo fsck ${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo static-delta generate main rm main-files -rf -${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo checkout main main-files +${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo checkout ${CHECKOUT_U_ARG} main main-files cd main-files echo "an added file for static deltas" > added-file echo "modified file for static deltas" > baz/cow rm baz/saucer -${CMD_PREFIX} ostree --repo=${test_tmpdir}/ostree-srv/gnomerepo commit -b main -s 'static delta test' +${CMD_PREFIX} ostree --repo=${test_tmpdir}/ostree-srv/gnomerepo commit ${COMMIT_ARGS} -b main -s 'static delta test' cd .. rm main-files -rf # Generate delta that we'll use @@ -353,7 +376,7 @@ ${CMD_PREFIX} ostree --repo=repo pull --disable-static-deltas origin main ${CMD_PREFIX} ostree --repo=repo fsck rm checkout-origin-main -rf -$OSTREE checkout origin:main checkout-origin-main +$OSTREE checkout ${CHECKOUT_H_ARGS} origin:main checkout-origin-main cd checkout-origin-main assert_file_has_content firstfile '^first$' assert_file_has_content baz/cow "modified file for static deltas" @@ -405,10 +428,10 @@ echo "ok delta required for revision" cd ${test_tmpdir} rm main-files -rf -${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo checkout main main-files +${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo checkout ${CHECKOUT_U_ARG} main main-files cd main-files echo "more added files for static deltas" > added-file2 -${CMD_PREFIX} ostree --repo=${test_tmpdir}/ostree-srv/gnomerepo commit -b main -s 'inline static delta test' +${CMD_PREFIX} ostree --repo=${test_tmpdir}/ostree-srv/gnomerepo commit ${COMMIT_ARGS} -b main -s 'inline static delta test' cd .. rm main-files -rf # Generate new delta that we'll use @@ -420,7 +443,7 @@ ${CMD_PREFIX} ostree --repo=repo pull origin main ${CMD_PREFIX} ostree --repo=repo fsck rm checkout-origin-main -rf -$OSTREE checkout origin:main checkout-origin-main +$OSTREE checkout ${CHECKOUT_H_ARGS} origin:main checkout-origin-main cd checkout-origin-main assert_file_has_content added-file2 "more added files for static deltas" @@ -428,12 +451,12 @@ echo "ok inline static delta" cd ${test_tmpdir} rm main-files -rf -${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo checkout main main-files +${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo checkout ${CHECKOUT_U_ARG} main main-files cd main-files # Make a file larger than 16M for testing dd if=/dev/zero of=test-bigfile count=1 seek=42678 echo "further modified file for static deltas" > baz/cow -${CMD_PREFIX} ostree --repo=${test_tmpdir}/ostree-srv/gnomerepo commit -b main -s '2nd static delta test' +${CMD_PREFIX} ostree --repo=${test_tmpdir}/ostree-srv/gnomerepo commit ${COMMIT_ARGS} -b main -s '2nd static delta test' cd .. rm main-files -rf ${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo static-delta generate main @@ -444,7 +467,7 @@ ${CMD_PREFIX} ostree --repo=repo pull origin main ${CMD_PREFIX} ostree --repo=repo fsck rm checkout-origin-main -rf -$OSTREE checkout origin:main checkout-origin-main +$OSTREE checkout ${CHECKOUT_H_ARGS} origin:main checkout-origin-main cd checkout-origin-main assert_has_file test-bigfile stat --format=%s test-bigfile > bigfile-size @@ -496,7 +519,7 @@ echo "ok pull repo 404 on dirtree object" cd ${test_tmpdir} repo_init --set=gpg-verify=true -${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo commit \ +${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo commit ${COMMIT_ARGS} \ --gpg-homedir=${TEST_GPG_KEYHOME} --gpg-sign=${TEST_GPG_KEYID_1} -b main \ -s "A signed commit" --tree=ref=main ${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo summary -u diff --git a/tests/test-pull-bareuseronly.sh b/tests/test-pull-bareuseronly.sh new file mode 100755 index 00000000..f5c06c4d --- /dev/null +++ b/tests/test-pull-bareuseronly.sh @@ -0,0 +1,28 @@ +#!/bin/bash +# +# Copyright (C) 2017 Colin Walters +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +set -euo pipefail + +. $(dirname $0)/libtest.sh + +skip_without_user_xattrs +setup_fake_remote_repo1 "archive" "--canonical-permissions" + +repo_mode=bare-user-only +. ${test_srcdir}/pull-test.sh From bb05b187b63e9e61745b1ca77640a41c257a741f Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Fri, 13 Oct 2017 20:50:08 -0400 Subject: [PATCH 51/98] lib/deltas: Use fastpath for regfile writes for bare-user-only Noticed this omission while looking at the code while working on another patch. Closes: #1270 Approved by: jlebon --- src/libostree/ostree-repo-static-delta-processing.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/libostree/ostree-repo-static-delta-processing.c b/src/libostree/ostree-repo-static-delta-processing.c index 84fed682..6596da89 100644 --- a/src/libostree/ostree-repo-static-delta-processing.c +++ b/src/libostree/ostree-repo-static-delta-processing.c @@ -581,8 +581,7 @@ dispatch_open_splice_and_close (OstreeRepo *repo, /* Fast path for regular files to bare repositories */ if (S_ISREG (state->mode) && - (repo->mode == OSTREE_REPO_MODE_BARE || - repo->mode == OSTREE_REPO_MODE_BARE_USER)) + _ostree_repo_mode_is_bare (repo->mode)) { if (!_ostree_repo_open_content_bare (repo, state->checksum, state->content_size, From 93457071cb5d47c08b60d3244f9632725634010a Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Fri, 13 Oct 2017 20:51:39 -0400 Subject: [PATCH 52/98] lib/deltas: Use pread() instead of lseek()+read() That's why the syscall was invented, so let's use it. Just noticed while reading the code while working on another patch. Closes: #1270 Approved by: jlebon --- src/libostree/ostree-repo-static-delta-processing.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/libostree/ostree-repo-static-delta-processing.c b/src/libostree/ostree-repo-static-delta-processing.c index 6596da89..fac377ec 100644 --- a/src/libostree/ostree-repo-static-delta-processing.c +++ b/src/libostree/ostree-repo-static-delta-processing.c @@ -719,15 +719,13 @@ dispatch_write (OstreeRepo *repo, { if (state->read_source_fd != -1) { - if (lseek (state->read_source_fd, content_offset, SEEK_SET) == -1) - return glnx_throw_errno_prefix (error, "lseek"); while (content_size > 0) { char buf[4096]; gssize bytes_read; do - bytes_read = read (state->read_source_fd, buf, MIN(sizeof(buf), content_size)); + bytes_read = pread (state->read_source_fd, buf, MIN(sizeof(buf), content_size), content_offset); while (G_UNLIKELY (bytes_read == -1 && errno == EINTR)); if (bytes_read == -1) return glnx_throw_errno_prefix (error, "read"); From bc7ff2cd1dea92594801c89c3727ac23ca12f872 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Mon, 16 Oct 2017 15:04:48 -0400 Subject: [PATCH 53/98] lib/commit: Avoid trying to delete `.` with _CONSUME flag This helps port rpm-ostree. Closes: #1278 Approved by: jlebon --- src/libostree/ostree-repo-commit.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/libostree/ostree-repo-commit.c b/src/libostree/ostree-repo-commit.c index 140ea34f..f0cc8bf4 100644 --- a/src/libostree/ostree-repo-commit.c +++ b/src/libostree/ostree-repo-commit.c @@ -3193,11 +3193,13 @@ ostree_repo_write_dfd_to_mtree (OstreeRepo *self, return FALSE; /* And now finally remove the toplevel; see also the handling for this flag in - * the write_dfd_iter_to_mtree_internal() function. + * the write_dfd_iter_to_mtree_internal() function. As a special case we don't + * try to remove `.` (since we'd get EINVAL); that's what's used in + * rpm-ostree. */ const gboolean delete_after_commit = modifier && (modifier->flags & OSTREE_REPO_COMMIT_MODIFIER_FLAGS_CONSUME); - if (delete_after_commit) + if (delete_after_commit && !g_str_equal (path, ".")) { if (!glnx_unlinkat (dfd, path, AT_REMOVEDIR, error)) return FALSE; From eeabd4baf7688f299d1c40d9cf6acccce2d532db Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Mon, 16 Oct 2017 16:07:30 -0400 Subject: [PATCH 54/98] lib/commit: Fix indentation in file commit code No functional changes; the indentation was off here and it was confusing me working on another patch. Closes: #1280 Approved by: jlebon --- src/libostree/ostree-repo-commit.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/libostree/ostree-repo-commit.c b/src/libostree/ostree-repo-commit.c index f0cc8bf4..729b1b91 100644 --- a/src/libostree/ostree-repo-commit.c +++ b/src/libostree/ostree-repo-commit.c @@ -2881,21 +2881,21 @@ write_directory_content_to_mtree_internal (OstreeRepo *self, } } - if (!ostree_raw_file_to_content_stream (file_input, - modified_info, xattrs, - &file_object_input, &file_obj_length, - cancellable, error)) - return FALSE; - g_autofree guchar *child_file_csum = NULL; - if (!ostree_repo_write_content (self, NULL, file_object_input, file_obj_length, + if (!ostree_raw_file_to_content_stream (file_input, + modified_info, xattrs, + &file_object_input, &file_obj_length, + cancellable, error)) + return FALSE; + g_autofree guchar *child_file_csum = NULL; + if (!ostree_repo_write_content (self, NULL, file_object_input, file_obj_length, &child_file_csum, cancellable, error)) - return FALSE; + return FALSE; - char tmp_checksum[OSTREE_SHA256_STRING_LEN+1]; - ostree_checksum_inplace_from_bytes (child_file_csum, tmp_checksum); - if (!ostree_mutable_tree_replace_file (mtree, name, tmp_checksum, - error)) - return FALSE; + char tmp_checksum[OSTREE_SHA256_STRING_LEN+1]; + ostree_checksum_inplace_from_bytes (child_file_csum, tmp_checksum); + if (!ostree_mutable_tree_replace_file (mtree, name, tmp_checksum, + error)) + return FALSE; } /* Process delete_after_commit. In the adoption case though, we already From 3577b4a6c633f633cc906131abf889d5e333b795 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Mon, 16 Oct 2017 16:08:26 -0400 Subject: [PATCH 55/98] lib/commit: Use direct fd xattr operations again on regular files A side effect of commit 8fe45362578a43260876134d6547ebd0bb2485c3 is that we started listing all xattrs even for files with device/inode matches; further, we did that using the dfd/name which means we went through the `/proc` path, which is slower and uglier. Noticed this in strace while looking at adoption code. Closes: #1280 Approved by: jlebon --- src/libostree/ostree-repo-commit.c | 53 ++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 13 deletions(-) diff --git a/src/libostree/ostree-repo-commit.c b/src/libostree/ostree-repo-commit.c index 729b1b91..164003f7 100644 --- a/src/libostree/ostree-repo-commit.c +++ b/src/libostree/ostree-repo-commit.c @@ -2794,16 +2794,42 @@ write_directory_content_to_mtree_internal (OstreeRepo *self, } else { - guint64 file_obj_length; - g_autoptr(GInputStream) file_input = NULL; - g_autoptr(GInputStream) file_object_input = NULL; + glnx_autofd int file_input_fd = -1; + + /* Open the file now, since it's better for reading xattrs + * rather than using the /proc/self/fd links. + * + * TODO: Do this lazily, since for e.g. bare-user-only repos + * we don't have xattrs and don't need to open every file + * for things that have devino cache hits. + */ + if (file_type == G_FILE_TYPE_REGULAR && dfd_iter != NULL) + { + if (!glnx_openat_rdonly (dfd_iter->fd, name, FALSE, &file_input_fd, error)) + return FALSE; + } g_autoptr(GVariant) xattrs = NULL; gboolean xattrs_were_modified; - if (!get_final_xattrs (self, modifier, child_relpath, child_info, child, - dir_enum != NULL ? -1 : dfd_iter->fd, name, &xattrs, - &xattrs_were_modified, cancellable, error)) - return FALSE; + if (dir_enum != NULL) + { + if (!get_final_xattrs (self, modifier, child_relpath, child_info, child, + -1, name, &xattrs, &xattrs_were_modified, + cancellable, error)) + return FALSE; + } + else + { + /* These contortions are basically so we use glnx_fd_get_all_xattrs() + * for regfiles, and glnx_dfd_name_get_all_xattrs() for symlinks. + */ + int xattr_fd_arg = (file_input_fd != -1) ? file_input_fd : dfd_iter->fd; + const char *xattr_path_arg = (file_input_fd != -1) ? NULL : name; + if (!get_final_xattrs (self, modifier, child_relpath, child_info, child, + xattr_fd_arg, xattr_path_arg, &xattrs, &xattrs_were_modified, + cancellable, error)) + return FALSE; + } /* only check the devino cache if the file info & xattrs were not modified */ const gboolean modified_file_meta = child_info_was_modified || xattrs_were_modified; @@ -2862,8 +2888,9 @@ write_directory_content_to_mtree_internal (OstreeRepo *self, } else { - /* Generic path - convert to object stream, commit that */ - if (g_file_info_get_file_type (modified_info) == G_FILE_TYPE_REGULAR) + g_autoptr(GInputStream) file_input = NULL; + + if (file_type == G_FILE_TYPE_REGULAR) { if (dir_enum != NULL) { @@ -2874,13 +2901,13 @@ write_directory_content_to_mtree_internal (OstreeRepo *self, } else { - g_assert (dfd_iter != NULL); - if (!ot_openat_read_stream (dfd_iter->fd, name, FALSE, - &file_input, cancellable, error)) - return FALSE; + /* We already opened the fd above */ + file_input = g_unix_input_stream_new (file_input_fd, FALSE); } } + g_autoptr(GInputStream) file_object_input = NULL; + guint64 file_obj_length; if (!ostree_raw_file_to_content_stream (file_input, modified_info, xattrs, &file_object_input, &file_obj_length, From 9955695da31cbf49465ab8e3b0135166b067452c Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Tue, 17 Oct 2017 11:18:26 -0400 Subject: [PATCH 56/98] syntax-check: Add a rule to enforce glnx_autofd over glnx_fd_close And fix the one final use. Closes: #1280 Approved by: jlebon --- cfg.mk | 6 +++++- src/libostree/ostree-repo-commit.c | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/cfg.mk b/cfg.mk index f6f1ce25..0eb05b89 100644 --- a/cfg.mk +++ b/cfg.mk @@ -31,8 +31,12 @@ sc_glnx_errno_prefix_colon: @prohibit='\ Date: Tue, 17 Oct 2017 21:03:23 +0200 Subject: [PATCH 57/98] docs: mention the $OSTREE_REPO environment variable $OSTREE_REPO may be set to override the default location of the repository. Link: https://mail.gnome.org/archives/ostree-list/2017-October/msg00003.html Signed-off-by: Marcus Folkesson Closes: #1282 Approved by: cgwalters --- docs/manual/repo.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/manual/repo.md b/docs/manual/repo.md index abfc4911..7bf4cd5e 100644 --- a/docs/manual/repo.md +++ b/docs/manual/repo.md @@ -91,10 +91,10 @@ attributes, such as tmpfs. In contrast, the `archive` mode is designed for serving via plain HTTP. Like tar files, it can be read/written by non-root users. -On an OSTree-deployed system, the "system repository" is -`/ostree/repo`. It can be read by any uid, but only written by root. -Unless the `--repo` argument is given to the ostree -command, it will operate on the system repository. +On an OSTree-deployed system, the "system repository" is `/ostree/repo`. It can +be read by any uid, but only written by root. The `ostree` command will by +default operate on the system repository; you may provide the `--repo` argument +to override this, or set the `$OSTREE_REPO` environment variable. ## Refs From de5f781089ada0ae80810ab95aa71fb02d946f35 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Tue, 17 Oct 2017 21:07:19 -0400 Subject: [PATCH 58/98] lib/pull: Update summary checksum code to use new checksum API This is another case where making an input stream out of a memory buffer is a bit silly; just hash the `GBytes` directly. Closes: #1287 Approved by: jlebon --- src/libostree/ostree-repo-pull.c | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/src/libostree/ostree-repo-pull.c b/src/libostree/ostree-repo-pull.c index 2e9b0bd7..ea670c9c 100644 --- a/src/libostree/ostree-repo-pull.c +++ b/src/libostree/ostree-repo-pull.c @@ -2457,34 +2457,28 @@ on_superblock_fetched (GObject *src, } else { - g_autofree gchar *delta = NULL; - g_autofree guchar *ret_csum = NULL; - guchar *summary_csum; - g_autoptr (GInputStream) summary_is = NULL; g_autoptr(GVariant) delta_superblock = NULL; + g_autofree gchar *delta = g_strconcat (from_revision ? from_revision : "", from_revision ? "-" : "", to_revision, NULL); + const guchar *expected_summary_digest = g_hash_table_lookup (pull_data->summary_deltas_checksums, delta); + guint8 actual_summary_digest[OSTREE_SHA256_DIGEST_LEN]; - summary_is = g_memory_input_stream_new_from_data (g_bytes_get_data (delta_superblock_data, NULL), - g_bytes_get_size (delta_superblock_data), - NULL); - - if (!ot_gio_checksum_stream (summary_is, &ret_csum, pull_data->cancellable, error)) - goto out; - - delta = g_strconcat (from_revision ? from_revision : "", from_revision ? "-" : "", to_revision, NULL); - summary_csum = g_hash_table_lookup (pull_data->summary_deltas_checksums, delta); + g_auto(OtChecksum) hasher = { 0, }; + ot_checksum_init (&hasher); + ot_checksum_update_bytes (&hasher, delta_superblock_data); + ot_checksum_get_digest (&hasher, actual_summary_digest, sizeof (actual_summary_digest)); /* At this point we've GPG verified the data, so in theory * could trust that they provided the right data, but let's * make this a hard error. */ - if (pull_data->gpg_verify_summary && !summary_csum) + if (pull_data->gpg_verify_summary && !expected_summary_digest) { g_set_error (error, OSTREE_GPG_ERROR, OSTREE_GPG_ERROR_NO_SIGNATURE, "GPG verification enabled, but no summary signatures found (use gpg-verify-summary=false in remote config to disable)"); goto out; } - if (summary_csum && memcmp (summary_csum, ret_csum, 32)) + if (expected_summary_digest && memcmp (expected_summary_digest, actual_summary_digest, sizeof (actual_summary_digest))) { g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "Invalid checksum for static delta %s", delta); goto out; From 40a0b9fb73f9b73d5257e05aa3441b9f79c77cf6 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Tue, 17 Oct 2017 21:13:20 -0400 Subject: [PATCH 59/98] lib/repo: Update summary code to use newer hashing API And drop the unnecessary wrapper. Closes: #1287 Approved by: jlebon --- src/libostree/ostree-repo.c | 18 ++++++++---------- src/libotutil/ot-checksum-utils.c | 11 ----------- src/libotutil/ot-checksum-utils.h | 5 ----- 3 files changed, 8 insertions(+), 26 deletions(-) diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c index 23f158d9..7ee7892a 100644 --- a/src/libostree/ostree-repo.c +++ b/src/libostree/ostree-repo.c @@ -4746,18 +4746,16 @@ ostree_repo_regenerate_summary (OstreeRepo *self, if (!glnx_openat_rdonly (self->repo_dir_fd, superblock, TRUE, &superblock_file_fd, error)) return FALSE; - g_autoptr(GInputStream) in_stream = g_unix_input_stream_new (superblock_file_fd, FALSE); - if (!in_stream) + g_autoptr(GBytes) superblock_content = ot_fd_readall_or_mmap (superblock_file_fd, 0, error); + if (!superblock_content) return FALSE; + g_auto(OtChecksum) hasher = { 0, }; + ot_checksum_init (&hasher); + ot_checksum_update_bytes (&hasher, superblock_content); + guint8 digest[OSTREE_SHA256_DIGEST_LEN]; + ot_checksum_get_digest (&hasher, digest, sizeof (digest)); - g_autofree guchar *csum = NULL; - if (!ot_gio_checksum_stream (in_stream, - &csum, - cancellable, - error)) - return FALSE; - - g_variant_dict_insert_value (&deltas_builder, delta_names->pdata[i], ot_gvariant_new_bytearray (csum, 32)); + g_variant_dict_insert_value (&deltas_builder, delta_names->pdata[i], ot_gvariant_new_bytearray (digest, sizeof (digest))); } if (delta_names->len > 0) diff --git a/src/libotutil/ot-checksum-utils.c b/src/libotutil/ot-checksum-utils.c index a6a9c0ce..164a96d3 100644 --- a/src/libotutil/ot-checksum-utils.c +++ b/src/libotutil/ot-checksum-utils.c @@ -252,17 +252,6 @@ ot_gio_splice_get_checksum (GOutputStream *out, return TRUE; } -gboolean -ot_gio_checksum_stream (GInputStream *in, - guchar **out_csum, - GCancellable *cancellable, - GError **error) -{ - if (!out_csum) - return TRUE; - return ot_gio_splice_get_checksum (NULL, in, out_csum, cancellable, error); -} - char * ot_checksum_file_at (int dfd, const char *path, diff --git a/src/libotutil/ot-checksum-utils.h b/src/libotutil/ot-checksum-utils.h index 2d1aa612..df14599e 100644 --- a/src/libotutil/ot-checksum-utils.h +++ b/src/libotutil/ot-checksum-utils.h @@ -88,11 +88,6 @@ gboolean ot_gio_splice_update_checksum (GOutputStream *out, GCancellable *cancellable, GError **error); -gboolean ot_gio_checksum_stream (GInputStream *in, - guchar **out_csum, - GCancellable *cancellable, - GError **error); - char * ot_checksum_file_at (int dfd, const char *path, GChecksumType checksum_type, From a2f8315eaee1bfba0f5f37a9d2867147d9aa65bd Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Fri, 13 Oct 2017 17:40:16 -0400 Subject: [PATCH 60/98] lib/commit: (refactor) Clean up delta bare write API The way `_ostree_repo_open_content_bare()` did both looking for the object and possibly creating a new fd was just weird and inconsistent with e.g. the pull code where we always call `has_object()` first. Just call `has_object()` in the delta paths that used this too, making the implementation right now a thin wrapper around `glnx_open_tmpfile_linkable_at()`, but this is prep for a later patch which does more. Closes: #1283 Approved by: jlebon --- src/libostree/ostree-repo-commit.c | 19 ++---------- src/libostree/ostree-repo-private.h | 1 - .../ostree-repo-static-delta-processing.c | 30 ++++++++++++------- 3 files changed, 22 insertions(+), 28 deletions(-) diff --git a/src/libostree/ostree-repo-commit.c b/src/libostree/ostree-repo-commit.c index e1649c1d..eb5f92a4 100644 --- a/src/libostree/ostree-repo-commit.c +++ b/src/libostree/ostree-repo-commit.c @@ -404,31 +404,18 @@ add_size_index_to_metadata (OstreeRepo *self, return g_variant_ref_sink (g_variant_builder_end (builder)); } -/* Combines a check for whether or not we already have the object with - * allocating a tempfile if we don't. Used by the static delta code. +/* Create a tmpfile for writing a bare file. Currently just used + * by the static delta code, but will likely later be extended + * to be used also by the dfd_iter commit path. */ gboolean _ostree_repo_open_content_bare (OstreeRepo *self, const char *checksum, guint64 content_len, GLnxTmpfile *out_tmpf, - gboolean *out_have_object, GCancellable *cancellable, GError **error) { - gboolean have_obj; - if (!_ostree_repo_has_loose_object (self, checksum, OSTREE_OBJECT_TYPE_FILE, &have_obj, - cancellable, error)) - return FALSE; - /* Do we already have this object? */ - *out_have_object = have_obj; - if (have_obj) - { - /* Make sure the tempfile is unset */ - out_tmpf->initialized = 0; - return TRUE; - } - return glnx_open_tmpfile_linkable_at (self->tmp_dir_fd, ".", O_WRONLY|O_CLOEXEC, out_tmpf, error); } diff --git a/src/libostree/ostree-repo-private.h b/src/libostree/ostree-repo-private.h index bbbb700e..d8d16e1a 100644 --- a/src/libostree/ostree-repo-private.h +++ b/src/libostree/ostree-repo-private.h @@ -370,7 +370,6 @@ _ostree_repo_open_content_bare (OstreeRepo *self, const char *checksum, guint64 content_len, GLnxTmpfile *out_tmpf, - gboolean *out_have_object, GCancellable *cancellable, GError **error); diff --git a/src/libostree/ostree-repo-static-delta-processing.c b/src/libostree/ostree-repo-static-delta-processing.c index fac377ec..7517046e 100644 --- a/src/libostree/ostree-repo-static-delta-processing.c +++ b/src/libostree/ostree-repo-static-delta-processing.c @@ -583,15 +583,18 @@ dispatch_open_splice_and_close (OstreeRepo *repo, if (S_ISREG (state->mode) && _ostree_repo_mode_is_bare (repo->mode)) { - if (!_ostree_repo_open_content_bare (repo, state->checksum, - state->content_size, - &state->tmpf, - &state->have_obj, - cancellable, error)) + if (!ostree_repo_has_object (repo, OSTREE_OBJECT_TYPE_FILE, state->checksum, + &state->have_obj, cancellable, error)) goto out; if (!state->have_obj) { + if (!_ostree_repo_open_content_bare (repo, state->checksum, + state->content_size, + &state->tmpf, + cancellable, error)) + goto out; + state->content_out = g_unix_output_stream_new (state->tmpf.fd, FALSE); if (!handle_untrusted_content_checksum (repo, state, cancellable, error)) goto out; @@ -682,14 +685,19 @@ dispatch_open (OstreeRepo *repo, if (state->stats_only) return TRUE; /* Early return */ - if (!_ostree_repo_open_content_bare (repo, state->checksum, - state->content_size, - &state->tmpf, - &state->have_obj, - cancellable, error)) + if (!ostree_repo_has_object (repo, OSTREE_OBJECT_TYPE_FILE, state->checksum, + &state->have_obj, cancellable, error)) return FALSE; + if (!state->have_obj) - state->content_out = g_unix_output_stream_new (state->tmpf.fd, FALSE); + { + if (!_ostree_repo_open_content_bare (repo, state->checksum, + state->content_size, + &state->tmpf, + cancellable, error)) + return FALSE; + state->content_out = g_unix_output_stream_new (state->tmpf.fd, FALSE); + } if (!handle_untrusted_content_checksum (repo, state, cancellable, error)) return FALSE; From 18b85fa8bdb2e1b794a3f3ecc56d618c88744f92 Mon Sep 17 00:00:00 2001 From: Jonathan Lebon Date: Wed, 18 Oct 2017 13:33:58 +0000 Subject: [PATCH 61/98] lib/commit: fix checking flag with bitwise OR Caught by Coverity. Coverity CID: 1458339 Closes: #1290 Approved by: cgwalters --- src/libostree/ostree-repo-commit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libostree/ostree-repo-commit.c b/src/libostree/ostree-repo-commit.c index eb5f92a4..b6fbd3d1 100644 --- a/src/libostree/ostree-repo-commit.c +++ b/src/libostree/ostree-repo-commit.c @@ -2835,7 +2835,7 @@ write_directory_content_to_mtree_internal (OstreeRepo *self, file_type == G_FILE_TYPE_REGULAR && dfd_iter != NULL && delete_after_commit - && (writeflags | WRITE_DIR_CONTENT_FLAGS_CAN_ADOPT) > 0; + && ((writeflags & WRITE_DIR_CONTENT_FLAGS_CAN_ADOPT) > 0); gboolean can_adopt = can_adopt_basic; /* If basic prerquisites are met, check repo mode specific ones */ if (can_adopt) From 3f3d3d64acf0391df3c91b4e3a7c6c7bc5741685 Mon Sep 17 00:00:00 2001 From: Dan Nicholson Date: Wed, 18 Oct 2017 16:17:19 +0000 Subject: [PATCH 62/98] build: Do *.am.inc substitutions from make correctly The string needs to be escaped with a $ since we want to replace the literal string $(path). Without this make will run the command with the value of the variable, which won't match anything in the input Makefile stub. Closes: #1291 Approved by: smcv --- Makefile.am | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile.am b/Makefile.am index 7f913ab5..2a33282f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -96,7 +96,7 @@ libglnx_libs := $(OT_DEP_GIO_UNIX_LIBS) # autogen.sh (as we do in Debian, to update the Autotools build system) # it will try to build it. $(srcdir)/libglnx/Makefile-libglnx.am.inc: $(srcdir)/libglnx/Makefile-libglnx.am - sed -e 's,$(libglnx_srcpath),libglnx,g' < $< > $@ + sed -e 's,$$(libglnx_srcpath),libglnx,g' < $< > $@ include libglnx/Makefile-libglnx.am.inc EXTRA_DIST += libglnx/Makefile-libglnx.am noinst_LTLIBRARIES += libglnx.la @@ -107,7 +107,7 @@ libbsdiff_cflags := $(OT_DEP_GIO_UNIX_CFLAGS) "-I$(bsdiff_srcpath)" libbsdiff_libs := $(OT_DEP_GIO_UNIX_LIBS) # See the comment for the similar libglnx bit above $(srcdir)/bsdiff/Makefile-bsdiff.am.inc: $(srcdir)/bsdiff/Makefile-bsdiff.am - sed -e 's,$(libbsdiff_srcpath),bsdiff,g' < $< > $@ + sed -e 's,$$(libbsdiff_srcpath),bsdiff,g' < $< > $@ include bsdiff/Makefile-bsdiff.am.inc EXTRA_DIST += bsdiff/Makefile-bsdiff.am noinst_LTLIBRARIES += libbsdiff.la From e466e482b156ad89c1dea8bcb0a5ee639f18e884 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Tue, 17 Oct 2017 20:53:27 -0400 Subject: [PATCH 63/98] Disallow refs starting with a non-letter or digit Change the regexp for validating refs to require at least one letter or digit before allowing the other special chars in the set `[.-_]`. Names that start with `.` are traditionally Unix hidden files; let's ignore them under the assumption they're metadata for some other tool, and we don't want to potentially conflict with the special `.` and `..` Unix directory entries. Further, names starting with `-` are problematic for Unix cmdline option processing; there's no good reason to support that. Finally, disallow `_` just on general principle - it's simpler to say that ref identifiers must start with a letter or digit. We also ignore any existing files (that might be previously created refs) that start with `.` in the `refs/` directory - there's a Red Hat tool for content management that injects `.rsync` files, which is why this patch was first written. V1: Update to ban all refs starting with a non-letter/digit, and also add another call to `ostree_validate_rev` in the pull code. Closes: https://github.com/ostreedev/ostree/issues/1285 Closes: #1286 Approved by: jlebon --- src/libostree/ostree-core-private.h | 5 +++++ src/libostree/ostree-core.c | 25 ++++++++++++++++++++++- src/libostree/ostree-repo-pull.c | 2 ++ src/libostree/ostree-repo-refs.c | 8 ++++++++ tests/test-refs.sh | 31 ++++++++++++++++++++++++++++- 5 files changed, 69 insertions(+), 2 deletions(-) diff --git a/src/libostree/ostree-core-private.h b/src/libostree/ostree-core-private.h index 22d725a0..32fe7e51 100644 --- a/src/libostree/ostree-core-private.h +++ b/src/libostree/ostree-core-private.h @@ -128,6 +128,11 @@ static inline char * _ostree_get_commitpartial_path (const char *checksum) return g_strconcat ("state/", checksum, ".commitpartial", NULL); } +gboolean +_ostree_validate_ref_fragment (const char *fragment, + GError **error); + + gboolean _ostree_validate_bareuseronly_mode (guint32 mode, const char *checksum, diff --git a/src/libostree/ostree-core.c b/src/libostree/ostree-core.c index 50a2e4fa..cee036d8 100644 --- a/src/libostree/ostree-core.c +++ b/src/libostree/ostree-core.c @@ -142,7 +142,10 @@ ostree_validate_checksum_string (const char *sha256, return ostree_validate_structureof_checksum_string (sha256, error); } -#define OSTREE_REF_FRAGMENT_REGEXP "[-._\\w\\d]+" +/* This used to allow leading - and ., but was changed in + * https://github.com/ostreedev/ostree/pull/1286 + */ +#define OSTREE_REF_FRAGMENT_REGEXP "[\\w\\d][-._\\w\\d]*" #define OSTREE_REF_REGEXP "(?:" OSTREE_REF_FRAGMENT_REGEXP "/)*" OSTREE_REF_FRAGMENT_REGEXP #define OSTREE_REMOTE_NAME_REGEXP OSTREE_REF_FRAGMENT_REGEXP @@ -196,6 +199,26 @@ ostree_parse_refspec (const char *refspec, return TRUE; } +gboolean +_ostree_validate_ref_fragment (const char *fragment, + GError **error) +{ + static GRegex *regex; + static gsize regex_initialized; + if (g_once_init_enter (®ex_initialized)) + { + regex = g_regex_new ("^" OSTREE_REF_FRAGMENT_REGEXP "$", 0, 0, NULL); + g_assert (regex); + g_once_init_leave (®ex_initialized, 1); + } + + g_autoptr(GMatchInfo) match = NULL; + if (!g_regex_match (regex, fragment, 0, &match)) + return glnx_throw (error, "Invalid ref fragment '%s'", fragment); + + return TRUE; +} + /** * ostree_validate_rev: * @rev: A revision string diff --git a/src/libostree/ostree-repo-pull.c b/src/libostree/ostree-repo-pull.c index ea670c9c..efe312d3 100644 --- a/src/libostree/ostree-repo-pull.c +++ b/src/libostree/ostree-repo-pull.c @@ -3853,6 +3853,8 @@ ostree_repo_pull_with_options (OstreeRepo *self, while (g_variant_iter_loop (collection_refs_iter, "(&s&s&s)", &collection_id, &ref_name, &checksum)) { + if (!ostree_validate_rev (ref_name, error)) + goto out; g_hash_table_insert (requested_refs_to_fetch, ostree_collection_ref_new (collection_id, ref_name), (*checksum != '\0') ? g_strdup (checksum) : NULL); diff --git a/src/libostree/ostree-repo-refs.c b/src/libostree/ostree-repo-refs.c index b6bfb0ec..9289bb37 100644 --- a/src/libostree/ostree-repo-refs.c +++ b/src/libostree/ostree-repo-refs.c @@ -560,6 +560,14 @@ enumerate_refs_recurse (OstreeRepo *repo, if (dent == NULL) break; + /* https://github.com/ostreedev/ostree/issues/1285 + * Ignore any files that don't appear to be valid fragments; e.g. + * Red Hat has a tool that drops .rsync_info files into each + * directory it syncs. + **/ + if (!_ostree_validate_ref_fragment (dent->d_name, NULL)) + continue; + g_string_append (base_path, dent->d_name); if (dent->d_type == DT_DIR) diff --git a/tests/test-refs.sh b/tests/test-refs.sh index da45605c..1f0dbdbd 100755 --- a/tests/test-refs.sh +++ b/tests/test-refs.sh @@ -23,7 +23,7 @@ set -euo pipefail setup_fake_remote_repo1 "archive" -echo '1..2' +echo '1..5' cd ${test_tmpdir} mkdir repo @@ -88,6 +88,35 @@ if ${CMD_PREFIX} ostree --repo=repo refs foo/ctest --create=ctest; then assert_not_reached "refs --create unexpectedly succeeded in overwriting an existing prefix!" fi +# https://github.com/ostreedev/ostree/issues/1285 +# One tool was creating .latest_rsync files in each dir, let's ignore stuff like +# that. +echo '👻' > repo/refs/heads/.spooky_and_hidden +${CMD_PREFIX} ostree --repo=repo refs > refs.txt +assert_not_file_has_content refs.txt 'spooky' +${CMD_PREFIX} ostree --repo=repo refs ctest --create=exampleos/x86_64/standard +echo '👻' > repo/refs/heads/exampleos/x86_64/.further_spooky_and_hidden +${CMD_PREFIX} ostree --repo=repo refs > refs.txt +assert_file_has_content refs.txt 'exampleos/x86_64/standard' +assert_not_file_has_content refs.txt 'spooky' +rm repo/refs/heads/exampleos -rf +echo "ok hidden refs" + +for ref in '.' '-' '.foo' '-bar' '!' '!foo'; do + if ${CMD_PREFIX} ostree --repo=repo refs ctest --create=${ref} 2>err.txt; then + fatal "Created ref ${ref}" + fi + assert_file_has_content err.txt 'Invalid ref' +done +echo "ok invalid refs" + +for ref in 'org.foo.bar/x86_64/standard-blah'; do + ostree --repo=repo refs ctest --create=${ref} + ostree --repo=repo rev-parse ${ref} >/dev/null + ostree --repo=repo refs --delete ${ref} +done +echo "ok valid refs with chars '._-'" + #Check to see if any uncleaned tmp files were created after failed --create ${CMD_PREFIX} ostree --repo=repo refs | wc -l > refscount.create1 assert_file_has_content refscount.create1 "^5$" From a1f020ffa45f9cb7dad86e4c87a3f78b6f47997c Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Thu, 19 Oct 2017 14:04:10 +0100 Subject: [PATCH 64/98] lib/repo-finder-avahi: Fix a leak in a GVariantIter loop Use g_variant_iter_loop() rather than next(), since it automatically handles freeing the child memory each iteration. Previously, we leaked it for all but the last iteration. Signed-off-by: Philip Withnall Closes: #1293 Approved by: cgwalters --- src/libostree/ostree-repo-finder-avahi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libostree/ostree-repo-finder-avahi.c b/src/libostree/ostree-repo-finder-avahi.c index a39d9533..0c88ad60 100644 --- a/src/libostree/ostree-repo-finder-avahi.c +++ b/src/libostree/ostree-repo-finder-avahi.c @@ -429,7 +429,7 @@ fill_refs_and_checksums_from_summary_map (GVariantIter *summary_map, g_autofree gchar *ref_name = NULL; g_autoptr(GVariant) checksum_variant = NULL; - while (g_variant_iter_next (summary_map, "(s(t@aya{sv}))", + while (g_variant_iter_loop (summary_map, "(s(t@aya{sv}))", (gpointer *) &ref_name, NULL, (gpointer *) &checksum_variant, NULL)) { From 2531d8fe631b8484b5731f3635314ac3eb82eed5 Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Mon, 16 Oct 2017 16:18:03 +0100 Subject: [PATCH 65/98] lib/repo-finder: Add OstreeRepoFinderOverride MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is another OstreeRepoFinder implementation; it returns results from a given set of URIs. It’s designed to be used for implementing user overrides to other repo-finders, or for implementing unit tests. Signed-off-by: Philip Withnall Closes: #1281 Approved by: mwleeds --- Makefile-libostree-defines.am | 1 + Makefile-libostree.am | 2 + apidoc/ostree-experimental-sections.txt | 9 + src/libostree/libostree-experimental.sym | 7 + src/libostree/ostree-autocleanups.h | 1 + src/libostree/ostree-core-private.h | 3 + src/libostree/ostree-repo-finder-override.c | 322 ++++++++++++++++++++ src/libostree/ostree-repo-finder-override.h | 58 ++++ src/libostree/ostree.h | 1 + 9 files changed, 404 insertions(+) create mode 100644 src/libostree/ostree-repo-finder-override.c create mode 100644 src/libostree/ostree-repo-finder-override.h diff --git a/Makefile-libostree-defines.am b/Makefile-libostree-defines.am index 6fc4a18a..3fba576b 100644 --- a/Makefile-libostree-defines.am +++ b/Makefile-libostree-defines.am @@ -46,6 +46,7 @@ libostree_public_headers += \ src/libostree/ostree-repo-finder-avahi.h \ src/libostree/ostree-repo-finder-config.h \ src/libostree/ostree-repo-finder-mount.h \ + src/libostree/ostree-repo-finder-override.h \ $(NULL) endif diff --git a/Makefile-libostree.am b/Makefile-libostree.am index ebbe8437..e2ebae3a 100644 --- a/Makefile-libostree.am +++ b/Makefile-libostree.am @@ -156,6 +156,7 @@ libostree_experimental_headers = \ src/libostree/ostree-repo-finder-avahi.h \ src/libostree/ostree-repo-finder-config.h \ src/libostree/ostree-repo-finder-mount.h \ + src/libostree/ostree-repo-finder-override.h \ $(NULL) if !ENABLE_EXPERIMENTAL_API libostree_1_la_SOURCES += $(libostree_experimental_headers) @@ -167,6 +168,7 @@ libostree_1_la_SOURCES += \ src/libostree/ostree-repo-finder-avahi.c \ src/libostree/ostree-repo-finder-config.c \ src/libostree/ostree-repo-finder-mount.c \ + src/libostree/ostree-repo-finder-override.c \ $(NULL) if USE_AVAHI diff --git a/apidoc/ostree-experimental-sections.txt b/apidoc/ostree-experimental-sections.txt index c43d11e1..309d07fb 100644 --- a/apidoc/ostree-experimental-sections.txt +++ b/apidoc/ostree-experimental-sections.txt @@ -76,6 +76,15 @@ ostree_repo_finder_mount_new ostree_repo_finder_mount_get_type +
+ostree-repo-finder-override +OstreeRepoFinderOverride +ostree_repo_finder_override_new +ostree_repo_finder_override_add_uri + +ostree_repo_finder_override_get_type +
+
ostree-misc-experimental ostree_repo_get_collection_id diff --git a/src/libostree/libostree-experimental.sym b/src/libostree/libostree-experimental.sym index 87f274da..cbe373cf 100644 --- a/src/libostree/libostree-experimental.sym +++ b/src/libostree/libostree-experimental.sym @@ -82,3 +82,10 @@ LIBOSTREE_2017.12_EXPERIMENTAL { global: ostree_repo_resolve_collection_ref; } LIBOSTREE_2017.8_EXPERIMENTAL; + +LIBOSTREE_2017.13_EXPERIMENTAL { +global: + ostree_repo_finder_override_add_uri; + ostree_repo_finder_override_get_type; + ostree_repo_finder_override_new; +} LIBOSTREE_2017.12_EXPERIMENTAL; diff --git a/src/libostree/ostree-autocleanups.h b/src/libostree/ostree-autocleanups.h index 7228c0b2..c8e8a857 100644 --- a/src/libostree/ostree-autocleanups.h +++ b/src/libostree/ostree-autocleanups.h @@ -66,6 +66,7 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC (OstreeRepoFinder, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (OstreeRepoFinderAvahi, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (OstreeRepoFinderConfig, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (OstreeRepoFinderMount, g_object_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC (OstreeRepoFinderOverride, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (OstreeRepoFinderResult, ostree_repo_finder_result_free) G_DEFINE_AUTO_CLEANUP_FREE_FUNC (OstreeRepoFinderResultv, ostree_repo_finder_result_freev, NULL) #endif /* OSTREE_ENABLE_EXPERIMENTAL_API */ diff --git a/src/libostree/ostree-core-private.h b/src/libostree/ostree-core-private.h index 32fe7e51..08809e4a 100644 --- a/src/libostree/ostree-core-private.h +++ b/src/libostree/ostree-core-private.h @@ -223,6 +223,9 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC (OstreeRepoFinderConfig, g_object_unref) #include "ostree-repo-finder-mount.h" G_DEFINE_AUTOPTR_CLEANUP_FUNC (OstreeRepoFinderMount, g_object_unref) + +#include "ostree-repo-finder-override.h" +G_DEFINE_AUTOPTR_CLEANUP_FUNC (OstreeRepoFinderOverride, g_object_unref) #endif G_END_DECLS diff --git a/src/libostree/ostree-repo-finder-override.c b/src/libostree/ostree-repo-finder-override.c new file mode 100644 index 00000000..e5bb80d7 --- /dev/null +++ b/src/libostree/ostree-repo-finder-override.c @@ -0,0 +1,322 @@ +/* + * Copyright © 2017 Endless Mobile, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: + * - Philip Withnall + */ + +#include "config.h" + +#include +#include +#include +#include +#include + +#include "ostree-autocleanups.h" +#include "ostree-remote-private.h" +#include "ostree-repo.h" +#include "ostree-repo-private.h" +#include "ostree-repo-finder.h" +#include "ostree-repo-finder-override.h" + +/** + * SECTION:ostree-repo-finder-override + * @title: OstreeRepoFinderOverride + * @short_description: Finds remote repositories from a list of repository URIs + * @stability: Unstable + * @include: libostree/ostree-repo-finder-override.h + * + * #OstreeRepoFinderOverride is an implementation of #OstreeRepoFinder which + * looks refs up in a list of remotes given by their URI, and returns the URIs + * which contain the refs. Duplicate remote URIs are combined into a single + * #OstreeRepoFinderResult which lists multiple refs. + * + * Each result is given an #OstreeRepoFinderResult.priority value of 20, which + * ranks its results above those from the other default #OstreeRepoFinder + * implementations. + * + * Results can only be returned for a ref if a remote and keyring are configured + * locally for the collection ID of that ref, otherwise there would be no keys + * available to verify signatures on commits for that ref. + * + * This is intended to be used for user-provided overrides and testing software + * which uses #OstreeRepoFinder. For production use, #OstreeRepoFinderConfig is + * recommended instead. + * + * Since: 2017.13 + */ + +static void ostree_repo_finder_override_iface_init (OstreeRepoFinderInterface *iface); + +struct _OstreeRepoFinderOverride +{ + GObject parent_instance; + + GPtrArray *override_uris; /* (owned) (element-type utf8) */ +}; + +G_DEFINE_TYPE_WITH_CODE (OstreeRepoFinderOverride, ostree_repo_finder_override, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (OSTREE_TYPE_REPO_FINDER, ostree_repo_finder_override_iface_init)) + +static gint +results_compare_cb (gconstpointer a, + gconstpointer b) +{ + const OstreeRepoFinderResult *result_a = *((const OstreeRepoFinderResult **) a); + const OstreeRepoFinderResult *result_b = *((const OstreeRepoFinderResult **) b); + + return ostree_repo_finder_result_compare (result_a, result_b); +} + +/* This must return a valid remote name (suitable for use in a refspec). */ +static gchar * +uri_and_keyring_to_name (const gchar *uri, + const gchar *keyring) +{ + g_autofree gchar *escaped_uri = g_uri_escape_string (uri, NULL, FALSE); + g_autofree gchar *escaped_keyring = g_uri_escape_string (keyring, NULL, FALSE); + + /* FIXME: Need a better separator than `_`, since it’s not escaped in the input. */ + g_autofree gchar *out = g_strdup_printf ("%s_%s", escaped_uri, escaped_keyring); + + for (gsize i = 0; out[i] != '\0'; i++) + { + if (out[i] == '%') + out[i] = '_'; + } + + g_return_val_if_fail (ostree_validate_remote_name (out, NULL), NULL); + + return g_steal_pointer (&out); +} + +/* Version of ostree_repo_remote_list_collection_refs() which takes an + * #OstreeRemote. */ +static gboolean +repo_remote_list_collection_refs (OstreeRepo *repo, + const gchar *remote_uri, + GHashTable **out_all_refs, + GCancellable *cancellable, + GError **error) +{ + g_autofree gchar *name = uri_and_keyring_to_name (remote_uri, ""); + g_autoptr(OstreeRemote) remote = ostree_remote_new (name); + g_key_file_set_string (remote->options, remote->group, "url", remote_uri); + + gboolean remote_already_existed = _ostree_repo_add_remote (repo, remote); + gboolean success = ostree_repo_remote_list_collection_refs (repo, + remote->name, + out_all_refs, + cancellable, + error); + + if (!remote_already_existed) + _ostree_repo_remove_remote (repo, remote); + + return success; +} + +static void +ostree_repo_finder_override_resolve_async (OstreeRepoFinder *finder, + const OstreeCollectionRef * const *refs, + OstreeRepo *parent_repo, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + OstreeRepoFinderOverride *self = OSTREE_REPO_FINDER_OVERRIDE (finder); + g_autoptr(GTask) task = NULL; + g_autoptr(GPtrArray) results = NULL; + const gint priority = 20; /* arbitrarily chosen; higher priority than the others */ + gsize i, j; + g_autoptr(GHashTable) repo_remote_to_refs = NULL; /* (element-type OstreeRemote GHashTable) */ + GHashTable *supported_ref_to_checksum; /* (element-type OstreeCollectionRef utf8) */ + GHashTableIter iter; + const gchar *remote_uri; + OstreeRemote *remote; + + task = g_task_new (finder, cancellable, callback, user_data); + g_task_set_source_tag (task, ostree_repo_finder_override_resolve_async); + results = g_ptr_array_new_with_free_func ((GDestroyNotify) ostree_repo_finder_result_free); + repo_remote_to_refs = g_hash_table_new_full (g_direct_hash, g_direct_equal, + (GDestroyNotify) ostree_remote_unref, + (GDestroyNotify) g_hash_table_unref); + + g_debug ("%s: Checking %u overrides", G_STRFUNC, self->override_uris->len); + + for (i = 0; i < self->override_uris->len; i++) + { + g_autoptr(GError) local_error = NULL; + g_autoptr(GHashTable) remote_refs = NULL; /* (element-type OstreeCollectionRef utf8) */ + const gchar *checksum; + gboolean resolved_a_ref = FALSE; + + remote_uri = self->override_uris->pdata[i]; + + if (!repo_remote_list_collection_refs (parent_repo, remote_uri, + &remote_refs, cancellable, + &local_error)) + { + g_debug ("Ignoring remote ‘%s’ due to error loading its refs: %s", + remote_uri, local_error->message); + g_clear_error (&local_error); + continue; + } + + for (j = 0; refs[j] != NULL; j++) + { + g_autoptr(OstreeRemote) keyring_remote = NULL; + + /* Look up the GPG keyring for this ref. */ + keyring_remote = ostree_repo_resolve_keyring_for_collection (parent_repo, + refs[j]->collection_id, + cancellable, &local_error); + + if (keyring_remote == NULL) + { + g_debug ("Ignoring ref (%s, %s) due to missing keyring: %s", + refs[j]->collection_id, refs[j]->ref_name, local_error->message); + g_clear_error (&local_error); + continue; + } + + if (g_hash_table_lookup_extended (remote_refs, refs[j], NULL, (gpointer *) &checksum)) + { + g_autoptr(OstreeRemote) remote = NULL; + + /* The requested ref is listed in the refs for this remote. Add + * the remote to the results, and the ref to its + * @supported_ref_to_checksum. */ + g_debug ("Resolved ref (%s, %s) to remote ‘%s’.", + refs[j]->collection_id, refs[j]->ref_name, remote_uri); + resolved_a_ref = TRUE; + + /* Build an #OstreeRemote. Use the escaped URI, since remote->name + * is used in file paths, so needs to not contain special characters. */ + g_autofree gchar *name = uri_and_keyring_to_name (remote_uri, keyring_remote->name); + remote = ostree_remote_new_dynamic (name, keyring_remote->name); + + /* gpg-verify-summary is false since we use the unsigned summary file support. */ + g_key_file_set_string (remote->options, remote->group, "url", remote_uri); + g_key_file_set_boolean (remote->options, remote->group, "gpg-verify", TRUE); + g_key_file_set_boolean (remote->options, remote->group, "gpg-verify-summary", FALSE); + + supported_ref_to_checksum = g_hash_table_lookup (repo_remote_to_refs, remote); + + if (supported_ref_to_checksum == NULL) + { + supported_ref_to_checksum = g_hash_table_new_full (ostree_collection_ref_hash, + ostree_collection_ref_equal, + NULL, g_free); + g_hash_table_insert (repo_remote_to_refs, ostree_remote_ref (remote), supported_ref_to_checksum /* transfer */); + } + + g_hash_table_insert (supported_ref_to_checksum, + (gpointer) refs[j], g_strdup (checksum)); + } + } + + if (!resolved_a_ref) + g_debug ("Ignoring remote ‘%s’ due to it not advertising any of the requested refs.", + remote_uri); + } + + /* Aggregate the results. */ + g_hash_table_iter_init (&iter, repo_remote_to_refs); + + while (g_hash_table_iter_next (&iter, (gpointer *) &remote, (gpointer *) &supported_ref_to_checksum)) + g_ptr_array_add (results, ostree_repo_finder_result_new (remote, finder, priority, supported_ref_to_checksum, 0)); + + g_ptr_array_sort (results, results_compare_cb); + + g_task_return_pointer (task, g_steal_pointer (&results), (GDestroyNotify) g_ptr_array_unref); +} + +static GPtrArray * +ostree_repo_finder_override_resolve_finish (OstreeRepoFinder *finder, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, finder), NULL); + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void +ostree_repo_finder_override_init (OstreeRepoFinderOverride *self) +{ + self->override_uris = g_ptr_array_new_with_free_func ((GDestroyNotify) g_free); +} + +static void +ostree_repo_finder_override_finalize (GObject *object) +{ + OstreeRepoFinderOverride *self = OSTREE_REPO_FINDER_OVERRIDE (object); + + g_clear_pointer (&self->override_uris, g_ptr_array_unref); + + G_OBJECT_CLASS (ostree_repo_finder_override_parent_class)->finalize (object); +} + +static void +ostree_repo_finder_override_class_init (OstreeRepoFinderOverrideClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = ostree_repo_finder_override_finalize; +} + +static void +ostree_repo_finder_override_iface_init (OstreeRepoFinderInterface *iface) +{ + iface->resolve_async = ostree_repo_finder_override_resolve_async; + iface->resolve_finish = ostree_repo_finder_override_resolve_finish; +} + +/** + * ostree_repo_finder_override_new: + * + * Create a new #OstreeRepoFinderOverride. + * + * Returns: (transfer full): a new #OstreeRepoFinderOverride + * Since: 2017.13 + */ +OstreeRepoFinderOverride * +ostree_repo_finder_override_new (void) +{ + return g_object_new (OSTREE_TYPE_REPO_FINDER_OVERRIDE, NULL); +} + +/** + * ostree_repo_finder_override_add_uri: + * @uri: URI to add to the repo finder + * + * Add the given @uri to the set of URIs which the repo finder will search for + * matching refs when ostree_repo_finder_resolve_async() is called on it. + * + * Since: 2017.13 + */ +void +ostree_repo_finder_override_add_uri (OstreeRepoFinderOverride *self, + const gchar *uri) +{ + g_return_if_fail (OSTREE_IS_REPO_FINDER_OVERRIDE (self)); + g_return_if_fail (uri != NULL); + + g_ptr_array_add (self->override_uris, g_strdup (uri)); +} diff --git a/src/libostree/ostree-repo-finder-override.h b/src/libostree/ostree-repo-finder-override.h new file mode 100644 index 00000000..d28d3bd8 --- /dev/null +++ b/src/libostree/ostree-repo-finder-override.h @@ -0,0 +1,58 @@ +/* + * Copyright © 2017 Endless Mobile, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: + * - Philip Withnall + */ + +#pragma once + +#include +#include +#include + +#include "ostree-repo-finder.h" +#include "ostree-types.h" + +G_BEGIN_DECLS + +#define OSTREE_TYPE_REPO_FINDER_OVERRIDE (ostree_repo_finder_override_get_type ()) + +/* Manually expanded version of the following, omitting autoptr support (for GLib < 2.44): +_OSTREE_PUBLIC +G_DECLARE_FINAL_TYPE (OstreeRepoFinderOverride, ostree_repo_finder_override, OSTREE, REPO_FINDER_OVERRIDE, GObject) */ + +_OSTREE_PUBLIC +GType ostree_repo_finder_override_get_type (void); + +G_GNUC_BEGIN_IGNORE_DEPRECATIONS +typedef struct _OstreeRepoFinderOverride OstreeRepoFinderOverride; +typedef struct { GObjectClass parent_class; } OstreeRepoFinderOverrideClass; + +static inline OstreeRepoFinderOverride *OSTREE_REPO_FINDER_OVERRIDE (gpointer ptr) { return G_TYPE_CHECK_INSTANCE_CAST (ptr, ostree_repo_finder_override_get_type (), OstreeRepoFinderOverride); } +static inline gboolean OSTREE_IS_REPO_FINDER_OVERRIDE (gpointer ptr) { return G_TYPE_CHECK_INSTANCE_TYPE (ptr, ostree_repo_finder_override_get_type ()); } +G_GNUC_END_IGNORE_DEPRECATIONS + +_OSTREE_PUBLIC +OstreeRepoFinderOverride *ostree_repo_finder_override_new (void); + +_OSTREE_PUBLIC +void ostree_repo_finder_override_add_uri (OstreeRepoFinderOverride *self, + const gchar *uri); + +G_END_DECLS diff --git a/src/libostree/ostree.h b/src/libostree/ostree.h index bd748e68..dd0e052b 100644 --- a/src/libostree/ostree.h +++ b/src/libostree/ostree.h @@ -40,6 +40,7 @@ #include #include #include +#include #endif /* OSTREE_ENABLE_EXPERIMENTAL_API */ #include From 3c360a720ff1a8bf695365a79b3ac7975ffd25e8 Mon Sep 17 00:00:00 2001 From: Ruixin Bao Date: Fri, 13 Oct 2017 16:15:13 +0000 Subject: [PATCH 66/98] ostree: Describe subcommands in help output Added a description argument to all type of commands. Now when we include -h or --help for commands that contain subcommands, the description for those subcommands are shown. The added subcommands help will be provided to the following commands: - ostree -h - ostree admin -h - ostree admin instutil -h - ostree remote -h - ostree static-delta -h Closes: #1267 Approved by: cgwalters --- src/ostree/main.c | 78 +++++++++++++------- src/ostree/ot-admin-builtin-instutil.c | 17 +++-- src/ostree/ot-builtin-admin.c | 43 +++++++---- src/ostree/ot-builtin-remote.c | 38 +++++++--- src/ostree/ot-builtin-static-delta.c | 19 +++-- src/ostree/ot-main.c | 6 +- src/ostree/ot-main.h | 1 + src/ostree/ot-remote-builtin-delete-cookie.c | 2 +- tests/test-help.sh | 3 +- 9 files changed, 140 insertions(+), 67 deletions(-) diff --git a/src/ostree/main.c b/src/ostree/main.c index 66cfae7f..ef8f1f8a 100644 --- a/src/ostree/main.c +++ b/src/ostree/main.c @@ -32,37 +32,63 @@ #include "ot-builtins.h" static OstreeCommand commands[] = { - { "admin", ostree_builtin_admin }, - { "cat", ostree_builtin_cat }, - { "checkout", ostree_builtin_checkout }, - { "checksum", ostree_builtin_checksum }, - { "commit", ostree_builtin_commit }, - { "config", ostree_builtin_config }, - { "diff", ostree_builtin_diff }, - { "export", ostree_builtin_export }, + { "admin", ostree_builtin_admin , + "Commands that needs admin privilege" }, + { "cat", ostree_builtin_cat, + "Concatenate contents of files"}, + { "checkout", ostree_builtin_checkout, + "Check out a commit into a filesystem tree" }, + { "checksum", ostree_builtin_checksum, + "Checksum a file or directory" }, + { "commit", ostree_builtin_commit, + "Commit a new revision" }, + { "config", ostree_builtin_config, + "Change repo configuration settings" }, + { "diff", ostree_builtin_diff, + "Compare directory TARGETDIR against revision REV"}, + { "export", ostree_builtin_export, + "Stream COMMIT to stdout in tar format" }, #ifdef OSTREE_ENABLE_EXPERIMENTAL_API - { "find-remotes", ostree_builtin_find_remotes }, - { "create-usb", ostree_builtin_create_usb }, + { "find-remotes", ostree_builtin_find_remotes, + "Find remotes to serve the given refs" }, + { "create-usb", ostree_builtin_create_usb, + "Copy the refs to a USB stick" }, #endif - { "fsck", ostree_builtin_fsck }, - { "gpg-sign", ostree_builtin_gpg_sign }, - { "init", ostree_builtin_init }, - { "log", ostree_builtin_log }, - { "ls", ostree_builtin_ls }, - { "prune", ostree_builtin_prune }, - { "pull-local", ostree_builtin_pull_local }, + { "fsck", ostree_builtin_fsck, + "Check the repository for consistency" }, + { "gpg-sign", ostree_builtin_gpg_sign, + "Sign a commit" }, + { "init", ostree_builtin_init, + "Initialize a new empty repository" }, + { "log", ostree_builtin_log, + "Show log starting at commit or ref" }, + { "ls", ostree_builtin_ls, + "List file paths" }, + { "prune", ostree_builtin_prune, + "Search for unreachable objects" }, + { "pull-local", ostree_builtin_pull_local, + "Copy data from SRC_REPO" }, #ifdef HAVE_LIBCURL_OR_LIBSOUP - { "pull", ostree_builtin_pull }, + { "pull", ostree_builtin_pull, + "Download data from remote repository" }, #endif - { "refs", ostree_builtin_refs }, - { "remote", ostree_builtin_remote }, - { "reset", ostree_builtin_reset }, - { "rev-parse", ostree_builtin_rev_parse }, - { "show", ostree_builtin_show }, - { "static-delta", ostree_builtin_static_delta }, - { "summary", ostree_builtin_summary }, + { "refs", ostree_builtin_refs, + "List refs" }, + { "remote", ostree_builtin_remote, + "Remote commands that may involve internet access" }, + { "reset", ostree_builtin_reset, + "Reset a REF to a previous COMMIT" }, + { "rev-parse", ostree_builtin_rev_parse, + "Output the target of a rev" }, + { "show", ostree_builtin_show, + "Output a metadata object" }, + { "static-delta", ostree_builtin_static_delta, + "Static delta related commands" }, + { "summary", ostree_builtin_summary, + "Manage summary metadata" }, #if defined(HAVE_LIBSOUP) && defined(BUILDOPT_ENABLE_TRIVIAL_HTTPD_CMDLINE) - { "trivial-httpd", ostree_builtin_trivial_httpd }, + { "trivial-httpd", ostree_builtin_trivial_httpd, + NULL }, #endif { NULL } }; diff --git a/src/ostree/ot-admin-builtin-instutil.c b/src/ostree/ot-admin-builtin-instutil.c index 91c4c114..428c0a2c 100644 --- a/src/ostree/ot-admin-builtin-instutil.c +++ b/src/ostree/ot-admin-builtin-instutil.c @@ -31,15 +31,19 @@ typedef struct { const char *name; gboolean (*fn) (int argc, char **argv, GCancellable *cancellable, GError **error); + const char *description; } OstreeAdminInstUtilCommand; static OstreeAdminInstUtilCommand admin_instutil_subcommands[] = { #ifdef HAVE_SELINUX - { "selinux-ensure-labeled", ot_admin_instutil_builtin_selinux_ensure_labeled }, + { "selinux-ensure-labeled", ot_admin_instutil_builtin_selinux_ensure_labeled, + "Relabel all or part of a deployment" }, #endif - { "set-kargs", ot_admin_instutil_builtin_set_kargs }, - { "grub2-generate", ot_admin_instutil_builtin_grub2_generate }, - { NULL, NULL } + { "set-kargs", ot_admin_instutil_builtin_set_kargs, + "Set new kernel command line arguments(Not stable)" }, + { "grub2-generate", ot_admin_instutil_builtin_grub2_generate, + "Generate GRUB2 configuration from given BLS entries" }, + { NULL, NULL, NULL } }; static GOptionContext * @@ -52,7 +56,10 @@ ostree_admin_instutil_option_context_new_with_commands (void) while (command->name != NULL) { - g_string_append_printf (summary, "\n %s", command->name); + g_string_append_printf (summary, "\n %-24s", command->name); + if (command->description != NULL) + g_string_append_printf (summary, "%s", command->description); + command++; } diff --git a/src/ostree/ot-builtin-admin.c b/src/ostree/ot-builtin-admin.c index 85db78ec..ba9dc28d 100644 --- a/src/ostree/ot-builtin-admin.c +++ b/src/ostree/ot-builtin-admin.c @@ -33,22 +33,35 @@ typedef struct { const char *name; gboolean (*fn) (int argc, char **argv, GCancellable *cancellable, GError **error); + const char *description; } OstreeAdminCommand; static OstreeAdminCommand admin_subcommands[] = { - { "cleanup", ot_admin_builtin_cleanup }, - { "config-diff", ot_admin_builtin_diff }, - { "deploy", ot_admin_builtin_deploy }, - { "init-fs", ot_admin_builtin_init_fs }, - { "instutil", ot_admin_builtin_instutil }, - { "os-init", ot_admin_builtin_os_init }, - { "set-origin", ot_admin_builtin_set_origin }, - { "status", ot_admin_builtin_status }, - { "switch", ot_admin_builtin_switch }, - { "undeploy", ot_admin_builtin_undeploy }, - { "unlock", ot_admin_builtin_unlock }, - { "upgrade", ot_admin_builtin_upgrade }, - { NULL, NULL } + { "cleanup", ot_admin_builtin_cleanup, + "Delete untagged deployments and repository objects" }, + { "config-diff", ot_admin_builtin_diff, + "Diff current /etc configuration versus default" }, + { "deploy", ot_admin_builtin_deploy, + "Checkout revision REFSPEC as the new default deployment" }, + { "init-fs", ot_admin_builtin_init_fs, + "Initialize a root filesystem" }, + { "instutil", ot_admin_builtin_instutil, + "Provide instutil commands, allow admin to change boot configuration and relabel selinux " }, + { "os-init", ot_admin_builtin_os_init, + "Initialize empty state for given operating system" }, + { "set-origin", ot_admin_builtin_set_origin, + "Set Origin and create a new origin file" }, + { "status", ot_admin_builtin_status, + "List deployments" }, + { "switch", ot_admin_builtin_switch, + "Construct new tree from REF and deploy it" }, + { "undeploy", ot_admin_builtin_undeploy, + "Delete deployment INDEX" }, + { "unlock", ot_admin_builtin_unlock, + "Make the current deployment mutable (as a hotfix or development)" }, + { "upgrade", ot_admin_builtin_upgrade, + "Construct new tree from current origin and deploy it, if it changed" }, + { NULL, NULL, NULL } }; static GOptionContext * @@ -61,7 +74,9 @@ ostree_admin_option_context_new_with_commands (void) while (command->name != NULL) { - g_string_append_printf (summary, "\n %s", command->name); + g_string_append_printf (summary, "\n %-19s", command->name); + if (command->description != NULL) + g_string_append_printf (summary, "%s", command->description); command++; } diff --git a/src/ostree/ot-builtin-remote.c b/src/ostree/ot-builtin-remote.c index c9b3be35..0b1c02a2 100644 --- a/src/ostree/ot-builtin-remote.c +++ b/src/ostree/ot-builtin-remote.c @@ -28,22 +28,33 @@ typedef struct { const char *name; gboolean (*fn) (int argc, char **argv, GCancellable *cancellable, GError **error); + const char *description; } OstreeRemoteCommand; static OstreeRemoteCommand remote_subcommands[] = { - { "add", ot_remote_builtin_add }, - { "delete", ot_remote_builtin_delete }, - { "show-url", ot_remote_builtin_show_url }, - { "list", ot_remote_builtin_list }, - { "gpg-import", ot_remote_builtin_gpg_import }, + { "add", ot_remote_builtin_add, + "Add a remote repository" }, + { "delete", ot_remote_builtin_delete, + "Delete a remote repository" }, + { "show-url", ot_remote_builtin_show_url, + "Show remote repository URL" }, + { "list", ot_remote_builtin_list, + "List remote repository names" }, + { "gpg-import", ot_remote_builtin_gpg_import, + "Import GPG keys" }, #ifdef HAVE_LIBSOUP - { "add-cookie", ot_remote_builtin_add_cookie }, - { "delete-cookie", ot_remote_builtin_delete_cookie }, - { "list-cookies", ot_remote_builtin_list_cookies }, + { "add-cookie", ot_remote_builtin_add_cookie, + "Add a cookie to remote" }, + { "delete-cookie", ot_remote_builtin_delete_cookie, + "Remove one cookie from remote" }, + { "list-cookies", ot_remote_builtin_list_cookies, + "Show remote repository cookies" }, #endif - { "refs", ot_remote_builtin_refs }, - { "summary", ot_remote_builtin_summary }, - { NULL, NULL } + { "refs", ot_remote_builtin_refs, + "List remote refs" }, + { "summary", ot_remote_builtin_summary, + "Show remote summary" }, + { NULL, NULL, NULL } }; static GOptionContext * @@ -56,7 +67,10 @@ remote_option_context_new_with_commands (void) while (subcommand->name != NULL) { - g_string_append_printf (summary, "\n %s", subcommand->name); + g_string_append_printf (summary, "\n %-18s", subcommand->name); + if (subcommand->description != NULL) + g_string_append_printf (summary, "%s", subcommand->description); + subcommand++; } diff --git a/src/ostree/ot-builtin-static-delta.c b/src/ostree/ot-builtin-static-delta.c index c5d22dad..b2af1d66 100644 --- a/src/ostree/ot-builtin-static-delta.c +++ b/src/ostree/ot-builtin-static-delta.c @@ -50,12 +50,17 @@ BUILTINPROTO(apply_offline); #undef BUILTINPROTO static OstreeCommand static_delta_subcommands[] = { - { "list", ot_static_delta_builtin_list }, - { "show", ot_static_delta_builtin_show }, - { "delete", ot_static_delta_builtin_delete }, - { "generate", ot_static_delta_builtin_generate }, - { "apply-offline", ot_static_delta_builtin_apply_offline }, - { NULL, NULL } + { "list", ot_static_delta_builtin_list, + "List static delta files" }, + { "show", ot_static_delta_builtin_show, + "Dump information on a delta" }, + { "delete", ot_static_delta_builtin_delete, + "Remove a delta" }, + { "generate", ot_static_delta_builtin_generate, + "Generate static delta files" }, + { "apply-offline", ot_static_delta_builtin_apply_offline, + "Apply static delta file" }, + { NULL, NULL, NULL } }; /* ATTENTION: @@ -105,7 +110,7 @@ static_delta_usage (char **argv, while (command->name) { - print_func (" %s\n", command->name); + print_func (" %-17s%s\n", command->name, command->description ?: ""); command++; } diff --git a/src/ostree/ot-main.c b/src/ostree/ot-main.c index 8e8c4631..d81b802c 100644 --- a/src/ostree/ot-main.c +++ b/src/ostree/ot-main.c @@ -64,7 +64,11 @@ ostree_option_context_new_with_commands (OstreeCommand *commands) while (commands->name != NULL) { - g_string_append_printf (summary, "\n %s", commands->name); + g_string_append_printf (summary, "\n %-18s", commands->name); + + if (commands->description != NULL ) + g_string_append_printf (summary, "%s", commands->description); + commands++; } diff --git a/src/ostree/ot-main.h b/src/ostree/ot-main.h index 11fc287e..d795e531 100644 --- a/src/ostree/ot-main.h +++ b/src/ostree/ot-main.h @@ -40,6 +40,7 @@ typedef enum { typedef struct { const char *name; gboolean (*fn) (int argc, char **argv, GCancellable *cancellable, GError **error); + const char *description; } OstreeCommand; int ostree_run (int argc, char **argv, OstreeCommand *commands, GError **error); diff --git a/src/ostree/ot-remote-builtin-delete-cookie.c b/src/ostree/ot-remote-builtin-delete-cookie.c index ecb2451b..17f356a1 100644 --- a/src/ostree/ot-remote-builtin-delete-cookie.c +++ b/src/ostree/ot-remote-builtin-delete-cookie.c @@ -41,7 +41,7 @@ gboolean ot_remote_builtin_delete_cookie (int argc, char **argv, GCancellable *cancellable, GError **error) { g_autoptr(OstreeRepo) repo = NULL; - g_autoptr(GOptionContext) context = g_option_context_new ("NAME DOMAIN PATH COOKIE_NAME- Remote one cookie from remote"); + g_autoptr(GOptionContext) context = g_option_context_new ("NAME DOMAIN PATH COOKIE_NAME- Remove one cookie from remote"); if (!ostree_option_context_parse (context, option_entries, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) diff --git a/tests/test-help.sh b/tests/test-help.sh index ad74aaf9..840d6fb6 100755 --- a/tests/test-help.sh +++ b/tests/test-help.sh @@ -46,7 +46,8 @@ test_recursive() { test_usage_output out "$cmd" assert_file_empty err - builtins=`sed -n '/^Builtin \("[^"]*" \)\?Commands:$/,/^$/p' Date: Tue, 17 Oct 2017 17:25:04 +0000 Subject: [PATCH 67/98] ostree: move flags into command struct, pass down through builtins This is a similar approach as https://github.com/projectatomic/rpm-ostree/commit/12c34bb2491a07079c911ef26401fee939e5573c. One thing to note is when we parse the admin related functions, we still keep the old admin related flags, and added a new parameter to represent the command struct. This allows us to identify the caller of the function, making it easier for us to possibly deduplicate the subcommand handling in the future. A similar approach is done in rpm-ostree: https://github.com/projectatomic/rpm-ostree/commit/83aeb018c1012c7a43783c09b74ec71bc9c45826 This also makes it easier for us to change the prototype of the function. If we want to add something new in the future, we won't need to touch every prototype. Closes: #1267 Approved by: cgwalters --- src/ostree/main.c | 83 +++++++++++++------ src/ostree/ot-admin-builtin-cleanup.c | 4 +- src/ostree/ot-admin-builtin-deploy.c | 4 +- src/ostree/ot-admin-builtin-diff.c | 4 +- src/ostree/ot-admin-builtin-init-fs.c | 8 +- src/ostree/ot-admin-builtin-instutil.c | 30 ++++--- src/ostree/ot-admin-builtin-os-init.c | 4 +- src/ostree/ot-admin-builtin-set-origin.c | 4 +- src/ostree/ot-admin-builtin-status.c | 4 +- src/ostree/ot-admin-builtin-switch.c | 4 +- src/ostree/ot-admin-builtin-undeploy.c | 4 +- src/ostree/ot-admin-builtin-unlock.c | 4 +- src/ostree/ot-admin-builtin-upgrade.c | 4 +- src/ostree/ot-admin-builtins.h | 34 ++++---- ...ot-admin-instutil-builtin-grub2-generate.c | 4 +- ...-instutil-builtin-selinux-ensure-labeled.c | 4 +- .../ot-admin-instutil-builtin-set-kargs.c | 4 +- src/ostree/ot-admin-instutil-builtins.h | 6 +- src/ostree/ot-builtin-admin.c | 57 +++++++------ src/ostree/ot-builtin-cat.c | 4 +- src/ostree/ot-builtin-checkout.c | 4 +- src/ostree/ot-builtin-checksum.c | 4 +- src/ostree/ot-builtin-commit.c | 4 +- src/ostree/ot-builtin-config.c | 4 +- src/ostree/ot-builtin-create-usb.c | 3 +- src/ostree/ot-builtin-diff.c | 4 +- src/ostree/ot-builtin-export.c | 4 +- src/ostree/ot-builtin-find-remotes.c | 3 +- src/ostree/ot-builtin-fsck.c | 4 +- src/ostree/ot-builtin-gpg-sign.c | 4 +- src/ostree/ot-builtin-init.c | 4 +- src/ostree/ot-builtin-log.c | 3 +- src/ostree/ot-builtin-ls.c | 4 +- src/ostree/ot-builtin-prune.c | 4 +- src/ostree/ot-builtin-pull-local.c | 4 +- src/ostree/ot-builtin-pull.c | 4 +- src/ostree/ot-builtin-refs.c | 4 +- src/ostree/ot-builtin-remote.c | 51 +++++++----- src/ostree/ot-builtin-reset.c | 3 +- src/ostree/ot-builtin-rev-parse.c | 4 +- src/ostree/ot-builtin-show.c | 4 +- src/ostree/ot-builtin-static-delta.c | 44 +++++----- src/ostree/ot-builtin-summary.c | 4 +- src/ostree/ot-builtin-trivial-httpd.c | 2 +- src/ostree/ot-builtins.h | 2 +- src/ostree/ot-main.c | 14 ++-- src/ostree/ot-main.h | 19 ++++- src/ostree/ot-remote-builtin-add-cookie.c | 4 +- src/ostree/ot-remote-builtin-add.c | 4 +- src/ostree/ot-remote-builtin-delete-cookie.c | 4 +- src/ostree/ot-remote-builtin-delete.c | 4 +- src/ostree/ot-remote-builtin-gpg-import.c | 4 +- src/ostree/ot-remote-builtin-list-cookies.c | 4 +- src/ostree/ot-remote-builtin-list.c | 4 +- src/ostree/ot-remote-builtin-refs.c | 4 +- src/ostree/ot-remote-builtin-show-url.c | 4 +- src/ostree/ot-remote-builtin-summary.c | 4 +- src/ostree/ot-remote-builtins.h | 26 +++--- 58 files changed, 316 insertions(+), 236 deletions(-) diff --git a/src/ostree/main.c b/src/ostree/main.c index ef8f1f8a..4ae261d6 100644 --- a/src/ostree/main.c +++ b/src/ostree/main.c @@ -32,62 +32,93 @@ #include "ot-builtins.h" static OstreeCommand commands[] = { - { "admin", ostree_builtin_admin , + /* Note: all admin related commands have + * no_repo as their command flag, but each + * admin command may have their own + * admin flag + */ + { "admin", OSTREE_BUILTIN_FLAG_NO_REPO, + ostree_builtin_admin, "Commands that needs admin privilege" }, - { "cat", ostree_builtin_cat, + { "cat", OSTREE_BUILTIN_FLAG_NONE, + ostree_builtin_cat, "Concatenate contents of files"}, - { "checkout", ostree_builtin_checkout, + { "checkout", OSTREE_BUILTIN_FLAG_NONE, + ostree_builtin_checkout, "Check out a commit into a filesystem tree" }, - { "checksum", ostree_builtin_checksum, + { "checksum", OSTREE_BUILTIN_FLAG_NO_REPO, + ostree_builtin_checksum, "Checksum a file or directory" }, - { "commit", ostree_builtin_commit, + { "commit", OSTREE_BUILTIN_FLAG_NONE, + ostree_builtin_commit, "Commit a new revision" }, - { "config", ostree_builtin_config, + { "config", OSTREE_BUILTIN_FLAG_NONE, + ostree_builtin_config, "Change repo configuration settings" }, - { "diff", ostree_builtin_diff, + { "diff", OSTREE_BUILTIN_FLAG_NONE, + ostree_builtin_diff, "Compare directory TARGETDIR against revision REV"}, - { "export", ostree_builtin_export, + { "export", OSTREE_BUILTIN_FLAG_NONE, + ostree_builtin_export, "Stream COMMIT to stdout in tar format" }, #ifdef OSTREE_ENABLE_EXPERIMENTAL_API - { "find-remotes", ostree_builtin_find_remotes, + { "find-remotes", OSTREE_BUILTIN_FLAG_NONE, + ostree_builtin_find_remotes, "Find remotes to serve the given refs" }, - { "create-usb", ostree_builtin_create_usb, + { "create-usb", OSTREE_BUILTIN_FLAG_NONE, + ostree_builtin_create_usb, "Copy the refs to a USB stick" }, #endif - { "fsck", ostree_builtin_fsck, + { "fsck", OSTREE_BUILTIN_FLAG_NONE, + ostree_builtin_fsck, "Check the repository for consistency" }, - { "gpg-sign", ostree_builtin_gpg_sign, + { "gpg-sign", OSTREE_BUILTIN_FLAG_NONE, + ostree_builtin_gpg_sign, "Sign a commit" }, - { "init", ostree_builtin_init, + { "init", OSTREE_BUILTIN_FLAG_NO_CHECK, + ostree_builtin_init, "Initialize a new empty repository" }, - { "log", ostree_builtin_log, + { "log", OSTREE_BUILTIN_FLAG_NONE, + ostree_builtin_log, "Show log starting at commit or ref" }, - { "ls", ostree_builtin_ls, + { "ls", OSTREE_BUILTIN_FLAG_NONE, + ostree_builtin_ls, "List file paths" }, - { "prune", ostree_builtin_prune, + { "prune", OSTREE_BUILTIN_FLAG_NONE, + ostree_builtin_prune, "Search for unreachable objects" }, - { "pull-local", ostree_builtin_pull_local, + { "pull-local", OSTREE_BUILTIN_FLAG_NONE, + ostree_builtin_pull_local, "Copy data from SRC_REPO" }, #ifdef HAVE_LIBCURL_OR_LIBSOUP - { "pull", ostree_builtin_pull, + { "pull", OSTREE_BUILTIN_FLAG_NONE, + ostree_builtin_pull, "Download data from remote repository" }, #endif - { "refs", ostree_builtin_refs, + { "refs", OSTREE_BUILTIN_FLAG_NONE, + ostree_builtin_refs, "List refs" }, - { "remote", ostree_builtin_remote, + { "remote", OSTREE_BUILTIN_FLAG_NO_REPO, + ostree_builtin_remote, "Remote commands that may involve internet access" }, - { "reset", ostree_builtin_reset, + { "reset", OSTREE_BUILTIN_FLAG_NONE, + ostree_builtin_reset, "Reset a REF to a previous COMMIT" }, - { "rev-parse", ostree_builtin_rev_parse, + { "rev-parse", OSTREE_BUILTIN_FLAG_NONE, + ostree_builtin_rev_parse, "Output the target of a rev" }, - { "show", ostree_builtin_show, + { "show", OSTREE_BUILTIN_FLAG_NONE, + ostree_builtin_show, "Output a metadata object" }, - { "static-delta", ostree_builtin_static_delta, + { "static-delta", OSTREE_BUILTIN_FLAG_NONE, + ostree_builtin_static_delta, "Static delta related commands" }, - { "summary", ostree_builtin_summary, + { "summary", OSTREE_BUILTIN_FLAG_NONE, + ostree_builtin_summary, "Manage summary metadata" }, #if defined(HAVE_LIBSOUP) && defined(BUILDOPT_ENABLE_TRIVIAL_HTTPD_CMDLINE) - { "trivial-httpd", ostree_builtin_trivial_httpd, + { "trivial-httpd", OSTREE_BUILTIN_FLAG_NONE, + ostree_builtin_trivial_httpd, NULL }, #endif { NULL } diff --git a/src/ostree/ot-admin-builtin-cleanup.c b/src/ostree/ot-admin-builtin-cleanup.c index 954f8d8a..bc7a724b 100644 --- a/src/ostree/ot-admin-builtin-cleanup.c +++ b/src/ostree/ot-admin-builtin-cleanup.c @@ -38,7 +38,7 @@ static GOptionEntry options[] = { }; gboolean -ot_admin_builtin_cleanup (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_admin_builtin_cleanup (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = NULL; g_autoptr(OstreeSysroot) sysroot = NULL; @@ -48,7 +48,7 @@ ot_admin_builtin_cleanup (int argc, char **argv, GCancellable *cancellable, GErr if (!ostree_admin_option_context_parse (context, options, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER, - &sysroot, cancellable, error)) + invocation, &sysroot, cancellable, error)) goto out; if (!ostree_sysroot_cleanup (sysroot, cancellable, error)) diff --git a/src/ostree/ot-admin-builtin-deploy.c b/src/ostree/ot-admin-builtin-deploy.c index 10ac57de..6bfc09ee 100644 --- a/src/ostree/ot-admin-builtin-deploy.c +++ b/src/ostree/ot-admin-builtin-deploy.c @@ -60,7 +60,7 @@ static GOptionEntry options[] = { }; gboolean -ot_admin_builtin_deploy (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_admin_builtin_deploy (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { __attribute__((cleanup(_ostree_kernel_args_cleanup))) OstreeKernelArgs *kargs = NULL; @@ -70,7 +70,7 @@ ot_admin_builtin_deploy (int argc, char **argv, GCancellable *cancellable, GErro g_autoptr(OstreeSysroot) sysroot = NULL; if (!ostree_admin_option_context_parse (context, options, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER, - &sysroot, cancellable, error)) + invocation, &sysroot, cancellable, error)) return FALSE; if (argc < 2) diff --git a/src/ostree/ot-admin-builtin-diff.c b/src/ostree/ot-admin-builtin-diff.c index 6afe4fae..ec8f692e 100644 --- a/src/ostree/ot-admin-builtin-diff.c +++ b/src/ostree/ot-admin-builtin-diff.c @@ -41,7 +41,7 @@ static GOptionEntry options[] = { }; gboolean -ot_admin_builtin_diff (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_admin_builtin_diff (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = NULL; g_autoptr(OstreeSysroot) sysroot = NULL; @@ -60,7 +60,7 @@ ot_admin_builtin_diff (int argc, char **argv, GCancellable *cancellable, GError if (!ostree_admin_option_context_parse (context, options, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER | OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED, - &sysroot, cancellable, error)) + invocation, &sysroot, cancellable, error)) goto out; if (!ot_admin_require_booted_deployment_or_osname (sysroot, opt_osname, diff --git a/src/ostree/ot-admin-builtin-init-fs.c b/src/ostree/ot-admin-builtin-init-fs.c index 3ef9017f..e1c0e439 100644 --- a/src/ostree/ot-admin-builtin-init-fs.c +++ b/src/ostree/ot-admin-builtin-init-fs.c @@ -38,15 +38,15 @@ static GOptionEntry options[] = { }; gboolean -ot_admin_builtin_init_fs (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_admin_builtin_init_fs (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = g_option_context_new ("PATH - Initialize a root filesystem"); if (!ostree_admin_option_context_parse (context, options, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER | - OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED | - OSTREE_ADMIN_BUILTIN_FLAG_NO_SYSROOT, - NULL, cancellable, error)) + OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED | + OSTREE_ADMIN_BUILTIN_FLAG_NO_SYSROOT, + invocation, NULL, cancellable, error)) return FALSE; if (argc < 2) diff --git a/src/ostree/ot-admin-builtin-instutil.c b/src/ostree/ot-admin-builtin-instutil.c index 428c0a2c..0ee3b3f2 100644 --- a/src/ostree/ot-admin-builtin-instutil.c +++ b/src/ostree/ot-admin-builtin-instutil.c @@ -28,28 +28,25 @@ #include -typedef struct { - const char *name; - gboolean (*fn) (int argc, char **argv, GCancellable *cancellable, GError **error); - const char *description; -} OstreeAdminInstUtilCommand; - -static OstreeAdminInstUtilCommand admin_instutil_subcommands[] = { +static OstreeCommand admin_instutil_subcommands[] = { #ifdef HAVE_SELINUX - { "selinux-ensure-labeled", ot_admin_instutil_builtin_selinux_ensure_labeled, + { "selinux-ensure-labeled", OSTREE_BUILTIN_FLAG_NO_REPO, + ot_admin_instutil_builtin_selinux_ensure_labeled, "Relabel all or part of a deployment" }, #endif - { "set-kargs", ot_admin_instutil_builtin_set_kargs, + { "set-kargs", OSTREE_BUILTIN_FLAG_NO_REPO, + ot_admin_instutil_builtin_set_kargs, "Set new kernel command line arguments(Not stable)" }, - { "grub2-generate", ot_admin_instutil_builtin_grub2_generate, + { "grub2-generate", OSTREE_BUILTIN_FLAG_NO_REPO, + ot_admin_instutil_builtin_grub2_generate, "Generate GRUB2 configuration from given BLS entries" }, - { NULL, NULL, NULL } + { NULL, 0, NULL, NULL } }; static GOptionContext * ostree_admin_instutil_option_context_new_with_commands (void) { - OstreeAdminInstUtilCommand *command = admin_instutil_subcommands; + OstreeCommand *command = admin_instutil_subcommands; GOptionContext *context = g_option_context_new ("COMMAND"); g_autoptr(GString) summary = g_string_new ("Builtin \"admin instutil\" Commands:"); @@ -69,7 +66,7 @@ ostree_admin_instutil_option_context_new_with_commands (void) } gboolean -ot_admin_builtin_instutil (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_admin_builtin_instutil (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { const char *subcommand_name = NULL; int in, out; @@ -97,7 +94,7 @@ ot_admin_builtin_instutil (int argc, char **argv, GCancellable *cancellable, GEr argc = out; - OstreeAdminInstUtilCommand *subcommand = admin_instutil_subcommands; + OstreeCommand *subcommand = admin_instutil_subcommands; while (subcommand->name) { if (g_strcmp0 (subcommand_name, subcommand->name) == 0) @@ -113,7 +110,7 @@ ot_admin_builtin_instutil (int argc, char **argv, GCancellable *cancellable, GEr /* This will not return for some options (e.g. --version). */ if (ostree_admin_option_context_parse (context, NULL, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_NO_SYSROOT, - NULL, cancellable, error)) + invocation, NULL, cancellable, error)) { if (subcommand_name == NULL) { @@ -135,7 +132,8 @@ ot_admin_builtin_instutil (int argc, char **argv, GCancellable *cancellable, GEr g_autofree char *prgname = g_strdup_printf ("%s %s", g_get_prgname (), subcommand_name); g_set_prgname (prgname); - if (!subcommand->fn (argc, argv, cancellable, error)) + OstreeCommandInvocation sub_invocation = { .command = subcommand }; + if (!subcommand->fn (argc, argv, &sub_invocation, cancellable, error)) return FALSE; return TRUE; diff --git a/src/ostree/ot-admin-builtin-os-init.c b/src/ostree/ot-admin-builtin-os-init.c index b325ab32..a6a11f99 100644 --- a/src/ostree/ot-admin-builtin-os-init.c +++ b/src/ostree/ot-admin-builtin-os-init.c @@ -38,7 +38,7 @@ static GOptionEntry options[] = { }; gboolean -ot_admin_builtin_os_init (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_admin_builtin_os_init (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = NULL; g_autoptr(OstreeSysroot) sysroot = NULL; @@ -49,7 +49,7 @@ ot_admin_builtin_os_init (int argc, char **argv, GCancellable *cancellable, GErr if (!ostree_admin_option_context_parse (context, options, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER | OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED, - &sysroot, cancellable, error)) + invocation, &sysroot, cancellable, error)) goto out; if (!ostree_sysroot_ensure_initialized (sysroot, cancellable, error)) diff --git a/src/ostree/ot-admin-builtin-set-origin.c b/src/ostree/ot-admin-builtin-set-origin.c index 0332d882..0f6fd259 100644 --- a/src/ostree/ot-admin-builtin-set-origin.c +++ b/src/ostree/ot-admin-builtin-set-origin.c @@ -45,7 +45,7 @@ static GOptionEntry options[] = { }; gboolean -ot_admin_builtin_set_origin (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_admin_builtin_set_origin (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { gboolean ret = FALSE; g_autoptr(GOptionContext) context = NULL; @@ -60,7 +60,7 @@ ot_admin_builtin_set_origin (int argc, char **argv, GCancellable *cancellable, G if (!ostree_admin_option_context_parse (context, options, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER, - &sysroot, cancellable, error)) + invocation, &sysroot, cancellable, error)) goto out; if (argc < 3) diff --git a/src/ostree/ot-admin-builtin-status.c b/src/ostree/ot-admin-builtin-status.c index f076c592..b88c2fba 100644 --- a/src/ostree/ot-admin-builtin-status.c +++ b/src/ostree/ot-admin-builtin-status.c @@ -85,7 +85,7 @@ out: } gboolean -ot_admin_builtin_status (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_admin_builtin_status (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = NULL; g_autoptr(OstreeSysroot) sysroot = NULL; @@ -104,7 +104,7 @@ ot_admin_builtin_status (int argc, char **argv, GCancellable *cancellable, GErro if (!ostree_admin_option_context_parse (context, options, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED, - &sysroot, cancellable, error)) + invocation, &sysroot, cancellable, error)) goto out; if (!ostree_sysroot_get_repo (sysroot, &repo, cancellable, error)) diff --git a/src/ostree/ot-admin-builtin-switch.c b/src/ostree/ot-admin-builtin-switch.c index 56e731b2..1b1082d5 100644 --- a/src/ostree/ot-admin-builtin-switch.c +++ b/src/ostree/ot-admin-builtin-switch.c @@ -44,14 +44,14 @@ static GOptionEntry options[] = { }; gboolean -ot_admin_builtin_switch (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_admin_builtin_switch (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = g_option_context_new ("REF - Construct new tree from REF and deploy it"); g_autoptr(OstreeSysroot) sysroot = NULL; if (!ostree_admin_option_context_parse (context, options, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER, - &sysroot, cancellable, error)) + invocation, &sysroot, cancellable, error)) return FALSE; if (argc < 2) diff --git a/src/ostree/ot-admin-builtin-undeploy.c b/src/ostree/ot-admin-builtin-undeploy.c index 6ca8e3a3..3bddd6cb 100644 --- a/src/ostree/ot-admin-builtin-undeploy.c +++ b/src/ostree/ot-admin-builtin-undeploy.c @@ -37,7 +37,7 @@ static GOptionEntry options[] = { }; gboolean -ot_admin_builtin_undeploy (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_admin_builtin_undeploy (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = NULL; g_autoptr(OstreeSysroot) sysroot = NULL; @@ -50,7 +50,7 @@ ot_admin_builtin_undeploy (int argc, char **argv, GCancellable *cancellable, GEr if (!ostree_admin_option_context_parse (context, options, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER, - &sysroot, cancellable, error)) + invocation, &sysroot, cancellable, error)) return FALSE; if (argc < 2) diff --git a/src/ostree/ot-admin-builtin-unlock.c b/src/ostree/ot-admin-builtin-unlock.c index 1b6d9203..cb3598fd 100644 --- a/src/ostree/ot-admin-builtin-unlock.c +++ b/src/ostree/ot-admin-builtin-unlock.c @@ -43,7 +43,7 @@ static GOptionEntry options[] = { }; gboolean -ot_admin_builtin_unlock (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_admin_builtin_unlock (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { gboolean ret = FALSE; g_autoptr(GOptionContext) context = NULL; @@ -55,7 +55,7 @@ ot_admin_builtin_unlock (int argc, char **argv, GCancellable *cancellable, GErro if (!ostree_admin_option_context_parse (context, options, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER, - &sysroot, cancellable, error)) + invocation, &sysroot, cancellable, error)) goto out; if (argc > 1) diff --git a/src/ostree/ot-admin-builtin-upgrade.c b/src/ostree/ot-admin-builtin-upgrade.c index dfda4d5f..c0542f3e 100644 --- a/src/ostree/ot-admin-builtin-upgrade.c +++ b/src/ostree/ot-admin-builtin-upgrade.c @@ -54,14 +54,14 @@ static GOptionEntry options[] = { }; gboolean -ot_admin_builtin_upgrade (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_admin_builtin_upgrade (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = g_option_context_new ("Construct new tree from current origin and deploy it, if it changed"); g_autoptr(OstreeSysroot) sysroot = NULL; if (!ostree_admin_option_context_parse (context, options, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER, - &sysroot, cancellable, error)) + invocation, &sysroot, cancellable, error)) return FALSE; if (opt_pull_only && opt_deploy_only) diff --git a/src/ostree/ot-admin-builtins.h b/src/ostree/ot-admin-builtins.h index 75cd1448..1d62daf8 100644 --- a/src/ostree/ot-admin-builtins.h +++ b/src/ostree/ot-admin-builtins.h @@ -25,19 +25,25 @@ G_BEGIN_DECLS -gboolean ot_admin_builtin_selinux_ensure_labeled (int argc, char **argv, GCancellable *cancellable, GError **error); -gboolean ot_admin_builtin_os_init (int argc, char **argv, GCancellable *cancellable, GError **error); -gboolean ot_admin_builtin_install (int argc, char **argv, GCancellable *cancellable, GError **error); -gboolean ot_admin_builtin_instutil (int argc, char **argv, GCancellable *cancellable, GError **error); -gboolean ot_admin_builtin_init_fs (int argc, char **argv, GCancellable *cancellable, GError **error); -gboolean ot_admin_builtin_undeploy (int argc, char **argv, GCancellable *cancellable, GError **error); -gboolean ot_admin_builtin_deploy (int argc, char **argv, GCancellable *cancellable, GError **error); -gboolean ot_admin_builtin_cleanup (int argc, char **argv, GCancellable *cancellable, GError **error); -gboolean ot_admin_builtin_unlock (int argc, char **argv, GCancellable *cancellable, GError **error); -gboolean ot_admin_builtin_status (int argc, char **argv, GCancellable *cancellable, GError **error); -gboolean ot_admin_builtin_set_origin (int argc, char **argv, GCancellable *cancellable, GError **error); -gboolean ot_admin_builtin_diff (int argc, char **argv, GCancellable *cancellable, GError **error); -gboolean ot_admin_builtin_switch (int argc, char **argv, GCancellable *cancellable, GError **error); -gboolean ot_admin_builtin_upgrade (int argc, char **argv, GCancellable *cancellable, GError **error); +#define BUILTINPROTO(name) gboolean ot_admin_builtin_ ## name (int argc, char **argv, \ + OstreeCommandInvocation *invocation, \ + GCancellable *cancellable, GError **error) + +BUILTINPROTO(selinux_ensure_labeled); +BUILTINPROTO(os_init); +BUILTINPROTO(install); +BUILTINPROTO(instutil); +BUILTINPROTO(init_fs); +BUILTINPROTO(undeploy); +BUILTINPROTO(deploy); +BUILTINPROTO(cleanup); +BUILTINPROTO(unlock); +BUILTINPROTO(status); +BUILTINPROTO(set_origin); +BUILTINPROTO(diff); +BUILTINPROTO(switch); +BUILTINPROTO(upgrade); + +#undef BUILTINPROTO G_END_DECLS diff --git a/src/ostree/ot-admin-instutil-builtin-grub2-generate.c b/src/ostree/ot-admin-instutil-builtin-grub2-generate.c index 64d2ae2a..a7eb0d4f 100644 --- a/src/ostree/ot-admin-instutil-builtin-grub2-generate.c +++ b/src/ostree/ot-admin-instutil-builtin-grub2-generate.c @@ -38,7 +38,7 @@ static GOptionEntry options[] = { }; gboolean -ot_admin_instutil_builtin_grub2_generate (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_admin_instutil_builtin_grub2_generate (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { gboolean ret = FALSE; guint bootversion; @@ -49,7 +49,7 @@ ot_admin_instutil_builtin_grub2_generate (int argc, char **argv, GCancellable *c if (!ostree_admin_option_context_parse (context, options, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER | OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED, - &sysroot, cancellable, error)) + invocation, &sysroot, cancellable, error)) goto out; if (argc >= 2) diff --git a/src/ostree/ot-admin-instutil-builtin-selinux-ensure-labeled.c b/src/ostree/ot-admin-instutil-builtin-selinux-ensure-labeled.c index 135bcf42..ca3fab17 100644 --- a/src/ostree/ot-admin-instutil-builtin-selinux-ensure-labeled.c +++ b/src/ostree/ot-admin-instutil-builtin-selinux-ensure-labeled.c @@ -183,7 +183,7 @@ static GOptionEntry options[] = { }; gboolean -ot_admin_instutil_builtin_selinux_ensure_labeled (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_admin_instutil_builtin_selinux_ensure_labeled (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { gboolean ret = FALSE; const char *policy_name; @@ -200,7 +200,7 @@ ot_admin_instutil_builtin_selinux_ensure_labeled (int argc, char **argv, GCancel if (!ostree_admin_option_context_parse (context, options, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER | OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED, - &sysroot, cancellable, error)) + invocation, &sysroot, cancellable, error)) goto out; deployments = ostree_sysroot_get_deployments (sysroot); diff --git a/src/ostree/ot-admin-instutil-builtin-set-kargs.c b/src/ostree/ot-admin-instutil-builtin-set-kargs.c index f8db6c6b..7419581c 100644 --- a/src/ostree/ot-admin-instutil-builtin-set-kargs.c +++ b/src/ostree/ot-admin-instutil-builtin-set-kargs.c @@ -48,7 +48,7 @@ static GOptionEntry options[] = { }; gboolean -ot_admin_instutil_builtin_set_kargs (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_admin_instutil_builtin_set_kargs (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { gboolean ret = FALSE; guint i; @@ -62,7 +62,7 @@ ot_admin_instutil_builtin_set_kargs (int argc, char **argv, GCancellable *cancel if (!ostree_admin_option_context_parse (context, options, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER | OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED, - &sysroot, cancellable, error)) + invocation, &sysroot, cancellable, error)) goto out; deployments = ostree_sysroot_get_deployments (sysroot); diff --git a/src/ostree/ot-admin-instutil-builtins.h b/src/ostree/ot-admin-instutil-builtins.h index 748a7938..b0277e71 100644 --- a/src/ostree/ot-admin-instutil-builtins.h +++ b/src/ostree/ot-admin-instutil-builtins.h @@ -23,8 +23,8 @@ G_BEGIN_DECLS -gboolean ot_admin_instutil_builtin_selinux_ensure_labeled (int argc, char **argv, GCancellable *cancellable, GError **error); -gboolean ot_admin_instutil_builtin_set_kargs (int argc, char **argv, GCancellable *cancellable, GError **error); -gboolean ot_admin_instutil_builtin_grub2_generate (int argc, char **argv, GCancellable *cancellable, GError **error); +gboolean ot_admin_instutil_builtin_selinux_ensure_labeled (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error); +gboolean ot_admin_instutil_builtin_set_kargs (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error); +gboolean ot_admin_instutil_builtin_grub2_generate (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error); G_END_DECLS diff --git a/src/ostree/ot-builtin-admin.c b/src/ostree/ot-builtin-admin.c index ba9dc28d..17033ecf 100644 --- a/src/ostree/ot-builtin-admin.c +++ b/src/ostree/ot-builtin-admin.c @@ -30,44 +30,50 @@ #include -typedef struct { - const char *name; - gboolean (*fn) (int argc, char **argv, GCancellable *cancellable, GError **error); - const char *description; -} OstreeAdminCommand; - -static OstreeAdminCommand admin_subcommands[] = { - { "cleanup", ot_admin_builtin_cleanup, +static OstreeCommand admin_subcommands[] = { + { "cleanup", OSTREE_BUILTIN_FLAG_NO_REPO, + ot_admin_builtin_cleanup, "Delete untagged deployments and repository objects" }, - { "config-diff", ot_admin_builtin_diff, + { "config-diff", OSTREE_BUILTIN_FLAG_NO_REPO, + ot_admin_builtin_diff, "Diff current /etc configuration versus default" }, - { "deploy", ot_admin_builtin_deploy, + { "deploy", OSTREE_BUILTIN_FLAG_NO_REPO, + ot_admin_builtin_deploy, "Checkout revision REFSPEC as the new default deployment" }, - { "init-fs", ot_admin_builtin_init_fs, + { "init-fs", OSTREE_BUILTIN_FLAG_NO_REPO, + ot_admin_builtin_init_fs, "Initialize a root filesystem" }, - { "instutil", ot_admin_builtin_instutil, + { "instutil", OSTREE_BUILTIN_FLAG_NO_REPO, + ot_admin_builtin_instutil, "Provide instutil commands, allow admin to change boot configuration and relabel selinux " }, - { "os-init", ot_admin_builtin_os_init, + { "os-init", OSTREE_BUILTIN_FLAG_NO_REPO, + ot_admin_builtin_os_init, "Initialize empty state for given operating system" }, - { "set-origin", ot_admin_builtin_set_origin, + { "set-origin", OSTREE_BUILTIN_FLAG_NO_REPO, + ot_admin_builtin_set_origin, "Set Origin and create a new origin file" }, - { "status", ot_admin_builtin_status, + { "status", OSTREE_BUILTIN_FLAG_NO_REPO, + ot_admin_builtin_status, "List deployments" }, - { "switch", ot_admin_builtin_switch, + { "switch", OSTREE_BUILTIN_FLAG_NO_REPO, + ot_admin_builtin_switch, "Construct new tree from REF and deploy it" }, - { "undeploy", ot_admin_builtin_undeploy, + { "undeploy", OSTREE_BUILTIN_FLAG_NO_REPO, + ot_admin_builtin_undeploy, "Delete deployment INDEX" }, - { "unlock", ot_admin_builtin_unlock, + { "unlock", OSTREE_BUILTIN_FLAG_NO_REPO, + ot_admin_builtin_unlock, "Make the current deployment mutable (as a hotfix or development)" }, - { "upgrade", ot_admin_builtin_upgrade, + { "upgrade", OSTREE_BUILTIN_FLAG_NO_REPO, + ot_admin_builtin_upgrade, "Construct new tree from current origin and deploy it, if it changed" }, - { NULL, NULL, NULL } + { NULL, 0, NULL, NULL } }; static GOptionContext * ostree_admin_option_context_new_with_commands (void) { - OstreeAdminCommand *command = admin_subcommands; + OstreeCommand *command = admin_subcommands; GOptionContext *context = g_option_context_new ("--print-current-dir|COMMAND"); g_autoptr(GString) summary = g_string_new ("Builtin \"admin\" Commands:"); @@ -86,11 +92,11 @@ ostree_admin_option_context_new_with_commands (void) } gboolean -ostree_builtin_admin (int argc, char **argv, GCancellable *cancellable, GError **error) +ostree_builtin_admin (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { gboolean ret = FALSE; const char *subcommand_name = NULL; - OstreeAdminCommand *subcommand; + OstreeCommand *subcommand; g_autofree char *prgname = NULL; int in, out; @@ -141,7 +147,7 @@ ostree_builtin_admin (int argc, char **argv, GCancellable *cancellable, GError * /* This will not return for some options (e.g. --version). */ if (ostree_admin_option_context_parse (context, NULL, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_NO_SYSROOT, - NULL, cancellable, error)) + invocation, NULL, cancellable, error)) { if (subcommand_name == NULL) { @@ -164,7 +170,8 @@ ostree_builtin_admin (int argc, char **argv, GCancellable *cancellable, GError * prgname = g_strdup_printf ("%s %s", g_get_prgname (), subcommand_name); g_set_prgname (prgname); - if (!subcommand->fn (argc, argv, cancellable, error)) + OstreeCommandInvocation sub_invocation = { .command = subcommand }; + if (!subcommand->fn (argc, argv, &sub_invocation, cancellable, error)) goto out; ret = TRUE; diff --git a/src/ostree/ot-builtin-cat.c b/src/ostree/ot-builtin-cat.c index 6f2c466c..88bd4fdb 100644 --- a/src/ostree/ot-builtin-cat.c +++ b/src/ostree/ot-builtin-cat.c @@ -55,11 +55,11 @@ cat_one_file (GFile *f, } gboolean -ostree_builtin_cat (int argc, char **argv, GCancellable *cancellable, GError **error) +ostree_builtin_cat (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = g_option_context_new ("COMMIT PATH... - Concatenate contents of files"); g_autoptr(OstreeRepo) repo = NULL; - if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) return FALSE; if (argc <= 2) diff --git a/src/ostree/ot-builtin-checkout.c b/src/ostree/ot-builtin-checkout.c index e774713e..79718c9c 100644 --- a/src/ostree/ot-builtin-checkout.c +++ b/src/ostree/ot-builtin-checkout.c @@ -279,7 +279,7 @@ process_many_checkouts (OstreeRepo *repo, } gboolean -ostree_builtin_checkout (int argc, char **argv, GCancellable *cancellable, GError **error) +ostree_builtin_checkout (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = NULL; g_autoptr(OstreeRepo) repo = NULL; @@ -290,7 +290,7 @@ ostree_builtin_checkout (int argc, char **argv, GCancellable *cancellable, GErro context = g_option_context_new ("COMMIT [DESTINATION] - Check out a commit into a filesystem tree"); - if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; if (opt_disable_fsync) diff --git a/src/ostree/ot-builtin-checksum.c b/src/ostree/ot-builtin-checksum.c index 008c4fe7..24689ac6 100644 --- a/src/ostree/ot-builtin-checksum.c +++ b/src/ostree/ot-builtin-checksum.c @@ -66,12 +66,12 @@ on_checksum_received (GObject *obj, } gboolean -ostree_builtin_checksum (int argc, char **argv, GCancellable *cancellable, GError **error) +ostree_builtin_checksum (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = g_option_context_new ("PATH - Checksum a file or directory"); if (!ostree_option_context_parse (context, options, &argc, &argv, - OSTREE_BUILTIN_FLAG_NO_REPO, NULL, cancellable, error)) + invocation, NULL, cancellable, error)) return FALSE; if (argc < 2) diff --git a/src/ostree/ot-builtin-commit.c b/src/ostree/ot-builtin-commit.c index b10e8d2d..7df1dfe1 100644 --- a/src/ostree/ot-builtin-commit.c +++ b/src/ostree/ot-builtin-commit.c @@ -407,7 +407,7 @@ fill_bindings (OstreeRepo *repo, } gboolean -ostree_builtin_commit (int argc, char **argv, GCancellable *cancellable, GError **error) +ostree_builtin_commit (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = NULL; g_autoptr(OstreeRepo) repo = NULL; @@ -433,7 +433,7 @@ ostree_builtin_commit (int argc, char **argv, GCancellable *cancellable, GError context = g_option_context_new ("[PATH] - Commit a new revision"); - if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; if (!ostree_ensure_repo_writable (repo, error)) diff --git a/src/ostree/ot-builtin-config.c b/src/ostree/ot-builtin-config.c index 6813305c..94e36465 100644 --- a/src/ostree/ot-builtin-config.c +++ b/src/ostree/ot-builtin-config.c @@ -56,7 +56,7 @@ split_key_string (const char *k, } gboolean -ostree_builtin_config (int argc, char **argv, GCancellable *cancellable, GError **error) +ostree_builtin_config (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = NULL; g_autoptr(OstreeRepo) repo = NULL; @@ -70,7 +70,7 @@ ostree_builtin_config (int argc, char **argv, GCancellable *cancellable, GError context = g_option_context_new ("(get KEY|set KEY VALUE) - Change repo configuration settings"); - if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; if (argc < 2) diff --git a/src/ostree/ot-builtin-create-usb.c b/src/ostree/ot-builtin-create-usb.c index 97b0059a..fcde36c0 100644 --- a/src/ostree/ot-builtin-create-usb.c +++ b/src/ostree/ot-builtin-create-usb.c @@ -43,6 +43,7 @@ static GOptionEntry options[] = gboolean ostree_builtin_create_usb (int argc, char **argv, + OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { @@ -55,7 +56,7 @@ ostree_builtin_create_usb (int argc, /* Parse options. */ g_autoptr(OstreeRepo) src_repo = NULL; - if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &src_repo, cancellable, error)) + if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &src_repo, cancellable, error)) return FALSE; if (argc < 2) diff --git a/src/ostree/ot-builtin-diff.c b/src/ostree/ot-builtin-diff.c index 465e2506..9cd7141b 100644 --- a/src/ostree/ot-builtin-diff.c +++ b/src/ostree/ot-builtin-diff.c @@ -126,7 +126,7 @@ object_set_total_size (OstreeRepo *repo, } gboolean -ostree_builtin_diff (int argc, char **argv, GCancellable *cancellable, GError **error) +ostree_builtin_diff (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { gboolean ret = FALSE; g_autoptr(GOptionContext) context = NULL; @@ -142,7 +142,7 @@ ostree_builtin_diff (int argc, char **argv, GCancellable *cancellable, GError ** context = g_option_context_new ("REV TARGETDIR - Compare directory TARGETDIR against revision REV"); - if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; if (argc < 2) diff --git a/src/ostree/ot-builtin-export.c b/src/ostree/ot-builtin-export.c index 7967bf6c..83656d04 100644 --- a/src/ostree/ot-builtin-export.c +++ b/src/ostree/ot-builtin-export.c @@ -62,7 +62,7 @@ propagate_libarchive_error (GError **error, #endif gboolean -ostree_builtin_export (int argc, char **argv, GCancellable *cancellable, GError **error) +ostree_builtin_export (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = NULL; g_autoptr(OstreeRepo) repo = NULL; @@ -79,7 +79,7 @@ ostree_builtin_export (int argc, char **argv, GCancellable *cancellable, GError context = g_option_context_new ("COMMIT - Stream COMMIT to stdout in tar format"); - if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; #ifdef HAVE_LIBARCHIVE diff --git a/src/ostree/ot-builtin-find-remotes.c b/src/ostree/ot-builtin-find-remotes.c index daeea38b..3cf6c153 100644 --- a/src/ostree/ot-builtin-find-remotes.c +++ b/src/ostree/ot-builtin-find-remotes.c @@ -120,6 +120,7 @@ collection_ref_free0 (OstreeCollectionRef *ref) gboolean ostree_builtin_find_remotes (int argc, char **argv, + OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { @@ -136,7 +137,7 @@ ostree_builtin_find_remotes (int argc, context = g_option_context_new ("COLLECTION-ID REF [COLLECTION-ID REF...] - Find remotes to serve the given refs"); /* Parse options. */ - if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) return FALSE; if (!ostree_ensure_repo_writable (repo, error)) diff --git a/src/ostree/ot-builtin-fsck.c b/src/ostree/ot-builtin-fsck.c index 28320985..81ac3218 100644 --- a/src/ostree/ot-builtin-fsck.c +++ b/src/ostree/ot-builtin-fsck.c @@ -214,13 +214,13 @@ fsck_reachable_objects_from_commits (OstreeRepo *repo, } gboolean -ostree_builtin_fsck (int argc, char **argv, GCancellable *cancellable, GError **error) +ostree_builtin_fsck (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(OstreeRepo) repo = NULL; gboolean found_corruption = FALSE; g_autoptr(GOptionContext) context = g_option_context_new ("- Check the repository for consistency"); - if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) return FALSE; if (!opt_quiet) diff --git a/src/ostree/ot-builtin-gpg-sign.c b/src/ostree/ot-builtin-gpg-sign.c index 451d0f46..3eeeeb01 100644 --- a/src/ostree/ot-builtin-gpg-sign.c +++ b/src/ostree/ot-builtin-gpg-sign.c @@ -200,7 +200,7 @@ out: } gboolean -ostree_builtin_gpg_sign (int argc, char **argv, GCancellable *cancellable, GError **error) +ostree_builtin_gpg_sign (int argc, char **argv,OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = NULL; g_autoptr(OstreeRepo) repo = NULL; @@ -212,7 +212,7 @@ ostree_builtin_gpg_sign (int argc, char **argv, GCancellable *cancellable, GErro context = g_option_context_new ("COMMIT KEY-ID... - Sign a commit"); - if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; if (argc < 2) diff --git a/src/ostree/ot-builtin-init.c b/src/ostree/ot-builtin-init.c index 7b72620a..c7729e47 100644 --- a/src/ostree/ot-builtin-init.c +++ b/src/ostree/ot-builtin-init.c @@ -45,7 +45,7 @@ static GOptionEntry options[] = { }; gboolean -ostree_builtin_init (int argc, char **argv, GCancellable *cancellable, GError **error) +ostree_builtin_init (int argc, char **argv,OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = NULL; g_autoptr(OstreeRepo) repo = NULL; @@ -54,7 +54,7 @@ ostree_builtin_init (int argc, char **argv, GCancellable *cancellable, GError ** context = g_option_context_new ("- Initialize a new empty repository"); - if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NO_CHECK, &repo, cancellable, error)) + if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; if (!ostree_repo_mode_from_string (opt_mode, &mode, error)) diff --git a/src/ostree/ot-builtin-log.c b/src/ostree/ot-builtin-log.c index 5fda4ee7..ee4b37d0 100644 --- a/src/ostree/ot-builtin-log.c +++ b/src/ostree/ot-builtin-log.c @@ -82,6 +82,7 @@ out: gboolean ostree_builtin_log (int argc, char **argv, + OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { @@ -94,7 +95,7 @@ ostree_builtin_log (int argc, context = g_option_context_new ("REF - Show log starting at commit or ref"); - if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; if (opt_raw) diff --git a/src/ostree/ot-builtin-ls.c b/src/ostree/ot-builtin-ls.c index ba22d3c3..bababaad 100644 --- a/src/ostree/ot-builtin-ls.c +++ b/src/ostree/ot-builtin-ls.c @@ -240,7 +240,7 @@ print_one_argument (OstreeRepo *repo, } gboolean -ostree_builtin_ls (int argc, char **argv, GCancellable *cancellable, GError **error) +ostree_builtin_ls (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = NULL; g_autoptr(OstreeRepo) repo = NULL; @@ -251,7 +251,7 @@ ostree_builtin_ls (int argc, char **argv, GCancellable *cancellable, GError **er context = g_option_context_new ("COMMIT [PATH...] - List file paths"); - if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; if (argc <= 1) diff --git a/src/ostree/ot-builtin-prune.c b/src/ostree/ot-builtin-prune.c index f5ab5960..ab3816bc 100644 --- a/src/ostree/ot-builtin-prune.c +++ b/src/ostree/ot-builtin-prune.c @@ -144,11 +144,11 @@ traverse_keep_younger_than (OstreeRepo *repo, const char *checksum, } gboolean -ostree_builtin_prune (int argc, char **argv, GCancellable *cancellable, GError **error) +ostree_builtin_prune (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = g_option_context_new ("- Search for unreachable objects"); g_autoptr(OstreeRepo) repo = NULL; - if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) return FALSE; if (!opt_no_prune && !ostree_ensure_repo_writable (repo, error)) diff --git a/src/ostree/ot-builtin-pull-local.c b/src/ostree/ot-builtin-pull-local.c index 8d4e8d60..b907b5aa 100644 --- a/src/ostree/ot-builtin-pull-local.c +++ b/src/ostree/ot-builtin-pull-local.c @@ -64,7 +64,7 @@ noninteractive_console_progress_changed (OstreeAsyncProgress *progress, } gboolean -ostree_builtin_pull_local (int argc, char **argv, GCancellable *cancellable, GError **error) +ostree_builtin_pull_local (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { gboolean ret = FALSE; g_autoptr(GOptionContext) context = NULL; @@ -78,7 +78,7 @@ ostree_builtin_pull_local (int argc, char **argv, GCancellable *cancellable, GEr context = g_option_context_new ("SRC_REPO [REFS...] - Copy data from SRC_REPO"); - if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; if (!ostree_ensure_repo_writable (repo, error)) diff --git a/src/ostree/ot-builtin-pull.c b/src/ostree/ot-builtin-pull.c index e67d5993..719c4d5b 100644 --- a/src/ostree/ot-builtin-pull.c +++ b/src/ostree/ot-builtin-pull.c @@ -143,7 +143,7 @@ noninteractive_console_progress_changed (OstreeAsyncProgress *progress, } gboolean -ostree_builtin_pull (int argc, char **argv, GCancellable *cancellable, GError **error) +ostree_builtin_pull (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = NULL; g_autoptr(OstreeRepo) repo = NULL; @@ -157,7 +157,7 @@ ostree_builtin_pull (int argc, char **argv, GCancellable *cancellable, GError ** context = g_option_context_new ("REMOTE [BRANCH...] - Download data from remote repository"); - if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; if (!ostree_ensure_repo_writable (repo, error)) diff --git a/src/ostree/ot-builtin-refs.c b/src/ostree/ot-builtin-refs.c index 1b4ead7d..68befc74 100644 --- a/src/ostree/ot-builtin-refs.c +++ b/src/ostree/ot-builtin-refs.c @@ -261,7 +261,7 @@ static gboolean do_ref (OstreeRepo *repo, const char *refspec_prefix, GCancellab } gboolean -ostree_builtin_refs (int argc, char **argv, GCancellable *cancellable, GError **error) +ostree_builtin_refs (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { gboolean ret = FALSE; g_autoptr(GOptionContext) context = NULL; @@ -270,7 +270,7 @@ ostree_builtin_refs (int argc, char **argv, GCancellable *cancellable, GError ** context = g_option_context_new ("[PREFIX] - List refs"); - if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; if (argc >= 2) diff --git a/src/ostree/ot-builtin-remote.c b/src/ostree/ot-builtin-remote.c index 0b1c02a2..0be878cc 100644 --- a/src/ostree/ot-builtin-remote.c +++ b/src/ostree/ot-builtin-remote.c @@ -25,42 +25,46 @@ #include "ot-builtins.h" #include "ot-remote-builtins.h" -typedef struct { - const char *name; - gboolean (*fn) (int argc, char **argv, GCancellable *cancellable, GError **error); - const char *description; -} OstreeRemoteCommand; - -static OstreeRemoteCommand remote_subcommands[] = { - { "add", ot_remote_builtin_add, +static OstreeCommand remote_subcommands[] = { + { "add", OSTREE_BUILTIN_FLAG_NO_REPO, + ot_remote_builtin_add, "Add a remote repository" }, - { "delete", ot_remote_builtin_delete, + { "delete", OSTREE_BUILTIN_FLAG_NO_REPO, + ot_remote_builtin_delete, "Delete a remote repository" }, - { "show-url", ot_remote_builtin_show_url, + { "show-url", OSTREE_BUILTIN_FLAG_NONE, + ot_remote_builtin_show_url, "Show remote repository URL" }, - { "list", ot_remote_builtin_list, + { "list", OSTREE_BUILTIN_FLAG_NONE, + ot_remote_builtin_list, "List remote repository names" }, - { "gpg-import", ot_remote_builtin_gpg_import, + { "gpg-import", OSTREE_BUILTIN_FLAG_NONE, + ot_remote_builtin_gpg_import, "Import GPG keys" }, #ifdef HAVE_LIBSOUP - { "add-cookie", ot_remote_builtin_add_cookie, + { "add-cookie", OSTREE_BUILTIN_FLAG_NONE, + ot_remote_builtin_add_cookie, "Add a cookie to remote" }, - { "delete-cookie", ot_remote_builtin_delete_cookie, + { "delete-cookie", OSTREE_BUILTIN_FLAG_NONE, + ot_remote_builtin_delete_cookie, "Remove one cookie from remote" }, - { "list-cookies", ot_remote_builtin_list_cookies, + { "list-cookies", OSTREE_BUILTIN_FLAG_NONE, + ot_remote_builtin_list_cookies, "Show remote repository cookies" }, #endif - { "refs", ot_remote_builtin_refs, + { "refs", OSTREE_BUILTIN_FLAG_NONE, + ot_remote_builtin_refs, "List remote refs" }, - { "summary", ot_remote_builtin_summary, + { "summary", OSTREE_BUILTIN_FLAG_NONE, + ot_remote_builtin_summary, "Show remote summary" }, - { NULL, NULL, NULL } + { NULL, 0, NULL, NULL } }; static GOptionContext * remote_option_context_new_with_commands (void) { - OstreeRemoteCommand *subcommand = remote_subcommands; + OstreeCommand *subcommand = remote_subcommands; GOptionContext *context = g_option_context_new ("COMMAND"); g_autoptr(GString) summary = g_string_new ("Builtin \"remote\" Commands:"); @@ -80,9 +84,9 @@ remote_option_context_new_with_commands (void) } gboolean -ostree_builtin_remote (int argc, char **argv, GCancellable *cancellable, GError **error) +ostree_builtin_remote (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { - OstreeRemoteCommand *subcommand; + OstreeCommand *subcommand; const char *subcommand_name = NULL; g_autofree char *prgname = NULL; gboolean ret = FALSE; @@ -128,7 +132,7 @@ ostree_builtin_remote (int argc, char **argv, GCancellable *cancellable, GError /* This will not return for some options (e.g. --version). */ if (ostree_option_context_parse (context, NULL, &argc, &argv, - OSTREE_BUILTIN_FLAG_NO_REPO, NULL, cancellable, + invocation, NULL, cancellable, error)) { if (subcommand_name == NULL) @@ -152,7 +156,8 @@ ostree_builtin_remote (int argc, char **argv, GCancellable *cancellable, GError prgname = g_strdup_printf ("%s %s", g_get_prgname (), subcommand_name); g_set_prgname (prgname); - if (!subcommand->fn (argc, argv, cancellable, error)) + OstreeCommandInvocation sub_invocation = { .command = subcommand }; + if (!subcommand->fn (argc, argv, &sub_invocation, cancellable, error)) goto out; ret = TRUE; diff --git a/src/ostree/ot-builtin-reset.c b/src/ostree/ot-builtin-reset.c index ae1da7cb..f465e0cf 100644 --- a/src/ostree/ot-builtin-reset.c +++ b/src/ostree/ot-builtin-reset.c @@ -38,6 +38,7 @@ static GOptionEntry options[] = { gboolean ostree_builtin_reset (int argc, char **argv, + OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { @@ -52,7 +53,7 @@ ostree_builtin_reset (int argc, /* FIXME: Add support for collection–refs. */ context = g_option_context_new ("REF COMMIT - Reset a REF to a previous COMMIT"); - if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; if (!ostree_ensure_repo_writable (repo, error)) diff --git a/src/ostree/ot-builtin-rev-parse.c b/src/ostree/ot-builtin-rev-parse.c index 060bcdc9..cf1da5a6 100644 --- a/src/ostree/ot-builtin-rev-parse.c +++ b/src/ostree/ot-builtin-rev-parse.c @@ -36,7 +36,7 @@ static GOptionEntry options[] = { }; gboolean -ostree_builtin_rev_parse (int argc, char **argv, GCancellable *cancellable, GError **error) +ostree_builtin_rev_parse (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = NULL; g_autoptr(OstreeRepo) repo = NULL; @@ -47,7 +47,7 @@ ostree_builtin_rev_parse (int argc, char **argv, GCancellable *cancellable, GErr context = g_option_context_new ("REV - Output the target of a rev"); - if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; if (argc < 2) diff --git a/src/ostree/ot-builtin-show.c b/src/ostree/ot-builtin-show.c index c4b586b1..79dfd29e 100644 --- a/src/ostree/ot-builtin-show.c +++ b/src/ostree/ot-builtin-show.c @@ -226,12 +226,12 @@ print_if_found (OstreeRepo *repo, } gboolean -ostree_builtin_show (int argc, char **argv, GCancellable *cancellable, GError **error) +ostree_builtin_show (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = g_option_context_new ("OBJECT - Output a metadata object"); g_autoptr(OstreeRepo) repo = NULL; - if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) return FALSE; if (argc <= 1) diff --git a/src/ostree/ot-builtin-static-delta.c b/src/ostree/ot-builtin-static-delta.c index b2af1d66..c9b6b456 100644 --- a/src/ostree/ot-builtin-static-delta.c +++ b/src/ostree/ot-builtin-static-delta.c @@ -39,7 +39,7 @@ static gboolean opt_inline; static gboolean opt_disable_bsdiff; static gboolean opt_if_not_exists; -#define BUILTINPROTO(name) static gboolean ot_static_delta_builtin_ ## name (int argc, char **argv, GCancellable *cancellable, GError **error) +#define BUILTINPROTO(name) static gboolean ot_static_delta_builtin_ ## name (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) BUILTINPROTO(list); BUILTINPROTO(show); @@ -50,17 +50,22 @@ BUILTINPROTO(apply_offline); #undef BUILTINPROTO static OstreeCommand static_delta_subcommands[] = { - { "list", ot_static_delta_builtin_list, + { "list", OSTREE_BUILTIN_FLAG_NONE, + ot_static_delta_builtin_list, "List static delta files" }, - { "show", ot_static_delta_builtin_show, + { "show", OSTREE_BUILTIN_FLAG_NONE, + ot_static_delta_builtin_show, "Dump information on a delta" }, - { "delete", ot_static_delta_builtin_delete, + { "delete", OSTREE_BUILTIN_FLAG_NONE, + ot_static_delta_builtin_delete, "Remove a delta" }, - { "generate", ot_static_delta_builtin_generate, + { "generate", OSTREE_BUILTIN_FLAG_NONE, + ot_static_delta_builtin_generate, "Generate static delta files" }, - { "apply-offline", ot_static_delta_builtin_apply_offline, + { "apply-offline", OSTREE_BUILTIN_FLAG_NONE, + ot_static_delta_builtin_apply_offline, "Apply static delta file" }, - { NULL, NULL, NULL } + { NULL, 0, NULL, NULL } }; /* ATTENTION: @@ -118,12 +123,12 @@ static_delta_usage (char **argv, } static gboolean -ot_static_delta_builtin_list (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_static_delta_builtin_list (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(OstreeRepo) repo = NULL; g_autoptr(GOptionContext) context = g_option_context_new ("- list static delta files"); if (!ostree_option_context_parse (context, list_options, &argc, &argv, - OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + invocation, &repo, cancellable, error)) return FALSE; g_autoptr(GPtrArray) delta_names = NULL; @@ -142,7 +147,7 @@ ot_static_delta_builtin_list (int argc, char **argv, GCancellable *cancellable, } static gboolean -ot_static_delta_builtin_show (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_static_delta_builtin_show (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { gboolean ret = FALSE; g_autoptr(GOptionContext) context = NULL; @@ -151,7 +156,7 @@ ot_static_delta_builtin_show (int argc, char **argv, GCancellable *cancellable, context = g_option_context_new ("- Dump information on a delta"); - if (!ostree_option_context_parse (context, list_options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + if (!ostree_option_context_parse (context, list_options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; if (argc < 3) @@ -172,7 +177,7 @@ ot_static_delta_builtin_show (int argc, char **argv, GCancellable *cancellable, } static gboolean -ot_static_delta_builtin_delete (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_static_delta_builtin_delete (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { gboolean ret = FALSE; g_autoptr(GOptionContext) context = NULL; @@ -181,7 +186,7 @@ ot_static_delta_builtin_delete (int argc, char **argv, GCancellable *cancellable context = g_option_context_new ("- Remove a delta"); - if (!ostree_option_context_parse (context, list_options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + if (!ostree_option_context_parse (context, list_options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; if (argc < 3) @@ -203,14 +208,14 @@ ot_static_delta_builtin_delete (int argc, char **argv, GCancellable *cancellable static gboolean -ot_static_delta_builtin_generate (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_static_delta_builtin_generate (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { gboolean ret = FALSE; g_autoptr(GOptionContext) context = NULL; g_autoptr(OstreeRepo) repo = NULL; context = g_option_context_new ("[TO] - Generate static delta files"); - if (!ostree_option_context_parse (context, generate_options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + if (!ostree_option_context_parse (context, generate_options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; if (!ostree_ensure_repo_writable (repo, error)) @@ -352,7 +357,7 @@ ot_static_delta_builtin_generate (int argc, char **argv, GCancellable *cancellab } static gboolean -ot_static_delta_builtin_apply_offline (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_static_delta_builtin_apply_offline (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { gboolean ret = FALSE; const char *patharg; @@ -361,7 +366,7 @@ ot_static_delta_builtin_apply_offline (int argc, char **argv, GCancellable *canc g_autoptr(OstreeRepo) repo = NULL; context = g_option_context_new ("- Apply static delta file"); - if (!ostree_option_context_parse (context, apply_offline_options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + if (!ostree_option_context_parse (context, apply_offline_options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; if (!ostree_ensure_repo_writable (repo, error)) @@ -392,7 +397,7 @@ ot_static_delta_builtin_apply_offline (int argc, char **argv, GCancellable *canc } gboolean -ostree_builtin_static_delta (int argc, char **argv, GCancellable *cancellable, GError **error) +ostree_builtin_static_delta (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { gboolean want_help = FALSE; const char *cmdname = NULL; @@ -443,5 +448,6 @@ ostree_builtin_static_delta (int argc, char **argv, GCancellable *cancellable, G g_autofree char *prgname = g_strdup_printf ("%s %s", g_get_prgname (), cmdname); g_set_prgname (prgname); - return command->fn (argc, argv, cancellable, error); + OstreeCommandInvocation sub_invocation = { .command = command }; + return command->fn (argc, argv, &sub_invocation, cancellable, error); } diff --git a/src/ostree/ot-builtin-summary.c b/src/ostree/ot-builtin-summary.c index 15998efd..a1d0fe56 100644 --- a/src/ostree/ot-builtin-summary.c +++ b/src/ostree/ot-builtin-summary.c @@ -81,7 +81,7 @@ build_additional_metadata (const char * const *args, } gboolean -ostree_builtin_summary (int argc, char **argv, GCancellable *cancellable, GError **error) +ostree_builtin_summary (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = NULL; g_autoptr(OstreeRepo) repo = NULL; @@ -89,7 +89,7 @@ ostree_builtin_summary (int argc, char **argv, GCancellable *cancellable, GError context = g_option_context_new ("Manage summary metadata"); - if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) return FALSE; if (opt_update) diff --git a/src/ostree/ot-builtin-trivial-httpd.c b/src/ostree/ot-builtin-trivial-httpd.c index 972cf1ad..37487a76 100644 --- a/src/ostree/ot-builtin-trivial-httpd.c +++ b/src/ostree/ot-builtin-trivial-httpd.c @@ -25,7 +25,7 @@ #include "otutil.h" gboolean -ostree_builtin_trivial_httpd (int argc, char **argv, GCancellable *cancellable, GError **error) +ostree_builtin_trivial_httpd (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GPtrArray) new_argv = g_ptr_array_new (); diff --git a/src/ostree/ot-builtins.h b/src/ostree/ot-builtins.h index ccb47f60..e5864a46 100644 --- a/src/ostree/ot-builtins.h +++ b/src/ostree/ot-builtins.h @@ -27,7 +27,7 @@ G_BEGIN_DECLS -#define BUILTINPROTO(name) gboolean ostree_builtin_ ## name (int argc, char **argv, GCancellable *cancellable, GError **error) +#define BUILTINPROTO(name) gboolean ostree_builtin_ ## name (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) BUILTINPROTO(admin); BUILTINPROTO(cat); diff --git a/src/ostree/ot-main.c b/src/ostree/ot-main.c index d81b802c..c63cff7e 100644 --- a/src/ostree/ot-main.c +++ b/src/ostree/ot-main.c @@ -171,7 +171,7 @@ ostree_run (int argc, ostree_option_context_new_with_commands (commands); /* This will not return for some options (e.g. --version). */ - if (ostree_option_context_parse (context, NULL, &argc, &argv, OSTREE_BUILTIN_FLAG_NO_REPO, NULL, cancellable, &error)) + if (ostree_option_context_parse (context, NULL, &argc, &argv, NULL, NULL, cancellable, &error)) { if (command_name == NULL) { @@ -193,8 +193,8 @@ ostree_run (int argc, prgname = g_strdup_printf ("%s %s", g_get_prgname (), command_name); g_set_prgname (prgname); #endif - - if (!command->fn (argc, argv, cancellable, &error)) + OstreeCommandInvocation invocation = { .command = command }; + if (!command->fn (argc, argv, &invocation, cancellable, &error)) goto out; success = TRUE; @@ -296,13 +296,14 @@ ostree_option_context_parse (GOptionContext *context, const GOptionEntry *main_entries, int *argc, char ***argv, - OstreeBuiltinFlags flags, + OstreeCommandInvocation *invocation, OstreeRepo **out_repo, GCancellable *cancellable, GError **error) { g_autoptr(OstreeRepo) repo = NULL; - + /* When invocation is NULL, it usually means an error occurs, do not fetch repo this case */ + const OstreeBuiltinFlags flags = invocation ? invocation->command->flags : OSTREE_BUILTIN_FLAG_NO_REPO; /* Entries are listed in --help output in the order added. We add the * main entries ourselves so that we can add the --repo entry first. */ @@ -366,6 +367,7 @@ ostree_admin_option_context_parse (GOptionContext *context, int *argc, char ***argv, OstreeAdminBuiltinFlags flags, + OstreeCommandInvocation *invocation, OstreeSysroot **out_sysroot, GCancellable *cancellable, GError **error) @@ -376,7 +378,7 @@ ostree_admin_option_context_parse (GOptionContext *context, g_option_context_add_main_entries (context, global_admin_entries, NULL); if (!ostree_option_context_parse (context, main_entries, argc, argv, - OSTREE_BUILTIN_FLAG_NO_REPO, NULL, cancellable, error)) + invocation, NULL, cancellable, error)) return FALSE; if (!opt_print_current_dir && (flags & OSTREE_ADMIN_BUILTIN_FLAG_NO_SYSROOT)) diff --git a/src/ostree/ot-main.h b/src/ostree/ot-main.h index d795e531..26f9f6e1 100644 --- a/src/ostree/ot-main.h +++ b/src/ostree/ot-main.h @@ -37,12 +37,26 @@ typedef enum { OSTREE_ADMIN_BUILTIN_FLAG_NO_SYSROOT = (1 << 2), } OstreeAdminBuiltinFlags; + +typedef struct OstreeCommandInvocation OstreeCommandInvocation; + typedef struct { const char *name; - gboolean (*fn) (int argc, char **argv, GCancellable *cancellable, GError **error); + OstreeBuiltinFlags flags; + gboolean (*fn) (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error); const char *description; } OstreeCommand; +/* This is a similar implementation as + * https://github.com/projectatomic/rpm-ostree/commit/12c34bb2491a07079c911ef26401fee939e5573c. + * + * In the future if we want to add something new we won't need to + * touch every prototype + */ +struct OstreeCommandInvocation { + OstreeCommand *command; +}; + int ostree_run (int argc, char **argv, OstreeCommand *commands, GError **error); int ostree_usage (OstreeCommand *commands, gboolean is_error); @@ -58,7 +72,7 @@ gboolean ostree_parse_sysroot_or_repo_option (GOptionContext *context, gboolean ostree_option_context_parse (GOptionContext *context, const GOptionEntry *main_entries, int *argc, char ***argv, - OstreeBuiltinFlags flags, + OstreeCommandInvocation *invocation, OstreeRepo **out_repo, GCancellable *cancellable, GError **error); @@ -66,6 +80,7 @@ gboolean ostree_admin_option_context_parse (GOptionContext *context, const GOptionEntry *main_entries, int *argc, char ***argv, OstreeAdminBuiltinFlags flags, + OstreeCommandInvocation *invocation, OstreeSysroot **out_sysroot, GCancellable *cancellable, GError **error); diff --git a/src/ostree/ot-remote-builtin-add-cookie.c b/src/ostree/ot-remote-builtin-add-cookie.c index 764d2fc3..051d0389 100644 --- a/src/ostree/ot-remote-builtin-add-cookie.c +++ b/src/ostree/ot-remote-builtin-add-cookie.c @@ -37,12 +37,12 @@ static GOptionEntry option_entries[] = { }; gboolean -ot_remote_builtin_add_cookie (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_remote_builtin_add_cookie (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = g_option_context_new ("NAME DOMAIN PATH COOKIE_NAME VALUE - Add a cookie to remote"); g_autoptr(OstreeRepo) repo = NULL; if (!ostree_option_context_parse (context, option_entries, &argc, &argv, - OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + invocation, &repo, cancellable, error)) return FALSE; if (argc < 6) diff --git a/src/ostree/ot-remote-builtin-add.c b/src/ostree/ot-remote-builtin-add.c index f0990795..080fd501 100644 --- a/src/ostree/ot-remote-builtin-add.c +++ b/src/ostree/ot-remote-builtin-add.c @@ -57,7 +57,7 @@ static GOptionEntry option_entries[] = { }; gboolean -ot_remote_builtin_add (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_remote_builtin_add (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = NULL; g_autoptr(OstreeSysroot) sysroot = NULL; @@ -72,7 +72,7 @@ ot_remote_builtin_add (int argc, char **argv, GCancellable *cancellable, GError context = g_option_context_new ("NAME [metalink=|mirrorlist=]URL [BRANCH...] - Add a remote repository"); if (!ostree_option_context_parse (context, option_entries, &argc, &argv, - OSTREE_BUILTIN_FLAG_NO_REPO, NULL, cancellable, error)) + invocation, NULL, cancellable, error)) goto out; if (!ostree_parse_sysroot_or_repo_option (context, opt_sysroot, opt_repo, diff --git a/src/ostree/ot-remote-builtin-delete-cookie.c b/src/ostree/ot-remote-builtin-delete-cookie.c index 17f356a1..726f3ab6 100644 --- a/src/ostree/ot-remote-builtin-delete-cookie.c +++ b/src/ostree/ot-remote-builtin-delete-cookie.c @@ -38,13 +38,13 @@ static GOptionEntry option_entries[] = { }; gboolean -ot_remote_builtin_delete_cookie (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_remote_builtin_delete_cookie (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(OstreeRepo) repo = NULL; g_autoptr(GOptionContext) context = g_option_context_new ("NAME DOMAIN PATH COOKIE_NAME- Remove one cookie from remote"); if (!ostree_option_context_parse (context, option_entries, &argc, &argv, - OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + invocation, &repo, cancellable, error)) return FALSE; if (argc < 5) diff --git a/src/ostree/ot-remote-builtin-delete.c b/src/ostree/ot-remote-builtin-delete.c index d7ad6bb5..54cba2bf 100644 --- a/src/ostree/ot-remote-builtin-delete.c +++ b/src/ostree/ot-remote-builtin-delete.c @@ -41,13 +41,13 @@ static GOptionEntry option_entries[] = { }; gboolean -ot_remote_builtin_delete (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_remote_builtin_delete (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = g_option_context_new ("NAME - Delete a remote repository"); if (!ostree_option_context_parse (context, option_entries, &argc, &argv, - OSTREE_BUILTIN_FLAG_NO_REPO, NULL, cancellable, error)) + invocation, NULL, cancellable, error)) return FALSE; g_autoptr(OstreeSysroot) sysroot = NULL; diff --git a/src/ostree/ot-remote-builtin-gpg-import.c b/src/ostree/ot-remote-builtin-gpg-import.c index 6edcf321..eca2fee6 100644 --- a/src/ostree/ot-remote-builtin-gpg-import.c +++ b/src/ostree/ot-remote-builtin-gpg-import.c @@ -95,7 +95,7 @@ out: } gboolean -ot_remote_builtin_gpg_import (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_remote_builtin_gpg_import (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = NULL; g_autoptr(OstreeRepo) repo = NULL; @@ -108,7 +108,7 @@ ot_remote_builtin_gpg_import (int argc, char **argv, GCancellable *cancellable, context = g_option_context_new ("NAME [KEY-ID...] - Import GPG keys"); if (!ostree_option_context_parse (context, option_entries, &argc, &argv, - OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + invocation, &repo, cancellable, error)) goto out; if (argc < 2) diff --git a/src/ostree/ot-remote-builtin-list-cookies.c b/src/ostree/ot-remote-builtin-list-cookies.c index 99d76346..7b7ba5d4 100644 --- a/src/ostree/ot-remote-builtin-list-cookies.c +++ b/src/ostree/ot-remote-builtin-list-cookies.c @@ -37,13 +37,13 @@ static GOptionEntry option_entries[] = { }; gboolean -ot_remote_builtin_list_cookies (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_remote_builtin_list_cookies (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(OstreeRepo) repo = NULL; g_autoptr(GOptionContext) context = g_option_context_new ("NAME - Show remote repository cookies"); if (!ostree_option_context_parse (context, option_entries, &argc, &argv, - OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + invocation, &repo, cancellable, error)) return FALSE; if (argc < 2) diff --git a/src/ostree/ot-remote-builtin-list.c b/src/ostree/ot-remote-builtin-list.c index fea5e420..589b97bb 100644 --- a/src/ostree/ot-remote-builtin-list.c +++ b/src/ostree/ot-remote-builtin-list.c @@ -35,7 +35,7 @@ static GOptionEntry option_entries[] = { }; gboolean -ot_remote_builtin_list (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_remote_builtin_list (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = NULL; g_autoptr(OstreeRepo) repo = NULL; @@ -46,7 +46,7 @@ ot_remote_builtin_list (int argc, char **argv, GCancellable *cancellable, GError context = g_option_context_new ("- List remote repository names"); if (!ostree_option_context_parse (context, option_entries, &argc, &argv, - OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + invocation, &repo, cancellable, error)) goto out; remotes = ostree_repo_remote_list (repo, &n_remotes); diff --git a/src/ostree/ot-remote-builtin-refs.c b/src/ostree/ot-remote-builtin-refs.c index bffc1985..71d5b5d6 100644 --- a/src/ostree/ot-remote-builtin-refs.c +++ b/src/ostree/ot-remote-builtin-refs.c @@ -37,7 +37,7 @@ static GOptionEntry option_entries[] = { }; gboolean -ot_remote_builtin_refs (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_remote_builtin_refs (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = NULL; g_autoptr(OstreeRepo) repo = NULL; @@ -48,7 +48,7 @@ ot_remote_builtin_refs (int argc, char **argv, GCancellable *cancellable, GError context = g_option_context_new ("NAME - List remote refs"); if (!ostree_option_context_parse (context, option_entries, &argc, &argv, - OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + invocation, &repo, cancellable, error)) goto out; if (argc < 2) diff --git a/src/ostree/ot-remote-builtin-show-url.c b/src/ostree/ot-remote-builtin-show-url.c index 7ce0572e..0f3e56f9 100644 --- a/src/ostree/ot-remote-builtin-show-url.c +++ b/src/ostree/ot-remote-builtin-show-url.c @@ -34,7 +34,7 @@ static GOptionEntry option_entries[] = { }; gboolean -ot_remote_builtin_show_url (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_remote_builtin_show_url (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = NULL; g_autoptr(OstreeRepo) repo = NULL; @@ -45,7 +45,7 @@ ot_remote_builtin_show_url (int argc, char **argv, GCancellable *cancellable, GE context = g_option_context_new ("NAME - Show remote repository URL"); if (!ostree_option_context_parse (context, option_entries, &argc, &argv, - OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + invocation, &repo, cancellable, error)) goto out; if (argc < 2) diff --git a/src/ostree/ot-remote-builtin-summary.c b/src/ostree/ot-remote-builtin-summary.c index 30aedc2d..8d501589 100644 --- a/src/ostree/ot-remote-builtin-summary.c +++ b/src/ostree/ot-remote-builtin-summary.c @@ -41,7 +41,7 @@ static GOptionEntry option_entries[] = { }; gboolean -ot_remote_builtin_summary (int argc, char **argv, GCancellable *cancellable, GError **error) +ot_remote_builtin_summary (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = NULL; g_autoptr(OstreeRepo) repo = NULL; @@ -55,7 +55,7 @@ ot_remote_builtin_summary (int argc, char **argv, GCancellable *cancellable, GEr context = g_option_context_new ("NAME - Show remote summary"); if (!ostree_option_context_parse (context, option_entries, &argc, &argv, - OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + invocation, &repo, cancellable, error)) goto out; if (argc < 2) diff --git a/src/ostree/ot-remote-builtins.h b/src/ostree/ot-remote-builtins.h index c61fcc07..ce788524 100644 --- a/src/ostree/ot-remote-builtins.h +++ b/src/ostree/ot-remote-builtins.h @@ -23,17 +23,23 @@ G_BEGIN_DECLS -gboolean ot_remote_builtin_add (int argc, char **argv, GCancellable *cancellable, GError **error); -gboolean ot_remote_builtin_delete (int argc, char **argv, GCancellable *cancellable, GError **error); -gboolean ot_remote_builtin_gpg_import (int argc, char **argv, GCancellable *cancellable, GError **error); -gboolean ot_remote_builtin_list (int argc, char **argv, GCancellable *cancellable, GError **error); +#define BUILTINPROTO(name) gboolean ot_remote_builtin_ ## name (int argc, char **argv, \ + OstreeCommandInvocation *invocation, \ + GCancellable *cancellable, GError **error) + +BUILTINPROTO(add); +BUILTINPROTO(delete); +BUILTINPROTO(gpg_import); +BUILTINPROTO(list); #ifdef HAVE_LIBSOUP -gboolean ot_remote_builtin_add_cookie (int argc, char **argv, GCancellable *cancellable, GError **error); -gboolean ot_remote_builtin_list_cookies (int argc, char **argv, GCancellable *cancellable, GError **error); -gboolean ot_remote_builtin_delete_cookie (int argc, char **argv, GCancellable *cancellable, GError **error); +BUILTINPROTO(add_cookie); +BUILTINPROTO(list_cookies); +BUILTINPROTO(delete_cookie); #endif -gboolean ot_remote_builtin_show_url (int argc, char **argv, GCancellable *cancellable, GError **error); -gboolean ot_remote_builtin_refs (int argc, char **argv, GCancellable *cancellable, GError **error); -gboolean ot_remote_builtin_summary (int argc, char **argv, GCancellable *cancellable, GError **error); +BUILTINPROTO(show_url); +BUILTINPROTO(refs); +BUILTINPROTO(summary); + +#undef BUILTINPROTO G_END_DECLS From 9166605e5acbffd2c4db4e8a374770830f900fbc Mon Sep 17 00:00:00 2001 From: Ruixin Bao Date: Tue, 17 Oct 2017 20:42:04 +0000 Subject: [PATCH 68/98] ostree: provide command description in a better place This is similar idea as https://github.com/projectatomic/rpm-ostree/pull/916/commits/5c0bf889155573feec108501ce849ac09a0c9567, The duplicated description is now removed, and the description of the command is now displayed beneath the Usage. For example: ostree cat -h will output the following: "Usage: ostree cat [OPTION?] COMMIT PATH... Concatenate contents of files" Closes: #1267 Approved by: cgwalters --- src/ostree/main.c | 2 +- src/ostree/ot-admin-builtin-cleanup.c | 2 +- src/ostree/ot-admin-builtin-deploy.c | 2 +- src/ostree/ot-admin-builtin-diff.c | 2 +- src/ostree/ot-admin-builtin-init-fs.c | 2 +- src/ostree/ot-admin-builtin-os-init.c | 2 +- src/ostree/ot-admin-builtin-status.c | 2 +- src/ostree/ot-admin-builtin-switch.c | 2 +- src/ostree/ot-admin-builtin-undeploy.c | 2 +- src/ostree/ot-admin-builtin-unlock.c | 2 +- src/ostree/ot-admin-builtin-upgrade.c | 2 +- ...ot-admin-instutil-builtin-grub2-generate.c | 2 +- ...-instutil-builtin-selinux-ensure-labeled.c | 2 +- .../ot-admin-instutil-builtin-set-kargs.c | 2 +- src/ostree/ot-builtin-cat.c | 2 +- src/ostree/ot-builtin-checkout.c | 2 +- src/ostree/ot-builtin-checksum.c | 2 +- src/ostree/ot-builtin-commit.c | 2 +- src/ostree/ot-builtin-config.c | 2 +- src/ostree/ot-builtin-create-usb.c | 2 +- src/ostree/ot-builtin-diff.c | 2 +- src/ostree/ot-builtin-export.c | 2 +- src/ostree/ot-builtin-find-remotes.c | 2 +- src/ostree/ot-builtin-fsck.c | 2 +- src/ostree/ot-builtin-gpg-sign.c | 2 +- src/ostree/ot-builtin-init.c | 2 +- src/ostree/ot-builtin-log.c | 2 +- src/ostree/ot-builtin-ls.c | 2 +- src/ostree/ot-builtin-prune.c | 2 +- src/ostree/ot-builtin-pull-local.c | 2 +- src/ostree/ot-builtin-pull.c | 2 +- src/ostree/ot-builtin-refs.c | 2 +- src/ostree/ot-builtin-reset.c | 2 +- src/ostree/ot-builtin-rev-parse.c | 2 +- src/ostree/ot-builtin-show.c | 2 +- src/ostree/ot-builtin-static-delta.c | 10 +++---- src/ostree/ot-builtin-summary.c | 2 +- src/ostree/ot-main.c | 27 ++++++++++++++++++- src/ostree/ot-remote-builtin-add-cookie.c | 2 +- src/ostree/ot-remote-builtin-add.c | 2 +- src/ostree/ot-remote-builtin-delete-cookie.c | 2 +- src/ostree/ot-remote-builtin-delete.c | 2 +- src/ostree/ot-remote-builtin-gpg-import.c | 2 +- src/ostree/ot-remote-builtin-list-cookies.c | 2 +- src/ostree/ot-remote-builtin-list.c | 2 +- src/ostree/ot-remote-builtin-refs.c | 2 +- src/ostree/ot-remote-builtin-show-url.c | 2 +- src/ostree/ot-remote-builtin-summary.c | 2 +- 48 files changed, 77 insertions(+), 52 deletions(-) diff --git a/src/ostree/main.c b/src/ostree/main.c index 4ae261d6..d50c2490 100644 --- a/src/ostree/main.c +++ b/src/ostree/main.c @@ -39,7 +39,7 @@ static OstreeCommand commands[] = { */ { "admin", OSTREE_BUILTIN_FLAG_NO_REPO, ostree_builtin_admin, - "Commands that needs admin privilege" }, + "Commands for managing a host system booted with ostree" }, { "cat", OSTREE_BUILTIN_FLAG_NONE, ostree_builtin_cat, "Concatenate contents of files"}, diff --git a/src/ostree/ot-admin-builtin-cleanup.c b/src/ostree/ot-admin-builtin-cleanup.c index bc7a724b..996afd24 100644 --- a/src/ostree/ot-admin-builtin-cleanup.c +++ b/src/ostree/ot-admin-builtin-cleanup.c @@ -44,7 +44,7 @@ ot_admin_builtin_cleanup (int argc, char **argv, OstreeCommandInvocation *invoca g_autoptr(OstreeSysroot) sysroot = NULL; gboolean ret = FALSE; - context = g_option_context_new ("Delete untagged deployments and repository objects"); + context = g_option_context_new (""); if (!ostree_admin_option_context_parse (context, options, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER, diff --git a/src/ostree/ot-admin-builtin-deploy.c b/src/ostree/ot-admin-builtin-deploy.c index 6bfc09ee..ae287939 100644 --- a/src/ostree/ot-admin-builtin-deploy.c +++ b/src/ostree/ot-admin-builtin-deploy.c @@ -65,7 +65,7 @@ ot_admin_builtin_deploy (int argc, char **argv, OstreeCommandInvocation *invocat __attribute__((cleanup(_ostree_kernel_args_cleanup))) OstreeKernelArgs *kargs = NULL; g_autoptr(GOptionContext) context = - g_option_context_new ("REFSPEC - Checkout revision REFSPEC as the new default deployment"); + g_option_context_new ("REFSPEC"); g_autoptr(OstreeSysroot) sysroot = NULL; if (!ostree_admin_option_context_parse (context, options, &argc, &argv, diff --git a/src/ostree/ot-admin-builtin-diff.c b/src/ostree/ot-admin-builtin-diff.c index ec8f692e..fe0c5365 100644 --- a/src/ostree/ot-admin-builtin-diff.c +++ b/src/ostree/ot-admin-builtin-diff.c @@ -54,7 +54,7 @@ ot_admin_builtin_diff (int argc, char **argv, OstreeCommandInvocation *invocatio g_autoptr(GFile) orig_etc_path = NULL; g_autoptr(GFile) new_etc_path = NULL; - context = g_option_context_new ("Diff current /etc configuration versus default"); + context = g_option_context_new (""); g_option_context_add_main_entries (context, options, NULL); diff --git a/src/ostree/ot-admin-builtin-init-fs.c b/src/ostree/ot-admin-builtin-init-fs.c index e1c0e439..e2bee8a3 100644 --- a/src/ostree/ot-admin-builtin-init-fs.c +++ b/src/ostree/ot-admin-builtin-init-fs.c @@ -40,7 +40,7 @@ static GOptionEntry options[] = { gboolean ot_admin_builtin_init_fs (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { - g_autoptr(GOptionContext) context = g_option_context_new ("PATH - Initialize a root filesystem"); + g_autoptr(GOptionContext) context = g_option_context_new ("PATH"); if (!ostree_admin_option_context_parse (context, options, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER | diff --git a/src/ostree/ot-admin-builtin-os-init.c b/src/ostree/ot-admin-builtin-os-init.c index a6a11f99..92dc54fb 100644 --- a/src/ostree/ot-admin-builtin-os-init.c +++ b/src/ostree/ot-admin-builtin-os-init.c @@ -45,7 +45,7 @@ ot_admin_builtin_os_init (int argc, char **argv, OstreeCommandInvocation *invoca gboolean ret = FALSE; const char *osname = NULL; - context = g_option_context_new ("OSNAME - Initialize empty state for given operating system"); + context = g_option_context_new ("OSNAME"); if (!ostree_admin_option_context_parse (context, options, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER | OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED, diff --git a/src/ostree/ot-admin-builtin-status.c b/src/ostree/ot-admin-builtin-status.c index b88c2fba..b763618c 100644 --- a/src/ostree/ot-admin-builtin-status.c +++ b/src/ostree/ot-admin-builtin-status.c @@ -100,7 +100,7 @@ ot_admin_builtin_status (int argc, char **argv, OstreeCommandInvocation *invocat const char *red_bold_suffix = is_tty ? "\x1b[22m\x1b[0m" : ""; guint i; - context = g_option_context_new ("List deployments"); + context = g_option_context_new (""); if (!ostree_admin_option_context_parse (context, options, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED, diff --git a/src/ostree/ot-admin-builtin-switch.c b/src/ostree/ot-admin-builtin-switch.c index 1b1082d5..fded7aa2 100644 --- a/src/ostree/ot-admin-builtin-switch.c +++ b/src/ostree/ot-admin-builtin-switch.c @@ -47,7 +47,7 @@ gboolean ot_admin_builtin_switch (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = - g_option_context_new ("REF - Construct new tree from REF and deploy it"); + g_option_context_new ("REF"); g_autoptr(OstreeSysroot) sysroot = NULL; if (!ostree_admin_option_context_parse (context, options, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER, diff --git a/src/ostree/ot-admin-builtin-undeploy.c b/src/ostree/ot-admin-builtin-undeploy.c index 3bddd6cb..57fc8d61 100644 --- a/src/ostree/ot-admin-builtin-undeploy.c +++ b/src/ostree/ot-admin-builtin-undeploy.c @@ -46,7 +46,7 @@ ot_admin_builtin_undeploy (int argc, char **argv, OstreeCommandInvocation *invoc g_autoptr(GPtrArray) current_deployments = NULL; g_autoptr(OstreeDeployment) target_deployment = NULL; - context = g_option_context_new ("INDEX - Delete deployment INDEX"); + context = g_option_context_new ("INDEX"); if (!ostree_admin_option_context_parse (context, options, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER, diff --git a/src/ostree/ot-admin-builtin-unlock.c b/src/ostree/ot-admin-builtin-unlock.c index cb3598fd..60b1209b 100644 --- a/src/ostree/ot-admin-builtin-unlock.c +++ b/src/ostree/ot-admin-builtin-unlock.c @@ -51,7 +51,7 @@ ot_admin_builtin_unlock (int argc, char **argv, OstreeCommandInvocation *invocat OstreeDeployment *booted_deployment = NULL; OstreeDeploymentUnlockedState target_state; - context = g_option_context_new ("Make the current deployment mutable (as a hotfix or development)"); + context = g_option_context_new (""); if (!ostree_admin_option_context_parse (context, options, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER, diff --git a/src/ostree/ot-admin-builtin-upgrade.c b/src/ostree/ot-admin-builtin-upgrade.c index c0542f3e..225811eb 100644 --- a/src/ostree/ot-admin-builtin-upgrade.c +++ b/src/ostree/ot-admin-builtin-upgrade.c @@ -56,7 +56,7 @@ static GOptionEntry options[] = { gboolean ot_admin_builtin_upgrade (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { - g_autoptr(GOptionContext) context = g_option_context_new ("Construct new tree from current origin and deploy it, if it changed"); + g_autoptr(GOptionContext) context = g_option_context_new (""); g_autoptr(OstreeSysroot) sysroot = NULL; if (!ostree_admin_option_context_parse (context, options, &argc, &argv, diff --git a/src/ostree/ot-admin-instutil-builtin-grub2-generate.c b/src/ostree/ot-admin-instutil-builtin-grub2-generate.c index a7eb0d4f..df9d804b 100644 --- a/src/ostree/ot-admin-instutil-builtin-grub2-generate.c +++ b/src/ostree/ot-admin-instutil-builtin-grub2-generate.c @@ -45,7 +45,7 @@ ot_admin_instutil_builtin_grub2_generate (int argc, char **argv, OstreeCommandIn g_autoptr(GOptionContext) context = NULL; g_autoptr(OstreeSysroot) sysroot = NULL; - context = g_option_context_new ("[BOOTVERSION] - generate GRUB2 configuration from given BLS entries"); + context = g_option_context_new ("[BOOTVERSION]"); if (!ostree_admin_option_context_parse (context, options, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER | OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED, diff --git a/src/ostree/ot-admin-instutil-builtin-selinux-ensure-labeled.c b/src/ostree/ot-admin-instutil-builtin-selinux-ensure-labeled.c index ca3fab17..3b546711 100644 --- a/src/ostree/ot-admin-instutil-builtin-selinux-ensure-labeled.c +++ b/src/ostree/ot-admin-instutil-builtin-selinux-ensure-labeled.c @@ -196,7 +196,7 @@ ot_admin_instutil_builtin_selinux_ensure_labeled (int argc, char **argv, OstreeC g_autoptr(OstreeSysroot) sysroot = NULL; g_autoptr(GFile) deployment_path = NULL; - context = g_option_context_new ("[SUBPATH PREFIX] - relabel all or part of a deployment"); + context = g_option_context_new ("[SUBPATH PREFIX]"); if (!ostree_admin_option_context_parse (context, options, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER | OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED, diff --git a/src/ostree/ot-admin-instutil-builtin-set-kargs.c b/src/ostree/ot-admin-instutil-builtin-set-kargs.c index 7419581c..c1c41871 100644 --- a/src/ostree/ot-admin-instutil-builtin-set-kargs.c +++ b/src/ostree/ot-admin-instutil-builtin-set-kargs.c @@ -58,7 +58,7 @@ ot_admin_instutil_builtin_set_kargs (int argc, char **argv, OstreeCommandInvocat g_autoptr(OstreeSysroot) sysroot = NULL; __attribute__((cleanup(_ostree_kernel_args_cleanup))) OstreeKernelArgs *kargs = NULL; - context = g_option_context_new ("ARGS - set new kernel command line arguments"); + context = g_option_context_new ("ARGS"); if (!ostree_admin_option_context_parse (context, options, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER | OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED, diff --git a/src/ostree/ot-builtin-cat.c b/src/ostree/ot-builtin-cat.c index 88bd4fdb..ff45c24a 100644 --- a/src/ostree/ot-builtin-cat.c +++ b/src/ostree/ot-builtin-cat.c @@ -57,7 +57,7 @@ cat_one_file (GFile *f, gboolean ostree_builtin_cat (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { - g_autoptr(GOptionContext) context = g_option_context_new ("COMMIT PATH... - Concatenate contents of files"); + g_autoptr(GOptionContext) context = g_option_context_new ("COMMIT PATH..."); g_autoptr(OstreeRepo) repo = NULL; if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) return FALSE; diff --git a/src/ostree/ot-builtin-checkout.c b/src/ostree/ot-builtin-checkout.c index 79718c9c..ea21aaac 100644 --- a/src/ostree/ot-builtin-checkout.c +++ b/src/ostree/ot-builtin-checkout.c @@ -288,7 +288,7 @@ ostree_builtin_checkout (int argc, char **argv, OstreeCommandInvocation *invocat const char *destination; g_autofree char *resolved_commit = NULL; - context = g_option_context_new ("COMMIT [DESTINATION] - Check out a commit into a filesystem tree"); + context = g_option_context_new ("COMMIT [DESTINATION]"); if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; diff --git a/src/ostree/ot-builtin-checksum.c b/src/ostree/ot-builtin-checksum.c index 24689ac6..b2a5c5a6 100644 --- a/src/ostree/ot-builtin-checksum.c +++ b/src/ostree/ot-builtin-checksum.c @@ -69,7 +69,7 @@ gboolean ostree_builtin_checksum (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(GOptionContext) context = - g_option_context_new ("PATH - Checksum a file or directory"); + g_option_context_new ("PATH"); if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, NULL, cancellable, error)) return FALSE; diff --git a/src/ostree/ot-builtin-commit.c b/src/ostree/ot-builtin-commit.c index 7df1dfe1..a8eb79aa 100644 --- a/src/ostree/ot-builtin-commit.c +++ b/src/ostree/ot-builtin-commit.c @@ -431,7 +431,7 @@ ostree_builtin_commit (int argc, char **argv, OstreeCommandInvocation *invocatio struct CommitFilterData filter_data = { 0, }; g_autofree char *commit_body = NULL; - context = g_option_context_new ("[PATH] - Commit a new revision"); + context = g_option_context_new ("[PATH]"); if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; diff --git a/src/ostree/ot-builtin-config.c b/src/ostree/ot-builtin-config.c index 94e36465..0fabaefd 100644 --- a/src/ostree/ot-builtin-config.c +++ b/src/ostree/ot-builtin-config.c @@ -68,7 +68,7 @@ ostree_builtin_config (int argc, char **argv, OstreeCommandInvocation *invocatio g_autofree char *key = NULL; GKeyFile *config = NULL; - context = g_option_context_new ("(get KEY|set KEY VALUE) - Change repo configuration settings"); + context = g_option_context_new ("(get KEY|set KEY VALUE)"); if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; diff --git a/src/ostree/ot-builtin-create-usb.c b/src/ostree/ot-builtin-create-usb.c index fcde36c0..6a540c96 100644 --- a/src/ostree/ot-builtin-create-usb.c +++ b/src/ostree/ot-builtin-create-usb.c @@ -51,7 +51,7 @@ ostree_builtin_create_usb (int argc, g_autoptr(OstreeAsyncProgress) progress = NULL; g_auto(GLnxConsoleRef) console = { 0, }; - context = g_option_context_new ("MOUNT-PATH COLLECTION-ID REF [COLLECTION-ID REF...] - Copy the refs to a USB stick"); + context = g_option_context_new ("MOUNT-PATH COLLECTION-ID REF [COLLECTION-ID REF...]"); /* Parse options. */ g_autoptr(OstreeRepo) src_repo = NULL; diff --git a/src/ostree/ot-builtin-diff.c b/src/ostree/ot-builtin-diff.c index 9cd7141b..5f5a4dcd 100644 --- a/src/ostree/ot-builtin-diff.c +++ b/src/ostree/ot-builtin-diff.c @@ -140,7 +140,7 @@ ostree_builtin_diff (int argc, char **argv, OstreeCommandInvocation *invocation, g_autoptr(GPtrArray) removed = NULL; g_autoptr(GPtrArray) added = NULL; - context = g_option_context_new ("REV TARGETDIR - Compare directory TARGETDIR against revision REV"); + context = g_option_context_new ("REV TARGETDIR"); if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; diff --git a/src/ostree/ot-builtin-export.c b/src/ostree/ot-builtin-export.c index 83656d04..ca85301e 100644 --- a/src/ostree/ot-builtin-export.c +++ b/src/ostree/ot-builtin-export.c @@ -77,7 +77,7 @@ ostree_builtin_export (int argc, char **argv, OstreeCommandInvocation *invocatio OstreeRepoExportArchiveOptions opts = { 0, }; #endif - context = g_option_context_new ("COMMIT - Stream COMMIT to stdout in tar format"); + context = g_option_context_new ("COMMIT"); if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; diff --git a/src/ostree/ot-builtin-find-remotes.c b/src/ostree/ot-builtin-find-remotes.c index 3cf6c153..b15bce8d 100644 --- a/src/ostree/ot-builtin-find-remotes.c +++ b/src/ostree/ot-builtin-find-remotes.c @@ -134,7 +134,7 @@ ostree_builtin_find_remotes (int argc, g_auto(GLnxConsoleRef) console = { 0, }; g_autoptr(GHashTable) refs_found = NULL; /* set (element-type OstreeCollectionRef) */ - context = g_option_context_new ("COLLECTION-ID REF [COLLECTION-ID REF...] - Find remotes to serve the given refs"); + context = g_option_context_new ("COLLECTION-ID REF [COLLECTION-ID REF...]"); /* Parse options. */ if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) diff --git a/src/ostree/ot-builtin-fsck.c b/src/ostree/ot-builtin-fsck.c index 81ac3218..116fdc6b 100644 --- a/src/ostree/ot-builtin-fsck.c +++ b/src/ostree/ot-builtin-fsck.c @@ -219,7 +219,7 @@ ostree_builtin_fsck (int argc, char **argv, OstreeCommandInvocation *invocation, g_autoptr(OstreeRepo) repo = NULL; gboolean found_corruption = FALSE; - g_autoptr(GOptionContext) context = g_option_context_new ("- Check the repository for consistency"); + g_autoptr(GOptionContext) context = g_option_context_new (""); if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) return FALSE; diff --git a/src/ostree/ot-builtin-gpg-sign.c b/src/ostree/ot-builtin-gpg-sign.c index 3eeeeb01..14a46f89 100644 --- a/src/ostree/ot-builtin-gpg-sign.c +++ b/src/ostree/ot-builtin-gpg-sign.c @@ -210,7 +210,7 @@ ostree_builtin_gpg_sign (int argc, char **argv,OstreeCommandInvocation *invocati int n_key_ids, ii; gboolean ret = FALSE; - context = g_option_context_new ("COMMIT KEY-ID... - Sign a commit"); + context = g_option_context_new ("COMMIT KEY-ID..."); if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; diff --git a/src/ostree/ot-builtin-init.c b/src/ostree/ot-builtin-init.c index c7729e47..b6b7aed0 100644 --- a/src/ostree/ot-builtin-init.c +++ b/src/ostree/ot-builtin-init.c @@ -52,7 +52,7 @@ ostree_builtin_init (int argc, char **argv,OstreeCommandInvocation *invocation, gboolean ret = FALSE; OstreeRepoMode mode; - context = g_option_context_new ("- Initialize a new empty repository"); + context = g_option_context_new (""); if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; diff --git a/src/ostree/ot-builtin-log.c b/src/ostree/ot-builtin-log.c index ee4b37d0..a8644ec6 100644 --- a/src/ostree/ot-builtin-log.c +++ b/src/ostree/ot-builtin-log.c @@ -93,7 +93,7 @@ ostree_builtin_log (int argc, g_autofree char *checksum = NULL; OstreeDumpFlags flags = OSTREE_DUMP_NONE; - context = g_option_context_new ("REF - Show log starting at commit or ref"); + context = g_option_context_new ("REF"); if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; diff --git a/src/ostree/ot-builtin-ls.c b/src/ostree/ot-builtin-ls.c index bababaad..150dbc89 100644 --- a/src/ostree/ot-builtin-ls.c +++ b/src/ostree/ot-builtin-ls.c @@ -249,7 +249,7 @@ ostree_builtin_ls (int argc, char **argv, OstreeCommandInvocation *invocation, G int i; g_autoptr(GFile) root = NULL; - context = g_option_context_new ("COMMIT [PATH...] - List file paths"); + context = g_option_context_new ("COMMIT [PATH...]"); if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; diff --git a/src/ostree/ot-builtin-prune.c b/src/ostree/ot-builtin-prune.c index ab3816bc..54b18fcc 100644 --- a/src/ostree/ot-builtin-prune.c +++ b/src/ostree/ot-builtin-prune.c @@ -146,7 +146,7 @@ traverse_keep_younger_than (OstreeRepo *repo, const char *checksum, gboolean ostree_builtin_prune (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { - g_autoptr(GOptionContext) context = g_option_context_new ("- Search for unreachable objects"); + g_autoptr(GOptionContext) context = g_option_context_new (""); g_autoptr(OstreeRepo) repo = NULL; if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) return FALSE; diff --git a/src/ostree/ot-builtin-pull-local.c b/src/ostree/ot-builtin-pull-local.c index b907b5aa..b4a68fb3 100644 --- a/src/ostree/ot-builtin-pull-local.c +++ b/src/ostree/ot-builtin-pull-local.c @@ -76,7 +76,7 @@ ostree_builtin_pull_local (int argc, char **argv, OstreeCommandInvocation *invoc g_autoptr(GPtrArray) refs_to_fetch = NULL; OstreeRepoPullFlags pullflags = 0; - context = g_option_context_new ("SRC_REPO [REFS...] - Copy data from SRC_REPO"); + context = g_option_context_new ("SRC_REPO [REFS...]"); if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; diff --git a/src/ostree/ot-builtin-pull.c b/src/ostree/ot-builtin-pull.c index 719c4d5b..827468ff 100644 --- a/src/ostree/ot-builtin-pull.c +++ b/src/ostree/ot-builtin-pull.c @@ -155,7 +155,7 @@ ostree_builtin_pull (int argc, char **argv, OstreeCommandInvocation *invocation, g_autoptr(OstreeAsyncProgress) progress = NULL; gulong signal_handler_id = 0; - context = g_option_context_new ("REMOTE [BRANCH...] - Download data from remote repository"); + context = g_option_context_new ("REMOTE [BRANCH...]"); if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; diff --git a/src/ostree/ot-builtin-refs.c b/src/ostree/ot-builtin-refs.c index 68befc74..3508a529 100644 --- a/src/ostree/ot-builtin-refs.c +++ b/src/ostree/ot-builtin-refs.c @@ -268,7 +268,7 @@ ostree_builtin_refs (int argc, char **argv, OstreeCommandInvocation *invocation, g_autoptr(OstreeRepo) repo = NULL; int i; - context = g_option_context_new ("[PREFIX] - List refs"); + context = g_option_context_new ("[PREFIX]"); if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; diff --git a/src/ostree/ot-builtin-reset.c b/src/ostree/ot-builtin-reset.c index f465e0cf..e9dcf230 100644 --- a/src/ostree/ot-builtin-reset.c +++ b/src/ostree/ot-builtin-reset.c @@ -51,7 +51,7 @@ ostree_builtin_reset (int argc, g_autofree char *checksum = NULL; /* FIXME: Add support for collection–refs. */ - context = g_option_context_new ("REF COMMIT - Reset a REF to a previous COMMIT"); + context = g_option_context_new ("REF COMMIT"); if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; diff --git a/src/ostree/ot-builtin-rev-parse.c b/src/ostree/ot-builtin-rev-parse.c index cf1da5a6..8a4ee372 100644 --- a/src/ostree/ot-builtin-rev-parse.c +++ b/src/ostree/ot-builtin-rev-parse.c @@ -45,7 +45,7 @@ ostree_builtin_rev_parse (int argc, char **argv, OstreeCommandInvocation *invoca int i; g_autofree char *resolved_rev = NULL; - context = g_option_context_new ("REV - Output the target of a rev"); + context = g_option_context_new ("REV"); if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; diff --git a/src/ostree/ot-builtin-show.c b/src/ostree/ot-builtin-show.c index 79dfd29e..2eec7f35 100644 --- a/src/ostree/ot-builtin-show.c +++ b/src/ostree/ot-builtin-show.c @@ -228,7 +228,7 @@ print_if_found (OstreeRepo *repo, gboolean ostree_builtin_show (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { - g_autoptr(GOptionContext) context = g_option_context_new ("OBJECT - Output a metadata object"); + g_autoptr(GOptionContext) context = g_option_context_new ("OBJECT"); g_autoptr(OstreeRepo) repo = NULL; if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) diff --git a/src/ostree/ot-builtin-static-delta.c b/src/ostree/ot-builtin-static-delta.c index c9b6b456..d053500a 100644 --- a/src/ostree/ot-builtin-static-delta.c +++ b/src/ostree/ot-builtin-static-delta.c @@ -126,7 +126,7 @@ static gboolean ot_static_delta_builtin_list (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(OstreeRepo) repo = NULL; - g_autoptr(GOptionContext) context = g_option_context_new ("- list static delta files"); + g_autoptr(GOptionContext) context = g_option_context_new (""); if (!ostree_option_context_parse (context, list_options, &argc, &argv, invocation, &repo, cancellable, error)) return FALSE; @@ -154,7 +154,7 @@ ot_static_delta_builtin_show (int argc, char **argv, OstreeCommandInvocation *in g_autoptr(OstreeRepo) repo = NULL; const char *delta_id = NULL; - context = g_option_context_new ("- Dump information on a delta"); + context = g_option_context_new (""); if (!ostree_option_context_parse (context, list_options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; @@ -184,7 +184,7 @@ ot_static_delta_builtin_delete (int argc, char **argv, OstreeCommandInvocation * g_autoptr(OstreeRepo) repo = NULL; const char *delta_id = NULL; - context = g_option_context_new ("- Remove a delta"); + context = g_option_context_new (""); if (!ostree_option_context_parse (context, list_options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; @@ -214,7 +214,7 @@ ot_static_delta_builtin_generate (int argc, char **argv, OstreeCommandInvocation g_autoptr(GOptionContext) context = NULL; g_autoptr(OstreeRepo) repo = NULL; - context = g_option_context_new ("[TO] - Generate static delta files"); + context = g_option_context_new ("[TO]"); if (!ostree_option_context_parse (context, generate_options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; @@ -365,7 +365,7 @@ ot_static_delta_builtin_apply_offline (int argc, char **argv, OstreeCommandInvoc g_autoptr(GOptionContext) context = NULL; g_autoptr(OstreeRepo) repo = NULL; - context = g_option_context_new ("- Apply static delta file"); + context = g_option_context_new (""); if (!ostree_option_context_parse (context, apply_offline_options, &argc, &argv, invocation, &repo, cancellable, error)) goto out; diff --git a/src/ostree/ot-builtin-summary.c b/src/ostree/ot-builtin-summary.c index a1d0fe56..c6319f15 100644 --- a/src/ostree/ot-builtin-summary.c +++ b/src/ostree/ot-builtin-summary.c @@ -87,7 +87,7 @@ ostree_builtin_summary (int argc, char **argv, OstreeCommandInvocation *invocati g_autoptr(OstreeRepo) repo = NULL; OstreeDumpFlags flags = OSTREE_DUMP_NONE; - context = g_option_context_new ("Manage summary metadata"); + context = g_option_context_new (""); if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error)) return FALSE; diff --git a/src/ostree/ot-main.c b/src/ostree/ot-main.c index c63cff7e..22166c54 100644 --- a/src/ostree/ot-main.c +++ b/src/ostree/ot-main.c @@ -302,8 +302,33 @@ ostree_option_context_parse (GOptionContext *context, GError **error) { g_autoptr(OstreeRepo) repo = NULL; - /* When invocation is NULL, it usually means an error occurs, do not fetch repo this case */ + /* When invocation is NULL, do not fetch repo */ const OstreeBuiltinFlags flags = invocation ? invocation->command->flags : OSTREE_BUILTIN_FLAG_NO_REPO; + + if (invocation && invocation->command->description != NULL) + { + const char *context_summary = g_option_context_get_summary (context); + + /* If the summary is originally empty, we set the description, but + * for root commands(command with subcommands), we want to prepend + * the description to the existing summary string + */ + if (context_summary == NULL) + g_option_context_set_summary (context, invocation->command->description); + else + { + /* TODO: remove this part once we deduplicate the ostree_option_context_new_with_commands + * function from other root commands( command with subcommands). Because + * we can directly add the summary inside the ostree_option_context_new_with_commands function. + */ + g_autoptr(GString) new_summary_string = g_string_new (context_summary); + + g_string_prepend (new_summary_string, "\n\n"); + g_string_prepend (new_summary_string, invocation->command->description); + + g_option_context_set_summary (context, new_summary_string->str); + } + } /* Entries are listed in --help output in the order added. We add the * main entries ourselves so that we can add the --repo entry first. */ diff --git a/src/ostree/ot-remote-builtin-add-cookie.c b/src/ostree/ot-remote-builtin-add-cookie.c index 051d0389..f462d887 100644 --- a/src/ostree/ot-remote-builtin-add-cookie.c +++ b/src/ostree/ot-remote-builtin-add-cookie.c @@ -39,7 +39,7 @@ static GOptionEntry option_entries[] = { gboolean ot_remote_builtin_add_cookie (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { - g_autoptr(GOptionContext) context = g_option_context_new ("NAME DOMAIN PATH COOKIE_NAME VALUE - Add a cookie to remote"); + g_autoptr(GOptionContext) context = g_option_context_new ("NAME DOMAIN PATH COOKIE_NAME VALUE"); g_autoptr(OstreeRepo) repo = NULL; if (!ostree_option_context_parse (context, option_entries, &argc, &argv, invocation, &repo, cancellable, error)) diff --git a/src/ostree/ot-remote-builtin-add.c b/src/ostree/ot-remote-builtin-add.c index 080fd501..98fa5b90 100644 --- a/src/ostree/ot-remote-builtin-add.c +++ b/src/ostree/ot-remote-builtin-add.c @@ -69,7 +69,7 @@ ot_remote_builtin_add (int argc, char **argv, OstreeCommandInvocation *invocatio g_autoptr(GVariant) options = NULL; gboolean ret = FALSE; - context = g_option_context_new ("NAME [metalink=|mirrorlist=]URL [BRANCH...] - Add a remote repository"); + context = g_option_context_new ("NAME [metalink=|mirrorlist=]URL [BRANCH...]"); if (!ostree_option_context_parse (context, option_entries, &argc, &argv, invocation, NULL, cancellable, error)) diff --git a/src/ostree/ot-remote-builtin-delete-cookie.c b/src/ostree/ot-remote-builtin-delete-cookie.c index 726f3ab6..239c12c0 100644 --- a/src/ostree/ot-remote-builtin-delete-cookie.c +++ b/src/ostree/ot-remote-builtin-delete-cookie.c @@ -41,7 +41,7 @@ gboolean ot_remote_builtin_delete_cookie (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(OstreeRepo) repo = NULL; - g_autoptr(GOptionContext) context = g_option_context_new ("NAME DOMAIN PATH COOKIE_NAME- Remove one cookie from remote"); + g_autoptr(GOptionContext) context = g_option_context_new ("NAME DOMAIN PATH COOKIE_NAME"); if (!ostree_option_context_parse (context, option_entries, &argc, &argv, invocation, &repo, cancellable, error)) diff --git a/src/ostree/ot-remote-builtin-delete.c b/src/ostree/ot-remote-builtin-delete.c index 54cba2bf..f2f8a567 100644 --- a/src/ostree/ot-remote-builtin-delete.c +++ b/src/ostree/ot-remote-builtin-delete.c @@ -44,7 +44,7 @@ gboolean ot_remote_builtin_delete (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { - g_autoptr(GOptionContext) context = g_option_context_new ("NAME - Delete a remote repository"); + g_autoptr(GOptionContext) context = g_option_context_new ("NAME"); if (!ostree_option_context_parse (context, option_entries, &argc, &argv, invocation, NULL, cancellable, error)) diff --git a/src/ostree/ot-remote-builtin-gpg-import.c b/src/ostree/ot-remote-builtin-gpg-import.c index eca2fee6..a5e106dc 100644 --- a/src/ostree/ot-remote-builtin-gpg-import.c +++ b/src/ostree/ot-remote-builtin-gpg-import.c @@ -105,7 +105,7 @@ ot_remote_builtin_gpg_import (int argc, char **argv, OstreeCommandInvocation *in guint imported = 0; gboolean ret = FALSE; - context = g_option_context_new ("NAME [KEY-ID...] - Import GPG keys"); + context = g_option_context_new ("NAME [KEY-ID...]"); if (!ostree_option_context_parse (context, option_entries, &argc, &argv, invocation, &repo, cancellable, error)) diff --git a/src/ostree/ot-remote-builtin-list-cookies.c b/src/ostree/ot-remote-builtin-list-cookies.c index 7b7ba5d4..9ea3880a 100644 --- a/src/ostree/ot-remote-builtin-list-cookies.c +++ b/src/ostree/ot-remote-builtin-list-cookies.c @@ -40,7 +40,7 @@ gboolean ot_remote_builtin_list_cookies (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { g_autoptr(OstreeRepo) repo = NULL; - g_autoptr(GOptionContext) context = g_option_context_new ("NAME - Show remote repository cookies"); + g_autoptr(GOptionContext) context = g_option_context_new ("NAME"); if (!ostree_option_context_parse (context, option_entries, &argc, &argv, invocation, &repo, cancellable, error)) diff --git a/src/ostree/ot-remote-builtin-list.c b/src/ostree/ot-remote-builtin-list.c index 589b97bb..eb5a1baa 100644 --- a/src/ostree/ot-remote-builtin-list.c +++ b/src/ostree/ot-remote-builtin-list.c @@ -43,7 +43,7 @@ ot_remote_builtin_list (int argc, char **argv, OstreeCommandInvocation *invocati guint ii, n_remotes = 0; gboolean ret = FALSE; - context = g_option_context_new ("- List remote repository names"); + context = g_option_context_new (""); if (!ostree_option_context_parse (context, option_entries, &argc, &argv, invocation, &repo, cancellable, error)) diff --git a/src/ostree/ot-remote-builtin-refs.c b/src/ostree/ot-remote-builtin-refs.c index 71d5b5d6..ccf89560 100644 --- a/src/ostree/ot-remote-builtin-refs.c +++ b/src/ostree/ot-remote-builtin-refs.c @@ -45,7 +45,7 @@ ot_remote_builtin_refs (int argc, char **argv, OstreeCommandInvocation *invocati gboolean ret = FALSE; g_autoptr(GHashTable) refs = NULL; - context = g_option_context_new ("NAME - List remote refs"); + context = g_option_context_new ("NAME"); if (!ostree_option_context_parse (context, option_entries, &argc, &argv, invocation, &repo, cancellable, error)) diff --git a/src/ostree/ot-remote-builtin-show-url.c b/src/ostree/ot-remote-builtin-show-url.c index 0f3e56f9..08274c15 100644 --- a/src/ostree/ot-remote-builtin-show-url.c +++ b/src/ostree/ot-remote-builtin-show-url.c @@ -42,7 +42,7 @@ ot_remote_builtin_show_url (int argc, char **argv, OstreeCommandInvocation *invo g_autofree char *remote_url = NULL; gboolean ret = FALSE; - context = g_option_context_new ("NAME - Show remote repository URL"); + context = g_option_context_new ("NAME"); if (!ostree_option_context_parse (context, option_entries, &argc, &argv, invocation, &repo, cancellable, error)) diff --git a/src/ostree/ot-remote-builtin-summary.c b/src/ostree/ot-remote-builtin-summary.c index 8d501589..0c9f7724 100644 --- a/src/ostree/ot-remote-builtin-summary.c +++ b/src/ostree/ot-remote-builtin-summary.c @@ -52,7 +52,7 @@ ot_remote_builtin_summary (int argc, char **argv, OstreeCommandInvocation *invoc gboolean gpg_verify_summary; gboolean ret = FALSE; - context = g_option_context_new ("NAME - Show remote summary"); + context = g_option_context_new ("NAME"); if (!ostree_option_context_parse (context, option_entries, &argc, &argv, invocation, &repo, cancellable, error)) From b8251d26bd22338ca65a9ea52c6ca5107e572738 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Thu, 19 Oct 2017 11:18:00 -0400 Subject: [PATCH 69/98] lib/checkout: For "process whiteouts" mode, replace directories too MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I'm playing around with some ostree ⇔ OCI/Docker bits, and ran into this while importing an OCI image that built from the Fedora base image where `/home` is a regular directory, and I added a layer that did the ostree bits of moving it to `/var` and leaving a symlink. OCI/Docker supports this. Now since "process whiteouts" is really the "enable OCI/Docker" mode, let's only replace dirs if that's enabled. This leaves the `UNION_FILES` targeted for its original use case which is unioning components/packages. (Although that use case itself is now a bit superceded by `UNION_IDENTICAL`, but eh). Closes: #1294 Approved by: jlebon --- src/libostree/ostree-repo-checkout.c | 42 +++++++++++++++++++++++++--- src/libostree/ostree-repo.h | 2 +- tests/basic-test.sh | 14 ++++++++++ 3 files changed, 53 insertions(+), 5 deletions(-) diff --git a/src/libostree/ostree-repo-checkout.c b/src/libostree/ostree-repo-checkout.c index d144d03e..c2639a22 100644 --- a/src/libostree/ostree-repo-checkout.c +++ b/src/libostree/ostree-repo-checkout.c @@ -228,8 +228,24 @@ create_file_copy_from_input_at (OstreeRepo *repo, return glnx_throw_errno_prefix (error, "symlinkat"); case OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_FILES: { - /* Unioning? Let's unlink and try again */ - (void) unlinkat (destination_dfd, destination_name, 0); + /* For unioning, we further bifurcate a bit; for the "process whiteouts" + * mode which is really "Docker/OCI", we need to match their semantics + * and handle replacing a directory with a symlink. See also equivalent + * bits for regular files in checkout_file_hardlink(). + */ + if (options->process_whiteouts) + { + if (!glnx_shutil_rm_rf_at (destination_dfd, destination_name, NULL, error)) + return FALSE; + } + else + { + if (unlinkat (destination_dfd, destination_name, 0) < 0) + { + if (G_UNLIKELY (errno != ENOENT)) + return glnx_throw_errno_prefix (error, "unlinkat(%s)", destination_name); + } + } if (symlinkat (target, destination_dfd, destination_name) < 0) return glnx_throw_errno_prefix (error, "symlinkat"); } @@ -309,7 +325,17 @@ create_file_copy_from_input_at (OstreeRepo *repo, /* Handled above */ break; case OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_FILES: - replace_mode = GLNX_LINK_TMPFILE_REPLACE; + /* Special case OCI/Docker - see similar code in checkout_file_hardlink() + * and above for symlinks. + */ + if (options->process_whiteouts) + { + if (!glnx_shutil_rm_rf_at (destination_dfd, destination_name, NULL, error)) + return FALSE; + /* Inherit the NOREPLACE default...we deleted whatever's there */ + } + else + replace_mode = GLNX_LINK_TMPFILE_REPLACE; break; case OSTREE_REPO_CHECKOUT_OVERWRITE_ADD_FILES: replace_mode = GLNX_LINK_TMPFILE_NOREPLACE_IGNORE_EXIST; @@ -467,7 +493,15 @@ checkout_file_hardlink (OstreeRepo *self, /* Make a link with a temp name */ if (!hardlink_add_tmp_name (self, srcfd, loose_path, tmpname, cancellable, error)) return FALSE; - /* Rename it into place */ + /* For OCI/Docker mode, we need to handle replacing a directory with a regular + * file. See also the equivalent code for symlinks above. + */ + if (options->process_whiteouts) + { + if (!glnx_shutil_rm_rf_at (destination_dfd, destination_name, NULL, error)) + return FALSE; + } + /* Rename it into place - for non-OCI this will overwrite files but not directories */ if (!glnx_renameat (self->tmp_dir_fd, tmpname, destination_dfd, destination_name, error)) return FALSE; ret_result = HARDLINK_RESULT_LINKED; diff --git a/src/libostree/ostree-repo.h b/src/libostree/ostree-repo.h index 4f73a051..e1daf08d 100644 --- a/src/libostree/ostree-repo.h +++ b/src/libostree/ostree-repo.h @@ -848,7 +848,7 @@ typedef enum { /** * OstreeRepoCheckoutOverwriteMode: * @OSTREE_REPO_CHECKOUT_OVERWRITE_NONE: No special options - * @OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_FILES: When layering checkouts, unlink() and replace existing files, but do not modify existing directories + * @OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_FILES: When layering checkouts, unlink() and replace existing files, but do not modify existing directories (unless whiteouts are enabled, then directories are replaced) * @OSTREE_REPO_CHECKOUT_OVERWRITE_ADD_FILES: Only add new files/directories * @OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_IDENTICAL: Like UNION_FILES, but error if files are not identical (requires hardlink checkouts) */ diff --git a/tests/basic-test.sh b/tests/basic-test.sh index decaf603..d7c5425c 100644 --- a/tests/basic-test.sh +++ b/tests/basic-test.sh @@ -879,6 +879,20 @@ if touch overlay/baz/.wh.cow && touch overlay/.wh.deeper; then assert_has_file overlay-co/anewdir/blah assert_has_file overlay-co/anewfile + # And test replacing a directory wholesale with a symlink as well as a regular file + mkdir overlay + echo baz to file > overlay/baz + ln -s anewfile overlay/anewdir + $OSTREE --repo=repo commit ${COMMIT_ARGS} -b overlay-dir-convert --tree=dir=overlay + rm overlay -rf + + rm overlay-co -rf + for branch in test2 overlay-dir-convert; do + $OSTREE --repo=repo checkout --union --whiteouts ${branch} overlay-co + done + assert_has_file overlay-co/baz + test -L overlay-co/anewdir + echo "ok whiteouts enabled" # Now double check whiteouts are not processed without --whiteouts From 1222c2271b6a552054dcccf51199ed3314f9c66b Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Thu, 19 Oct 2017 10:25:59 -0400 Subject: [PATCH 70/98] repo: Add wrapper function for setting devino cache on checkout opts I was trying to use this with pygobject for an OCI+ostree project, and pygobject rejected simply assigning to the field (understandably, since it can't bind the lifetime together). Add a wrapper function, which is still unsafe, but hides that unsafety where most people shouldn't find it. And if they do...well, sorry, Rust wasn't invented when ostree was started. Closes: #1295 Approved by: pwithnall --- apidoc/ostree-sections.txt | 2 ++ src/libostree/libostree-devel.sym | 1 + src/libostree/ostree-repo-checkout.c | 18 ++++++++++++++++++ src/libostree/ostree-repo-commit.c | 2 ++ src/libostree/ostree-repo.h | 3 +++ 5 files changed, 26 insertions(+) diff --git a/apidoc/ostree-sections.txt b/apidoc/ostree-sections.txt index 1ba02cfc..b37c8914 100644 --- a/apidoc/ostree-sections.txt +++ b/apidoc/ostree-sections.txt @@ -371,6 +371,8 @@ ostree_repo_write_commit ostree_repo_write_commit_with_time ostree_repo_read_commit_detached_metadata ostree_repo_write_commit_detached_metadata +OstreeRepoCheckoutAtOptions +ostree_repo_checkout_at_options_set_devino OstreeRepoCheckoutMode OstreeRepoCheckoutOverwriteMode ostree_repo_checkout_tree diff --git a/src/libostree/libostree-devel.sym b/src/libostree/libostree-devel.sym index 07d99f15..aa3a82e9 100644 --- a/src/libostree/libostree-devel.sym +++ b/src/libostree/libostree-devel.sym @@ -21,6 +21,7 @@ LIBOSTREE_2017.13 { global: ostree_checksum_file_at; + ostree_repo_checkout_at_options_set_devino; } LIBOSTREE_2017.12; /* Stub section for the stable release *after* this development one; don't diff --git a/src/libostree/ostree-repo-checkout.c b/src/libostree/ostree-repo-checkout.c index c2639a22..962b503d 100644 --- a/src/libostree/ostree-repo-checkout.c +++ b/src/libostree/ostree-repo-checkout.c @@ -1210,6 +1210,24 @@ ostree_repo_checkout_at (OstreeRepo *self, return TRUE; } +/** + * ostree_repo_checkout_at_options_set_devino: + * @opts: Checkout options + * @cache: (transfer none) (nullable): Devino cache + * + * This function simply assigns @cache to the `devino_to_csum_cache` member of + * @opts; it's only useful for introspection. + * + * Note that cache does *not* have its refcount incremented - the lifetime of + * @cache must be equal to or greater than that of @opts. + */ +void +ostree_repo_checkout_at_options_set_devino (OstreeRepoCheckoutAtOptions *opts, + OstreeRepoDevInoCache *cache) +{ + opts->devino_to_csum_cache = cache; +} + static guint devino_hash (gconstpointer a) { diff --git a/src/libostree/ostree-repo-commit.c b/src/libostree/ostree-repo-commit.c index b6fbd3d1..d6a425d8 100644 --- a/src/libostree/ostree-repo-commit.c +++ b/src/libostree/ostree-repo-commit.c @@ -3415,6 +3415,8 @@ ostree_repo_commit_modifier_set_sepolicy (OstreeRepoCommitModifier * * This function will add a reference to @cache without copying - you * should avoid further mutation of the cache. + * + * Since: 2017.13 */ void ostree_repo_commit_modifier_set_devino_cache (OstreeRepoCommitModifier *modifier, diff --git a/src/libostree/ostree-repo.h b/src/libostree/ostree-repo.h index e1daf08d..15e5f94e 100644 --- a/src/libostree/ostree-repo.h +++ b/src/libostree/ostree-repo.h @@ -911,6 +911,9 @@ OstreeRepoDevInoCache * ostree_repo_devino_cache_ref (OstreeRepoDevInoCache *cac _OSTREE_PUBLIC void ostree_repo_devino_cache_unref (OstreeRepoDevInoCache *cache); +_OSTREE_PUBLIC +void ostree_repo_checkout_at_options_set_devino (OstreeRepoCheckoutAtOptions *opts, OstreeRepoDevInoCache *cache); + _OSTREE_PUBLIC gboolean ostree_repo_checkout_at (OstreeRepo *self, OstreeRepoCheckoutAtOptions *options, From 4cda9f14fb5a0a886d9dc28955643b0a4837a154 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Sat, 21 Oct 2017 10:10:34 -0400 Subject: [PATCH 71/98] docs/related-projects: Add Google Usenix link Closes: https://github.com/ostreedev/ostree/issues/1284 Closes: #1299 Approved by: cgwalters --- docs/manual/related-projects.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/manual/related-projects.md b/docs/manual/related-projects.md index e58aeabb..c4f558da 100644 --- a/docs/manual/related-projects.md +++ b/docs/manual/related-projects.md @@ -244,6 +244,11 @@ It's relatively well thought through - however, it is a client-side system assembly. If one wants to image servers and replicate reliably, that'd be a different system. +## Google servers (custom rsync-like approach, live updates) + +This paper talks about how Google was (at least at one point) managing +updates for the host systems for some servers: +[Live Upgrading Thousands of Servers from an Ancient Red Hat Distribution to 10 Year Newer Debian Based One (USENIX LISA 2013)](https://www.usenix.org/node/177348) ## Conary From 32357cef4d76eb611564ab26eb82c72c48e0bfee Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Fri, 20 Oct 2017 09:19:52 -0400 Subject: [PATCH 72/98] bin/status: Port to new style No functional changes; prep for more work. Closes: #1296 Approved by: jlebon --- src/ostree/ot-admin-builtin-status.c | 77 +++++++++++----------------- 1 file changed, 30 insertions(+), 47 deletions(-) diff --git a/src/ostree/ot-admin-builtin-status.c b/src/ostree/ot-admin-builtin-status.c index b763618c..d3e524f3 100644 --- a/src/ostree/ot-admin-builtin-status.c +++ b/src/ostree/ot-admin-builtin-status.c @@ -41,15 +41,12 @@ static char * version_of_commit (OstreeRepo *repo, const char *checksum) { g_autoptr(GVariant) variant = NULL; - /* Shouldn't fail, but if it does, we ignore it */ if (!ostree_repo_load_variant (repo, OSTREE_OBJECT_TYPE_COMMIT, checksum, &variant, NULL)) - goto out; + return NULL; return ot_admin_checksum_version (variant); - out: - return NULL; } static gboolean @@ -58,61 +55,51 @@ deployment_get_gpg_verify (OstreeDeployment *deployment, { /* XXX Something like this could be added to the OstreeDeployment * API in libostree if the OstreeRepo parameter is acceptable. */ - - GKeyFile *origin; - g_autofree char *refspec = NULL; - g_autofree char *remote = NULL; - gboolean gpg_verify = FALSE; - - origin = ostree_deployment_get_origin (deployment); + GKeyFile *origin = ostree_deployment_get_origin (deployment); if (origin == NULL) - goto out; + return FALSE; - refspec = g_key_file_get_string (origin, "origin", "refspec", NULL); + g_autofree char *refspec = g_key_file_get_string (origin, "origin", "refspec", NULL); if (refspec == NULL) - goto out; + return FALSE; + g_autofree char *remote = NULL; if (!ostree_parse_refspec (refspec, &remote, NULL, NULL)) - goto out; + return FALSE; + gboolean gpg_verify = FALSE; if (remote) (void) ostree_repo_remote_get_gpg_verify (repo, remote, &gpg_verify, NULL); -out: return gpg_verify; } gboolean ot_admin_builtin_status (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { - g_autoptr(GOptionContext) context = NULL; - g_autoptr(OstreeSysroot) sysroot = NULL; - gboolean ret = FALSE; - g_autoptr(OstreeRepo) repo = NULL; - OstreeDeployment *booted_deployment = NULL; - g_autoptr(OstreeDeployment) pending_deployment = NULL; - g_autoptr(OstreeDeployment) rollback_deployment = NULL; - g_autoptr(GPtrArray) deployments = NULL; const int is_tty = isatty (1); const char *red_bold_prefix = is_tty ? "\x1b[31m\x1b[1m" : ""; const char *red_bold_suffix = is_tty ? "\x1b[22m\x1b[0m" : ""; - guint i; - context = g_option_context_new (""); + g_autoptr(GOptionContext) context = g_option_context_new (""); + g_autoptr(OstreeSysroot) sysroot = NULL; if (!ostree_admin_option_context_parse (context, options, &argc, &argv, OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED, invocation, &sysroot, cancellable, error)) - goto out; + return FALSE; + g_autoptr(OstreeRepo) repo = NULL; if (!ostree_sysroot_get_repo (sysroot, &repo, cancellable, error)) - goto out; + return FALSE; - deployments = ostree_sysroot_get_deployments (sysroot); - booted_deployment = ostree_sysroot_get_booted_deployment (sysroot); + g_autoptr(GPtrArray) deployments = ostree_sysroot_get_deployments (sysroot); + OstreeDeployment *booted_deployment = ostree_sysroot_get_booted_deployment (sysroot); + g_autoptr(OstreeDeployment) pending_deployment = NULL; + g_autoptr(OstreeDeployment) rollback_deployment = NULL; if (booted_deployment) ostree_sysroot_query_deployments_for (sysroot, NULL, &pending_deployment, &rollback_deployment); @@ -123,18 +110,13 @@ ot_admin_builtin_status (int argc, char **argv, OstreeCommandInvocation *invocat } else { - for (i = 0; i < deployments->len; i++) + for (guint i = 0; i < deployments->len; i++) { OstreeDeployment *deployment = deployments->pdata[i]; - GKeyFile *origin; const char *ref = ostree_deployment_get_csum (deployment); - OstreeDeploymentUnlockedState unlocked = ostree_deployment_get_unlocked (deployment); g_autofree char *version = version_of_commit (repo, ref); - g_autoptr(OstreeGpgVerifyResult) result = NULL; - guint jj, n_signatures; - GError *local_error = NULL; - origin = ostree_deployment_get_origin (deployment); + GKeyFile *origin = ostree_deployment_get_origin (deployment); const char *deployment_status = ""; if (deployment == pending_deployment) @@ -149,6 +131,8 @@ ot_admin_builtin_status (int argc, char **argv, OstreeCommandInvocation *invocat deployment_status); if (version) g_print (" Version: %s\n", version); + + OstreeDeploymentUnlockedState unlocked = ostree_deployment_get_unlocked (deployment); switch (unlocked) { case OSTREE_DEPLOYMENT_UNLOCKED_NONE: @@ -174,8 +158,10 @@ ot_admin_builtin_status (int argc, char **argv, OstreeCommandInvocation *invocat g_autoptr(GString) output_buffer = g_string_sized_new (256); /* Print any digital signatures on this commit. */ - result = ostree_repo_verify_commit_ext (repo, ref, NULL, NULL, - cancellable, &local_error); + g_autoptr(GError) local_error = NULL; + g_autoptr(OstreeGpgVerifyResult) result = + ostree_repo_verify_commit_ext (repo, ref, NULL, NULL, + cancellable, &local_error); /* G_IO_ERROR_NOT_FOUND just means the commit is not signed. */ if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) @@ -185,13 +171,12 @@ ot_admin_builtin_status (int argc, char **argv, OstreeCommandInvocation *invocat } else if (local_error != NULL) { - g_propagate_error (error, local_error); - goto out; + g_propagate_error (error, g_steal_pointer (&local_error)); + return FALSE; } - n_signatures = ostree_gpg_verify_result_count_all (result); - - for (jj = 0; jj < n_signatures; jj++) + const guint n_signatures = ostree_gpg_verify_result_count_all (result); + for (guint jj = 0; jj < n_signatures; jj++) { ostree_gpg_verify_result_describe (result, jj, output_buffer, " GPG: ", OSTREE_GPG_SIGNATURE_FORMAT_DEFAULT); @@ -202,7 +187,5 @@ ot_admin_builtin_status (int argc, char **argv, OstreeCommandInvocation *invocat } } - ret = TRUE; - out: - return ret; + return TRUE; } From 0e0fe859223e7c6e94717f02e8ca04197934b199 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Fri, 20 Oct 2017 10:19:00 -0400 Subject: [PATCH 73/98] bin/status: Inline metadata parsing for versions Pull out the commit metadata explicitly; still just rendering the version, but this is prep for rendering other metadata keys. Closes: #1296 Approved by: jlebon --- src/ostree/ot-admin-builtin-status.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/ostree/ot-admin-builtin-status.c b/src/ostree/ot-admin-builtin-status.c index d3e524f3..8d180a6a 100644 --- a/src/ostree/ot-admin-builtin-status.c +++ b/src/ostree/ot-admin-builtin-status.c @@ -37,18 +37,6 @@ static GOptionEntry options[] = { { NULL } }; -static char * -version_of_commit (OstreeRepo *repo, const char *checksum) -{ - g_autoptr(GVariant) variant = NULL; - /* Shouldn't fail, but if it does, we ignore it */ - if (!ostree_repo_load_variant (repo, OSTREE_OBJECT_TYPE_COMMIT, checksum, - &variant, NULL)) - return NULL; - - return ot_admin_checksum_version (variant); -} - static gboolean deployment_get_gpg_verify (OstreeDeployment *deployment, OstreeRepo *repo) @@ -114,7 +102,20 @@ ot_admin_builtin_status (int argc, char **argv, OstreeCommandInvocation *invocat { OstreeDeployment *deployment = deployments->pdata[i]; const char *ref = ostree_deployment_get_csum (deployment); - g_autofree char *version = version_of_commit (repo, ref); + + /* Load the backing commit; shouldn't normally fail, but if it does, + * we stumble on. + */ + g_autoptr(GVariant) commit = NULL; + (void)ostree_repo_load_variant (repo, OSTREE_OBJECT_TYPE_COMMIT, ref, + &commit, NULL); + g_autoptr(GVariant) commit_metadata = NULL; + if (commit) + commit_metadata = g_variant_get_child_value (commit, 0); + + const char *version = NULL; + if (commit_metadata) + (void) g_variant_lookup (commit_metadata, OSTREE_COMMIT_META_KEY_VERSION, "&s", &version); GKeyFile *origin = ostree_deployment_get_origin (deployment); From 795a953a3605e7caab14ecda5d48d70276126bff Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Thu, 19 Oct 2017 14:28:02 -0400 Subject: [PATCH 74/98] core: Add standard SOURCE_TITLE metadata key This is a freeform string useful to track/display when a commit is "derived" from some other format. For example, in the rpm-ostree test we make a `vmcheck` ref that conceptually overlays the default ref like `fedora-atomic:fedora/26/x86_64/atomic-host`. My current patch sets the source title to e.g. "Dev overlay on fedora-atomic:fedora/26/x86_64/atomic-host". Another case I'm working on now is importing OCI images to use as host images. For that case, the source title is With this patch we could then set the original OCI image name + tag as the source name, like: "oci:cgwalters/demo-custom-fedora-atomic-host:26". Closes: #1296 Approved by: jlebon --- src/libostree/ostree-core.h | 17 +++++++++++++++++ src/ostree/ot-admin-builtin-status.c | 8 +++++++- tests/admin-test.sh | 10 +++++++++- tests/test-admin-deploy-uboot.sh | 4 ++++ 4 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/libostree/ostree-core.h b/src/libostree/ostree-core.h index 979b35a2..3e3631fb 100644 --- a/src/libostree/ostree-core.h +++ b/src/libostree/ostree-core.h @@ -228,6 +228,23 @@ typedef enum { * Since: 2017.7 */ #define OSTREE_COMMIT_META_KEY_ENDOFLIFE "ostree.endoflife" +/** + * OSTREE_COMMIT_META_KEY_SOURCE_TITLE: + * + * GVariant type `s`. This should hold a relatively short single line value + * containing a human-readable "source" for a commit, intended to be displayed + * near the origin ref. This is particularly useful for systems that inject + * content into an OSTree commit from elsewhere - for example, generating from + * an OCI or qcow2 image. Or if generating from packages, the enabled repository + * names and their versions. + * + * Try to keep this key short (e.g. < 80 characters) and human-readable; if you + * desire machine readable data, consider injecting separate metadata keys. + * + * Since: 2017.13 + */ +#define OSTREE_COMMIT_META_KEY_SOURCE_TITLE "ostree.source-title" + /** * OSTREE_COMMIT_META_KEY_REF_BINDING: * diff --git a/src/ostree/ot-admin-builtin-status.c b/src/ostree/ot-admin-builtin-status.c index 8d180a6a..b6fc7117 100644 --- a/src/ostree/ot-admin-builtin-status.c +++ b/src/ostree/ot-admin-builtin-status.c @@ -114,8 +114,12 @@ ot_admin_builtin_status (int argc, char **argv, OstreeCommandInvocation *invocat commit_metadata = g_variant_get_child_value (commit, 0); const char *version = NULL; + const char *source_title = NULL; if (commit_metadata) - (void) g_variant_lookup (commit_metadata, OSTREE_COMMIT_META_KEY_VERSION, "&s", &version); + { + (void) g_variant_lookup (commit_metadata, OSTREE_COMMIT_META_KEY_VERSION, "&s", &version); + (void) g_variant_lookup (commit_metadata, OSTREE_COMMIT_META_KEY_SOURCE_TITLE, "&s", &source_title); + } GKeyFile *origin = ostree_deployment_get_origin (deployment); @@ -152,6 +156,8 @@ ot_admin_builtin_status (int argc, char **argv, OstreeCommandInvocation *invocat g_print (" origin: \n"); else g_print (" origin refspec: %s\n", origin_refspec); + if (source_title) + g_print (" `- %s\n", source_title); } if (deployment_get_gpg_verify (deployment, repo)) diff --git a/tests/admin-test.sh b/tests/admin-test.sh index f5d33a6f..dafbc79b 100644 --- a/tests/admin-test.sh +++ b/tests/admin-test.sh @@ -19,7 +19,7 @@ set -euo pipefail -echo "1..$((22 + ${extra_admin_tests:-0}))" +echo "1..$((23 + ${extra_admin_tests:-0}))" function validate_bootloader() { cd ${test_tmpdir}; @@ -277,6 +277,14 @@ assert_streq ${curr_rev} ${head_rev} echo "ok upgrade with and without override-commit" +${CMD_PREFIX} ostree --repo=${test_tmpdir}/testos-repo commit --add-metadata-string "version=${version}" \ + --add-metadata-string 'ostree.source-title=libtest os_repository_new_commit()' -b testos/buildmaster/x86_64-runtime \ + -s "Build" --tree=dir=${test_tmpdir}/osdata +${CMD_PREFIX} ostree admin upgrade --os=testos +${CMD_PREFIX} ostree admin status | tee status.txt +assert_file_has_content_literal status.txt '`- libtest os_repository_new_commit()' +echo "ok source title" + deployment=$(${CMD_PREFIX} ostree admin --sysroot=sysroot --print-current-dir) ${CMD_PREFIX} ostree --sysroot=sysroot remote add --set=gpg-verify=false remote-test-physical file://$(pwd)/testos-repo assert_not_has_file ${deployment}/etc/ostree/remotes.d/remote-test-physical.conf testos-repo diff --git a/tests/test-admin-deploy-uboot.sh b/tests/test-admin-deploy-uboot.sh index 7791360e..ec031477 100755 --- a/tests/test-admin-deploy-uboot.sh +++ b/tests/test-admin-deploy-uboot.sh @@ -30,6 +30,10 @@ extra_admin_tests=1 . $(dirname $0)/admin-test.sh cd ${test_tmpdir} +# Note this test actually requires a checksum change to /boot, +# because adding the uEnv.txt isn't currently covered by the +# "bootcsum". +os_repository_new_commit "uboot test" "test upgrade multiple kernel args" mkdir -p osdata/usr/lib/ostree-boot cat << 'EOF' > osdata/usr/lib/ostree-boot/uEnv.txt loaduimage=load mmc ${bootpart} ${loadaddr} ${kernel_image} From 4c0f67be0cf0ad28c99bfdef0641af98a2a02d5e Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Mon, 23 Oct 2017 15:59:31 +0100 Subject: [PATCH 75/98] lib/sysroot: Expand docs for ostree_sysroot_get_repo() Add some missing annotations and clarify that it always returns an open repository on success. Signed-off-by: Philip Withnall Closes: #1300 Approved by: cgwalters --- src/libostree/ostree-sysroot.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/libostree/ostree-sysroot.c b/src/libostree/ostree-sysroot.c index ac418486..f9d8fb8c 100644 --- a/src/libostree/ostree-sysroot.c +++ b/src/libostree/ostree-sysroot.c @@ -983,11 +983,14 @@ ostree_sysroot_get_deployment_origin_path (GFile *deployment_path) /** * ostree_sysroot_get_repo: * @self: Sysroot - * @out_repo: (out): Repository in sysroot @self + * @out_repo: (out) (transfer full) (optional): Repository in sysroot @self * @cancellable: Cancellable * @error: Error * - * Retrieve the OSTree repository in sysroot @self. + * Retrieve the OSTree repository in sysroot @self. The repo is guaranteed to be open + * (see ostree_repo_open()). + * + * Returns: %TRUE on success, %FALSE otherwise */ gboolean ostree_sysroot_get_repo (OstreeSysroot *self, From ed15723cd1688a7f2c003c7cbc95be202166c33d Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Fri, 20 Oct 2017 14:15:14 -0400 Subject: [PATCH 76/98] lib/commit: Fix hardlink checkout commit with bare-user + mod xattrs This is more subtle fallout from: https://github.com/ostreedev/ostree/pull/1170 AKA commit: 8fe45362578a43260876134d6547ebd0bb2485c3 Before, if we found a devino cache hit, we'd use it unconditionally. Recall that `bare-user` repositories are very special in that they're the only mode where the on disk state ("physical state") is not the "real" state. The latter is stored in the `user.ostreemeta` xattr. (`bare-user` repos are also highly special in that symlinks are regular files physically, but that's not immediately relevant here). Since we now have `bare-user-only` for the "pure unprivileged container" case, `bare-user` should just be used for "OS builds" which have nonzero uids (and possibly SELinux labels etc.) In an experimental tool I'm writing "skopeo2ostree" which imports OCI images into refs, then squashes them together into a single final commit, we lost the the `81` group ID for `/usr/libexec/dbus-1/dbus-daemon-launch-helper`. This happened because the commit code was loading the "physical" disk state, where the uid/gid are zero because that's the uid I happened to be using. We didn't just directly do the link speedup because I was using `--selinux-policy` which caused the xattrs to change, which caused us to re-commit objects from the physical state. The unit test I added actually doesn't quite trigger this, but I left it because "why not". Really testing this requires the installed test which uses SELinux policy from `/`. The behavior without this fix looks like: ``` -00755 0 0 12 { [(b'user.ostreemeta', [byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x81, 0xed]), (b'security.selinux', b'system_u:object_r:lib_t:s0')] } /usr/lib/dbus-daemon-helper ``` which was obviously totally broken - we shouldn't be picking up the `user.ostreemeta` xattr and actually committing it of course. Closes: #1297 Approved by: jlebon --- src/libostree/ostree-repo-commit.c | 50 +++++++++++++++++-------- tests/installed/itest-bare-user-root.sh | 39 +++++++++++++++++++ tests/test-basic-user.sh | 28 +++++++++++++- 3 files changed, 101 insertions(+), 16 deletions(-) create mode 100755 tests/installed/itest-bare-user-root.sh diff --git a/src/libostree/ostree-repo-commit.c b/src/libostree/ostree-repo-commit.c index d6a425d8..cf1a513f 100644 --- a/src/libostree/ostree-repo-commit.c +++ b/src/libostree/ostree-repo-commit.c @@ -2543,6 +2543,7 @@ get_final_xattrs (OstreeRepo *self, GFile *path, int dfd, const char *dfd_subpath, + GVariant *source_xattrs, GVariant **out_xattrs, gboolean *out_modified, GCancellable *cancellable, @@ -2558,7 +2559,9 @@ get_final_xattrs (OstreeRepo *self, g_autoptr(GVariant) original_xattrs = NULL; if (!skip_xattrs && !self->disable_xattrs) { - if (path && OSTREE_IS_REPO_FILE (path)) + if (source_xattrs) + original_xattrs = g_variant_ref (source_xattrs); + else if (path && OSTREE_IS_REPO_FILE (path)) { if (!ostree_repo_file_get_xattrs (OSTREE_REPO_FILE (path), &original_xattrs, cancellable, error)) @@ -2691,11 +2694,35 @@ write_directory_content_to_mtree_internal (OstreeRepo *self, { g_assert (dir_enum != NULL || dfd_iter != NULL); + GFileType file_type = g_file_info_get_file_type (child_info); + const char *name = g_file_info_get_name (child_info); g_ptr_array_add (path, (char*)name); g_autofree char *child_relpath = ptrarray_path_join (path); + /* See if we have a devino hit; this is used below. Further, for bare-user + * repos we'll reload our file info from the object (specifically the + * ostreemeta xattr). The on-disk state is not normally what we want to + * commit. Basically we're making sure that we pick up "real" uid/gid and any + * xattrs there. + */ + const char *loose_checksum = NULL; + g_autoptr(GVariant) source_xattrs = NULL; + if (dfd_iter != NULL && (file_type != G_FILE_TYPE_DIRECTORY)) + { + guint32 dev = g_file_info_get_attribute_uint32 (child_info, "unix::device"); + guint64 inode = g_file_info_get_attribute_uint64 (child_info, "unix::inode"); + loose_checksum = devino_cache_lookup (self, modifier, dev, inode); + if (loose_checksum && self->mode == OSTREE_REPO_MODE_BARE_USER) + { + child_info = NULL; + if (!ostree_repo_load_file (self, loose_checksum, NULL, &child_info, &source_xattrs, + cancellable, error)) + return FALSE; + } + } + g_autoptr(GFileInfo) modified_info = NULL; OstreeRepoCommitFilterResult filter_result = _ostree_repo_commit_modifier_apply (self, modifier, child_relpath, child_info, &modified_info); @@ -2723,7 +2750,6 @@ write_directory_content_to_mtree_internal (OstreeRepo *self, return TRUE; } - GFileType file_type = g_file_info_get_file_type (child_info); switch (file_type) { case G_FILE_TYPE_DIRECTORY: @@ -2801,7 +2827,7 @@ write_directory_content_to_mtree_internal (OstreeRepo *self, if (dir_enum != NULL) { if (!get_final_xattrs (self, modifier, child_relpath, child_info, child, - -1, name, &xattrs, &xattrs_were_modified, + -1, name, source_xattrs, &xattrs, &xattrs_were_modified, cancellable, error)) return FALSE; } @@ -2813,20 +2839,14 @@ write_directory_content_to_mtree_internal (OstreeRepo *self, int xattr_fd_arg = (file_input_fd != -1) ? file_input_fd : dfd_iter->fd; const char *xattr_path_arg = (file_input_fd != -1) ? NULL : name; if (!get_final_xattrs (self, modifier, child_relpath, child_info, child, - xattr_fd_arg, xattr_path_arg, &xattrs, &xattrs_were_modified, + xattr_fd_arg, xattr_path_arg, source_xattrs, + &xattrs, &xattrs_were_modified, cancellable, error)) return FALSE; } - /* only check the devino cache if the file info & xattrs were not modified */ + /* Used below to see whether we can do a fast path commit */ const gboolean modified_file_meta = child_info_was_modified || xattrs_were_modified; - const char *loose_checksum = NULL; - if (!modified_file_meta) - { - guint32 dev = g_file_info_get_attribute_uint32 (child_info, "unix::device"); - guint64 inode = g_file_info_get_attribute_uint64 (child_info, "unix::inode"); - loose_checksum = devino_cache_lookup (self, modifier, dev, inode); - } /* A big prerequisite list of conditions for whether or not we can * "adopt", i.e. just checksum and rename() into place @@ -2856,7 +2876,7 @@ write_directory_content_to_mtree_internal (OstreeRepo *self, gboolean did_adopt = FALSE; /* The very fast path - we have a devino cache hit, nothing to write */ - if (loose_checksum) + if (loose_checksum && !modified_file_meta) { if (!ostree_mutable_tree_replace_file (mtree, name, loose_checksum, error)) @@ -2979,7 +2999,7 @@ write_directory_to_mtree_internal (OstreeRepo *self, if (filter_result == OSTREE_REPO_COMMIT_FILTER_ALLOW) { if (!get_final_xattrs (self, modifier, relpath, child_info, dir, -1, NULL, - &xattrs, NULL, cancellable, error)) + NULL, &xattrs, NULL, cancellable, error)) return FALSE; g_autofree guchar *child_file_csum = NULL; @@ -3065,7 +3085,7 @@ write_dfd_iter_to_mtree_internal (OstreeRepo *self, if (filter_result == OSTREE_REPO_COMMIT_FILTER_ALLOW) { if (!get_final_xattrs (self, modifier, relpath, modified_info, NULL, src_dfd_iter->fd, - NULL, &xattrs, NULL, cancellable, error)) + NULL, NULL, &xattrs, NULL, cancellable, error)) return FALSE; if (!_ostree_repo_write_directory_meta (self, modified_info, xattrs, &child_file_csum, diff --git a/tests/installed/itest-bare-user-root.sh b/tests/installed/itest-bare-user-root.sh new file mode 100755 index 00000000..f5feac96 --- /dev/null +++ b/tests/installed/itest-bare-user-root.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +# Tests of the "raw ostree" functionality using the host's ostree repo as uid 0. + +set -xeuo pipefail + +dn=$(dirname $0) +. ${dn}/libinsttest.sh + +echo "1..1" + +prepare_tmpdir +ostree --repo=repo init --mode=bare-user +mkdir -p components/{dbus,systemd}/usr/{bin,lib} +echo dbus binary > components/dbus/usr/bin/dbus-daemon +chmod a+x components/dbus/usr/bin/dbus-daemon +echo dbus lib > components/dbus/usr/lib/libdbus.so.1 +echo dbus helper > components/dbus/usr/lib/dbus-daemon-helper +chmod a+x components/dbus/usr/lib/dbus-daemon-helper +echo systemd binary > components/systemd/usr/bin/systemd +chmod a+x components/systemd/usr/bin/systemd +echo systemd lib > components/systemd/usr/lib/libsystemd.so.1 + +# Make the gid on dbus 81 like fedora, also ensure no xattrs +ostree --repo=repo commit --no-xattrs -b component-dbus --owner-uid 0 --owner-gid 81 --tree=dir=components/dbus +ostree --repo=repo commit --no-xattrs -b component-systemd --owner-uid 0 --owner-gid 0 --tree=dir=components/systemd +rm rootfs -rf +for component in dbus systemd; do + ostree --repo=repo checkout -U -H component-${component} --union rootfs +done +echo 'some rootfs data' > rootfs/usr/lib/cache.txt +# Commit using the host's selinux policy +ostree --repo=repo commit --selinux-policy / -b rootfs --link-checkout-speedup --tree=dir=rootfs +ostree --repo=repo ls rootfs /usr/bin/systemd >ls.txt +assert_file_has_content ls.txt '^-007.. 0 0 .*/usr/bin/systemd' +ostree --repo=repo ls -X rootfs /usr/lib/dbus-daemon-helper >ls.txt +assert_file_has_content ls.txt '^-007.. 0 81 .*security.selinux.*/usr/lib/dbus-daemon-helper' +assert_not_file_has_content ls.txt 'user.ostreemeta' +echo "ok bare-user link-checkout-speedup with modified xattrs maintains uids" diff --git a/tests/test-basic-user.sh b/tests/test-basic-user.sh index 291806c8..bc08b65a 100755 --- a/tests/test-basic-user.sh +++ b/tests/test-basic-user.sh @@ -25,7 +25,7 @@ skip_without_user_xattrs setup_test_repository "bare-user" -extra_basic_tests=4 +extra_basic_tests=5 . $(dirname $0)/basic-test.sh # Reset things so we don't inherit a lot of state from earlier tests @@ -73,3 +73,29 @@ rm test2-checkout -rf $OSTREE checkout -U -H test2-unreadable test2-checkout assert_file_has_mode test2-checkout/unreadable 400 echo "ok bare-user handled unreadable file" + +cd ${test_tmpdir} +mkdir -p components/{dbus,systemd}/usr/{bin,lib} +echo dbus binary > components/dbus/usr/bin/dbus-daemon +chmod a+x components/dbus/usr/bin/dbus-daemon +echo dbus lib > components/dbus/usr/lib/libdbus.so.1 +echo dbus helper > components/dbus/usr/lib/dbus-daemon-helper +chmod a+x components/dbus/usr/lib/dbus-daemon-helper +echo systemd binary > components/systemd/usr/bin/systemd +chmod a+x components/systemd/usr/bin/systemd +echo systemd lib > components/systemd/usr/lib/libsystemd.so.1 + +# Make the gid on dbus 81 like fedora +$OSTREE commit -b component-dbus --owner-uid 0 --owner-gid 81 --tree=dir=components/dbus +$OSTREE commit -b component-systemd --owner-uid 0 --owner-gid 0 --tree=dir=components/systemd +rm rootfs -rf +for component in dbus systemd; do + $OSTREE checkout -U -H component-${component} --union rootfs +done +echo 'some rootfs data' > rootfs/usr/lib/cache.txt +$OSTREE commit -b rootfs --link-checkout-speedup --tree=dir=rootfs +$OSTREE ls rootfs /usr/bin/systemd >ls.txt +assert_file_has_content ls.txt '^-007.. 0 0 .*/usr/bin/systemd' +$OSTREE ls rootfs /usr/lib/dbus-daemon-helper >ls.txt +assert_file_has_content ls.txt '^-007.. 0 81 .*/usr/lib/dbus-daemon-helper' +echo "ok bare-user link-checkout-speedup maintains uids" From 90680e1b29019c5b1b1210b4692877e2f3af1054 Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Mon, 23 Oct 2017 16:32:49 +0100 Subject: [PATCH 77/98] lib/repo-finder-avahi: Fix memory corruption of a GVariantIter A GVariantIter* was being passed to a GVariant format string varargs, rather than a GVariantIter**. This resulted in memory corruption. So we can continue to reuse ref_map throughout the function, make it a GVariantIter* rather than a stack-allocated GVariantIter. Signed-off-by: Philip Withnall Closes: #1301 Approved by: cgwalters --- src/libostree/ostree-repo-finder-avahi.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/libostree/ostree-repo-finder-avahi.c b/src/libostree/ostree-repo-finder-avahi.c index 0c88ad60..a2574712 100644 --- a/src/libostree/ostree-repo-finder-avahi.c +++ b/src/libostree/ostree-repo-finder-avahi.c @@ -466,7 +466,7 @@ fill_refs_and_checksums_from_summary (GVariant *summary, { g_autoptr(GVariant) ref_map_v = NULL; g_autoptr(GVariant) additional_metadata_v = NULL; - GVariantIter ref_map; + g_autoptr(GVariantIter) ref_map = NULL; g_auto(GVariantDict) additional_metadata = OT_VARIANT_BUILDER_INITIALIZER; const gchar *collection_id; g_autoptr(GVariantIter) collection_map = NULL; @@ -474,7 +474,7 @@ fill_refs_and_checksums_from_summary (GVariant *summary, ref_map_v = g_variant_get_child_value (summary, 0); additional_metadata_v = g_variant_get_child_value (summary, 1); - g_variant_iter_init (&ref_map, ref_map_v); + ref_map = g_variant_iter_new (ref_map_v); g_variant_dict_init (&additional_metadata, additional_metadata_v); /* If the summary file specifies a collection ID (to apply to all the refs in its @@ -485,10 +485,12 @@ fill_refs_and_checksums_from_summary (GVariant *summary, { if (!ostree_validate_collection_id (collection_id, error)) return FALSE; - if (!fill_refs_and_checksums_from_summary_map (&ref_map, collection_id, refs_and_checksums, error)) + if (!fill_refs_and_checksums_from_summary_map (ref_map, collection_id, refs_and_checksums, error)) return FALSE; } + g_clear_pointer (&ref_map, (GDestroyNotify) g_variant_iter_free); + /* Repeat for the other collections listed in the summary. */ if (g_variant_dict_lookup (&additional_metadata, OSTREE_SUMMARY_COLLECTION_MAP, "a{sa(s(taya{sv}))}", &collection_map)) { @@ -496,7 +498,7 @@ fill_refs_and_checksums_from_summary (GVariant *summary, { if (!ostree_validate_collection_id (collection_id, error)) return FALSE; - if (!fill_refs_and_checksums_from_summary_map (&ref_map, collection_id, refs_and_checksums, error)) + if (!fill_refs_and_checksums_from_summary_map (ref_map, collection_id, refs_and_checksums, error)) return FALSE; } } From b11d1aa3f2bec975982fc4e1d9f690f785f493f4 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Tue, 24 Oct 2017 10:27:23 -0400 Subject: [PATCH 78/98] ci: Update centos container to current again Repo sync issue should be cleared now, and for some reason the previous container is already GC'd. Closes: #1304 Approved by: peterbaouoft --- .papr.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.papr.yml b/.papr.yml index 5b1acbee..04190188 100644 --- a/.papr.yml +++ b/.papr.yml @@ -45,10 +45,8 @@ env: CONFIGOPTS: '--with-curl --with-openssl' tests: - # FIXME revert setting to 7/3/1611 when repos sync - # https://github.com/projectatomic/rpm-ostree/pull/985 - docker run --privileged -v $PWD:$PWD --workdir $PWD - registry.centos.org/centos/centos:7.3.1611 sh -c + registry.centos.org/centos/centos:7 sh -c 'yum install -y git && ci/build-check.sh' --- From 886a5d79280b92d336a4eecc9da287fa8b697542 Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Tue, 24 Oct 2017 15:26:49 +0100 Subject: [PATCH 79/98] lib/repo-finder-mount: Fix propagating NULL errors These two code paths tried to propagate errors which had never been set. Set new errors instead. Signed-off-by: Philip Withnall Closes: #1303 Approved by: cgwalters --- src/libostree/ostree-repo-finder-mount.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/libostree/ostree-repo-finder-mount.c b/src/libostree/ostree-repo-finder-mount.c index b41c2c8c..bae3664e 100644 --- a/src/libostree/ostree-repo-finder-mount.c +++ b/src/libostree/ostree-repo-finder-mount.c @@ -235,8 +235,7 @@ scan_repo (int dfd, { g_debug ("Ignoring repository ‘%s’ on mount ‘%s’ as it’s on a different file system from the mount", path, mount_name); - g_propagate_error (error, g_steal_pointer (&local_error)); - return FALSE; + return glnx_throw (error, "Repository is on a different file system from the mount"); } /* Exclude repositories which resolve to @parent_repo. */ @@ -245,8 +244,7 @@ scan_repo (int dfd, { g_debug ("Ignoring repository ‘%s’ on mount ‘%s’ as it is the same as the one we are resolving", path, mount_name); - g_propagate_error (error, g_steal_pointer (&local_error)); - return FALSE; + return glnx_throw (error, "Repository is the same as the one we are resolving"); } /* List the repo’s refs and return them. */ From 63ce86d5977ebfbedd2cdfba1e4f6bd400a3a1b8 Mon Sep 17 00:00:00 2001 From: Dan Nicholson Date: Tue, 24 Oct 2017 19:27:17 +0000 Subject: [PATCH 80/98] lib/repo: Properly handle NULL homedir when signing commit Without this, ostree_repo_sign_commit throws a critical message when no homedir is provided: (ostree gpg-sign:5034): GLib-GIO-CRITICAL **: g_file_new_for_path: assertion 'path != NULL' failed Closes: #1305 Approved by: cgwalters --- src/libostree/ostree-repo.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c index 7ee7892a..3d53a2db 100644 --- a/src/libostree/ostree-repo.c +++ b/src/libostree/ostree-repo.c @@ -4092,7 +4092,9 @@ ostree_repo_sign_commit (OstreeRepo *self, * pass the homedir so that the signing key can be imported, allowing * subkey signatures to be recognised. */ g_autoptr(GError) local_error = NULL; - g_autoptr(GFile) verify_keydir = g_file_new_for_path (homedir); + g_autoptr(GFile) verify_keydir = NULL; + if (homedir != NULL) + verify_keydir = g_file_new_for_path (homedir); g_autoptr(OstreeGpgVerifyResult) result =_ostree_repo_gpg_verify_with_metadata (self, commit_data, old_metadata, NULL, verify_keydir, NULL, From d76840d0c1e6e23ab54cee7a5142671e2cc4fae2 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Tue, 24 Oct 2017 10:10:09 -0400 Subject: [PATCH 81/98] tree-wide: Use autoptr for OstreeKernelArgs Much nicer looking. Prep for more cleanup from https://github.com/projectatomic/rpm-ostree/pull/1013 Closes: #1302 Approved by: peterbaouoft --- src/libostree/ostree-bootloader-uboot.c | 2 +- src/libostree/ostree-kernel-args.c | 8 +------- src/libostree/ostree-kernel-args.h | 6 +++--- src/libostree/ostree-sysroot-deploy.c | 10 +++++----- src/libostree/ostree-sysroot.c | 4 ++-- src/ostree/ot-admin-builtin-deploy.c | 2 +- src/ostree/ot-admin-instutil-builtin-set-kargs.c | 2 +- 7 files changed, 14 insertions(+), 20 deletions(-) diff --git a/src/libostree/ostree-bootloader-uboot.c b/src/libostree/ostree-bootloader-uboot.c index 2dbaead8..262681b1 100644 --- a/src/libostree/ostree-bootloader-uboot.c +++ b/src/libostree/ostree-bootloader-uboot.c @@ -74,7 +74,7 @@ append_system_uenv (OstreeBootloaderUboot *self, GError **error) { glnx_autofd int uenv_fd = -1; - __attribute__((cleanup(_ostree_kernel_args_cleanup))) OstreeKernelArgs *kargs = NULL; + g_autoptr(OstreeKernelArgs) kargs = NULL; const char *uenv_path = NULL; const char *ostree_arg = NULL; diff --git a/src/libostree/ostree-kernel-args.c b/src/libostree/ostree-kernel-args.c index a92a1f82..a2575453 100644 --- a/src/libostree/ostree-kernel-args.c +++ b/src/libostree/ostree-kernel-args.c @@ -81,7 +81,7 @@ _ostree_kernel_args_new (void) } void -_ostree_kernel_arg_autofree (OstreeKernelArgs *kargs) +_ostree_kernel_args_free (OstreeKernelArgs *kargs) { if (!kargs) return; @@ -90,12 +90,6 @@ _ostree_kernel_arg_autofree (OstreeKernelArgs *kargs) g_free (kargs); } -void -_ostree_kernel_args_cleanup (void *loc) -{ - _ostree_kernel_arg_autofree (*((OstreeKernelArgs**)loc)); -} - void _ostree_kernel_args_replace_take (OstreeKernelArgs *kargs, char *arg) diff --git a/src/libostree/ostree-kernel-args.h b/src/libostree/ostree-kernel-args.h index 4fff6df9..0bc43704 100644 --- a/src/libostree/ostree-kernel-args.h +++ b/src/libostree/ostree-kernel-args.h @@ -19,15 +19,15 @@ #pragma once -#include +#include "libglnx.h" G_BEGIN_DECLS typedef struct _OstreeKernelArgs OstreeKernelArgs; +void _ostree_kernel_args_free (OstreeKernelArgs *kargs); +G_DEFINE_AUTOPTR_CLEANUP_FUNC(OstreeKernelArgs, _ostree_kernel_args_free); OstreeKernelArgs *_ostree_kernel_args_new (void); -void _ostree_kernel_args_free (OstreeKernelArgs *kargs); -void _ostree_kernel_args_cleanup (void *loc); void _ostree_kernel_args_replace_take (OstreeKernelArgs *kargs, char *key); void _ostree_kernel_args_replace (OstreeKernelArgs *kargs, diff --git a/src/libostree/ostree-sysroot-deploy.c b/src/libostree/ostree-sysroot-deploy.c index c34e0097..29c90ea7 100644 --- a/src/libostree/ostree-sysroot-deploy.c +++ b/src/libostree/ostree-sysroot-deploy.c @@ -1712,7 +1712,7 @@ install_deployment_kernel (OstreeSysroot *sysroot, g_autofree char *ostree_kernel_arg = g_strdup_printf ("ostree=/ostree/boot.%d/%s/%s/%d", new_bootversion, osname, bootcsum, ostree_deployment_get_bootserial (deployment)); - __attribute__((cleanup(_ostree_kernel_args_cleanup))) OstreeKernelArgs *kargs = _ostree_kernel_args_from_string (val); + g_autoptr(OstreeKernelArgs) kargs = _ostree_kernel_args_from_string (val); _ostree_kernel_args_replace_take (kargs, ostree_kernel_arg); ostree_kernel_arg = NULL; g_autofree char *options_key = _ostree_kernel_args_to_string (kargs); @@ -1839,8 +1839,8 @@ deployment_bootconfigs_equal (OstreeDeployment *a, OstreeBootconfigParser *b_bootconfig = ostree_deployment_get_bootconfig (b); const char *a_boot_options = ostree_bootconfig_parser_get (a_bootconfig, "options"); const char *b_boot_options = ostree_bootconfig_parser_get (b_bootconfig, "options"); - __attribute__((cleanup(_ostree_kernel_args_cleanup))) OstreeKernelArgs *a_kargs = NULL; - __attribute__((cleanup(_ostree_kernel_args_cleanup))) OstreeKernelArgs *b_kargs = NULL; + g_autoptr(OstreeKernelArgs) a_kargs = NULL; + g_autoptr(OstreeKernelArgs) b_kargs = NULL; g_autofree char *a_boot_options_without_ostree = NULL; g_autofree char *b_boot_options_without_ostree = NULL; @@ -2400,7 +2400,7 @@ ostree_sysroot_deploy_tree (OstreeSysroot *self, */ if (override_kernel_argv) { - __attribute__((cleanup(_ostree_kernel_args_cleanup))) OstreeKernelArgs *kargs = NULL; + g_autoptr(OstreeKernelArgs) kargs = NULL; g_autofree char *new_options = NULL; kargs = _ostree_kernel_args_new (); @@ -2434,7 +2434,7 @@ ostree_sysroot_deployment_set_kargs (OstreeSysroot *self, g_autoptr(OstreeDeployment) new_deployment = ostree_deployment_clone (deployment); OstreeBootconfigParser *new_bootconfig = ostree_deployment_get_bootconfig (new_deployment); - __attribute__((cleanup(_ostree_kernel_args_cleanup))) OstreeKernelArgs *kargs = _ostree_kernel_args_new (); + g_autoptr(OstreeKernelArgs) kargs = _ostree_kernel_args_new (); _ostree_kernel_args_append_argv (kargs, new_kargs); g_autofree char *new_options = _ostree_kernel_args_to_string (kargs); ostree_bootconfig_parser_set (new_bootconfig, "options", new_options); diff --git a/src/libostree/ostree-sysroot.c b/src/libostree/ostree-sysroot.c index f9d8fb8c..b37e7e5d 100644 --- a/src/libostree/ostree-sysroot.c +++ b/src/libostree/ostree-sysroot.c @@ -1130,7 +1130,7 @@ find_booted_deployment (OstreeSysroot *self, if (root_stbuf.st_dev == self_stbuf.st_dev && root_stbuf.st_ino == self_stbuf.st_ino) { - __attribute__((cleanup(_ostree_kernel_args_cleanup))) OstreeKernelArgs *kernel_args = NULL; + g_autoptr(OstreeKernelArgs) kernel_args = NULL; if (!parse_kernel_commandline (&kernel_args, cancellable, error)) return FALSE; @@ -1620,7 +1620,7 @@ clone_deployment (OstreeSysroot *sysroot, /* Copy the bootloader config options */ OstreeBootconfigParser *bootconfig = ostree_deployment_get_bootconfig (merge_deployment); g_auto(GStrv) previous_args = g_strsplit (ostree_bootconfig_parser_get (bootconfig, "options"), " ", -1); - __attribute__((cleanup(_ostree_kernel_args_cleanup))) OstreeKernelArgs *kargs = _ostree_kernel_args_new (); + g_autoptr(OstreeKernelArgs) kargs = _ostree_kernel_args_new (); _ostree_kernel_args_append_argv (kargs, previous_args); /* Deploy the copy */ diff --git a/src/ostree/ot-admin-builtin-deploy.c b/src/ostree/ot-admin-builtin-deploy.c index ae287939..83550331 100644 --- a/src/ostree/ot-admin-builtin-deploy.c +++ b/src/ostree/ot-admin-builtin-deploy.c @@ -62,7 +62,7 @@ static GOptionEntry options[] = { gboolean ot_admin_builtin_deploy (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error) { - __attribute__((cleanup(_ostree_kernel_args_cleanup))) OstreeKernelArgs *kargs = NULL; + g_autoptr(OstreeKernelArgs) kargs = NULL; g_autoptr(GOptionContext) context = g_option_context_new ("REFSPEC"); diff --git a/src/ostree/ot-admin-instutil-builtin-set-kargs.c b/src/ostree/ot-admin-instutil-builtin-set-kargs.c index c1c41871..1194f82d 100644 --- a/src/ostree/ot-admin-instutil-builtin-set-kargs.c +++ b/src/ostree/ot-admin-instutil-builtin-set-kargs.c @@ -56,7 +56,7 @@ ot_admin_instutil_builtin_set_kargs (int argc, char **argv, OstreeCommandInvocat OstreeDeployment *first_deployment = NULL; g_autoptr(GOptionContext) context = NULL; g_autoptr(OstreeSysroot) sysroot = NULL; - __attribute__((cleanup(_ostree_kernel_args_cleanup))) OstreeKernelArgs *kargs = NULL; + g_autoptr(OstreeKernelArgs) kargs = NULL; context = g_option_context_new ("ARGS"); From 0760ce128183e1bdaaa08bd3d6b17e275b81418a Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Wed, 25 Oct 2017 15:49:49 +0100 Subject: [PATCH 82/98] =?UTF-8?q?lib/repo-finder-mount:=20Ignore=20mounts?= =?UTF-8?q?=20which=20have=20a=20=E2=80=98system=E2=80=99=20file=20system?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For example, tmpfs or a cgroup file system. This is basically an optimisation of the list of file systems we check for repositories, since we would never expect any of these file systems to be capable of containing a repository. Depends on the new API from https://bugzilla.gnome.org/show_bug.cgi?id=788927. Signed-off-by: Philip Withnall Closes: #1307 Approved by: cgwalters --- src/libostree/ostree-repo-finder-mount.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/libostree/ostree-repo-finder-mount.c b/src/libostree/ostree-repo-finder-mount.c index bae3664e..bc01f913 100644 --- a/src/libostree/ostree-repo-finder-mount.c +++ b/src/libostree/ostree-repo-finder-mount.c @@ -23,6 +23,7 @@ #include "config.h" #include +#include #include #include #include @@ -355,6 +356,23 @@ ostree_repo_finder_mount_resolve_async (OstreeRepoFinder *finde continue; } +#if GLIB_CHECK_VERSION(2, 55, 0) +G_GNUC_BEGIN_IGNORE_DEPRECATIONS /* remove once GLIB_VERSION_MAX_ALLOWED ≥ 2.56 */ + g_autoptr(GUnixMountEntry) mount_entry = g_unix_mount_at (mount_root_path, NULL); + + if (mount_entry != NULL && + (g_unix_is_system_fs_type (g_unix_mount_get_fs_type (mount_entry)) || + g_unix_is_system_device_path (g_unix_mount_get_device_path (mount_entry)))) + { + g_debug ("Ignoring mount ‘%s’ as its file system type (%s) or device " + "path (%s) indicate it’s a system mount.", + mount_name, g_unix_mount_get_fs_type (mount_entry), + g_unix_mount_get_device_path (mount_entry)); + continue; + } +G_GNUC_END_IGNORE_DEPRECATIONS +#endif /* GLib 2.56.0 */ + /* stat() the mount root so we can later check whether the resolved * repositories for individual refs are on the same device (to avoid the * symlinks for them pointing outside the mount root). */ From 90ebd48f6aaf45c47b48c44354359f973dcf22a8 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Wed, 25 Oct 2017 13:13:17 -0400 Subject: [PATCH 83/98] lib/repo: Fix loading commitstate with parent repos This makes the code nicer too. Properly unit testing this though really wants like a whole set of stuff around parent repos...but we do have coverage of the non-parent path in the current pull tests. Closes: https://github.com/ostreedev/ostree/issues/1306 Closes: #1308 Approved by: alexlarsson --- src/libostree/ostree-repo.c | 52 ++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 30 deletions(-) diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c index 3d53a2db..7f2929b7 100644 --- a/src/libostree/ostree-repo.c +++ b/src/libostree/ostree-repo.c @@ -2803,6 +2803,7 @@ load_metadata_internal (OstreeRepo *self, GVariant **out_variant, GInputStream **out_stream, guint64 *out_size, + OstreeRepoCommitState *out_state, GCancellable *cancellable, GError **error) { @@ -2812,6 +2813,7 @@ load_metadata_internal (OstreeRepo *self, g_autoptr(GVariant) ret_variant = NULL; g_return_val_if_fail (OSTREE_OBJECT_TYPE_IS_META (objtype), FALSE); + g_return_val_if_fail (objtype == OSTREE_OBJECT_TYPE_COMMIT || out_state == NULL, FALSE); /* Special caching for dirmeta objects, since they're commonly referenced many * times. @@ -2877,11 +2879,24 @@ load_metadata_internal (OstreeRepo *self, if (out_size) *out_size = stbuf.st_size; + + if (out_state) + { + g_autofree char *commitpartial_path = _ostree_get_commitpartial_path (sha256); + *out_state = 0; + + if (!glnx_fstatat_allow_noent (self->repo_dir_fd, commitpartial_path, NULL, 0, error)) + return FALSE; + if (errno == 0) + *out_state |= OSTREE_REPO_COMMIT_STATE_PARTIAL; + } } else if (self->parent_repo) { - if (!ostree_repo_load_variant (self->parent_repo, objtype, sha256, &ret_variant, error)) - return FALSE; + /* Directly recurse to simplify out parameters */ + return load_metadata_internal (self->parent_repo, objtype, sha256, error_if_not_found, + out_variant, out_stream, out_size, out_state, + cancellable, error); } else if (error_if_not_found) { @@ -3193,7 +3208,7 @@ ostree_repo_load_object_stream (OstreeRepo *self, if (OSTREE_OBJECT_TYPE_IS_META (objtype)) { if (!load_metadata_internal (self, objtype, checksum, TRUE, NULL, - &ret_input, &size, + &ret_input, &size, NULL, cancellable, error)) return FALSE; } @@ -3489,7 +3504,7 @@ ostree_repo_load_variant_if_exists (OstreeRepo *self, GError **error) { return load_metadata_internal (self, objtype, sha256, FALSE, - out_variant, NULL, NULL, NULL, error); + out_variant, NULL, NULL, NULL, NULL, error); } /** @@ -3511,7 +3526,7 @@ ostree_repo_load_variant (OstreeRepo *self, GError **error) { return load_metadata_internal (self, objtype, sha256, TRUE, - out_variant, NULL, NULL, NULL, error); + out_variant, NULL, NULL, NULL, NULL, error); } /** @@ -3534,31 +3549,8 @@ ostree_repo_load_commit (OstreeRepo *self, OstreeRepoCommitState *out_state, GError **error) { - if (out_variant) - { - if (!load_metadata_internal (self, OSTREE_OBJECT_TYPE_COMMIT, checksum, TRUE, - out_variant, NULL, NULL, NULL, error)) - return FALSE; - } - - if (out_state) - { - g_autofree char *commitpartial_path = _ostree_get_commitpartial_path (checksum); - struct stat stbuf; - - *out_state = 0; - - if (fstatat (self->repo_dir_fd, commitpartial_path, &stbuf, 0) == 0) - { - *out_state |= OSTREE_REPO_COMMIT_STATE_PARTIAL; - } - else if (errno != ENOENT) - { - return glnx_throw_errno_prefix (error, "fstatat(%s)", commitpartial_path); - } - } - - return TRUE; + return load_metadata_internal (self, OSTREE_OBJECT_TYPE_COMMIT, checksum, TRUE, + out_variant, NULL, NULL, out_state, NULL, error); } /** From 74e00d32be0122728b722ce97a07542864f87cbb Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Fri, 27 Oct 2017 14:41:31 +0100 Subject: [PATCH 84/98] ostree-system-generator: Include for autocleanups g_autoptr was new in GLib 2.44, but we officially only require 2.40, so we need to use the backport in libglnx. Signed-off-by: Simon McVittie Closes: #1310 Approved by: cgwalters --- src/switchroot/ostree-system-generator.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/switchroot/ostree-system-generator.c b/src/switchroot/ostree-system-generator.c index 5665d715..f42d679a 100644 --- a/src/switchroot/ostree-system-generator.c +++ b/src/switchroot/ostree-system-generator.c @@ -25,6 +25,8 @@ #include #include +#include + #include "ostree-cmdprivate.h" #include "ostree-mount-util.h" From 72bb1a6b17fe4cd778cc886b12601c0535af5c27 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Wed, 25 Oct 2017 19:31:48 +0200 Subject: [PATCH 85/98] Add OtVariantBuilder This is similar to GVariantBuilder in that it constructs variant containers, but it writes it directly to a file descriptor rather than keep the entier thing in memory. This is useful to create large variants without using a lot of memory. Closes: #1309 Approved by: cgwalters --- Makefile-otutil.am | 2 + src/libotutil/ot-variant-builder.c | 1219 ++++++++++++++++++++++++++++ src/libotutil/ot-variant-builder.h | 61 ++ src/libotutil/otutil.h | 1 + 4 files changed, 1283 insertions(+) create mode 100644 src/libotutil/ot-variant-builder.c create mode 100644 src/libotutil/ot-variant-builder.h diff --git a/Makefile-otutil.am b/Makefile-otutil.am index c4c0338d..b4ee1c4b 100644 --- a/Makefile-otutil.am +++ b/Makefile-otutil.am @@ -34,6 +34,8 @@ libotutil_la_SOURCES = \ src/libotutil/ot-unix-utils.h \ src/libotutil/ot-variant-utils.c \ src/libotutil/ot-variant-utils.h \ + src/libotutil/ot-variant-builder.c \ + src/libotutil/ot-variant-builder.h \ src/libotutil/ot-gio-utils.c \ src/libotutil/ot-gio-utils.h \ src/libotutil/ot-gpg-utils.c \ diff --git a/src/libotutil/ot-variant-builder.c b/src/libotutil/ot-variant-builder.c new file mode 100644 index 00000000..8bf7544a --- /dev/null +++ b/src/libotutil/ot-variant-builder.c @@ -0,0 +1,1219 @@ +/* + * Copyright (C) 2017 Alexander Larsson . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson . + */ + +#include "config.h" + +#include "ot-variant-builder.h" +#include "libglnx/libglnx.h" + +/***************************************************************************************** + * This code is copied from gvariant in glib. With the following copyright: + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + * + * Copyright © 2007, 2008 Ryan Lortie + * Copyright © 2010 Codethink Limited + *****************************************************************************************/ + +typedef struct _GVariantTypeInfo GVariantTypeInfo; + +#define G_VARIANT_TYPE_INFO_CHAR_MAYBE 'm' +#define G_VARIANT_TYPE_INFO_CHAR_ARRAY 'a' +#define G_VARIANT_TYPE_INFO_CHAR_TUPLE '(' +#define G_VARIANT_TYPE_INFO_CHAR_DICT_ENTRY '{' +#define G_VARIANT_TYPE_INFO_CHAR_VARIANT 'v' +#define g_variant_type_info_get_type_char(info) \ + (g_variant_type_info_get_type_string(info)[0]) + +struct _GVariantTypeInfo +{ + gsize fixed_size; + guchar alignment; + guchar container_class; +}; + +typedef struct +{ + GVariantTypeInfo *type_info; + + gsize i, a; + gint8 b, c; + + guint8 ending_type; +} GVariantMemberInfo; + +#define G_VARIANT_MEMBER_ENDING_FIXED 0 +#define G_VARIANT_MEMBER_ENDING_LAST 1 +#define G_VARIANT_MEMBER_ENDING_OFFSET 2 + +typedef struct +{ + GVariantTypeInfo info; + + gchar *type_string; + gint ref_count; +} ContainerInfo; + +typedef struct +{ + ContainerInfo container; + + GVariantTypeInfo *element; +} ArrayInfo; + +typedef struct +{ + ContainerInfo container; + + GVariantMemberInfo *members; + gsize n_members; +} TupleInfo; + +/* Hard-code the base types in a constant array */ +static const GVariantTypeInfo g_variant_type_info_basic_table[24] = { +#define fixed_aligned(x) x, x - 1 +#define not_a_type 0, +#define unaligned 0, 0 +#define aligned(x) 0, x - 1 + /* 'b' */ { fixed_aligned(1) }, /* boolean */ + /* 'c' */ { not_a_type }, + /* 'd' */ { fixed_aligned(8) }, /* double */ + /* 'e' */ { not_a_type }, + /* 'f' */ { not_a_type }, + /* 'g' */ { unaligned }, /* signature string */ + /* 'h' */ { fixed_aligned(4) }, /* file handle (int32) */ + /* 'i' */ { fixed_aligned(4) }, /* int32 */ + /* 'j' */ { not_a_type }, + /* 'k' */ { not_a_type }, + /* 'l' */ { not_a_type }, + /* 'm' */ { not_a_type }, + /* 'n' */ { fixed_aligned(2) }, /* int16 */ + /* 'o' */ { unaligned }, /* object path string */ + /* 'p' */ { not_a_type }, + /* 'q' */ { fixed_aligned(2) }, /* uint16 */ + /* 'r' */ { not_a_type }, + /* 's' */ { unaligned }, /* string */ + /* 't' */ { fixed_aligned(8) }, /* uint64 */ + /* 'u' */ { fixed_aligned(4) }, /* uint32 */ + /* 'v' */ { aligned(8) }, /* variant */ + /* 'w' */ { not_a_type }, + /* 'x' */ { fixed_aligned(8) }, /* int64 */ + /* 'y' */ { fixed_aligned(1) }, /* byte */ +#undef fixed_aligned +#undef not_a_type +#undef unaligned +#undef aligned +}; + +static GRecMutex g_variant_type_info_lock; +static GHashTable *g_variant_type_info_table; + +static GVariantTypeInfo * g_variant_type_info_ref (GVariantTypeInfo *info); +static void g_variant_type_info_unref (GVariantTypeInfo *info); +static GVariantTypeInfo * g_variant_type_info_get (const GVariantType *type); + +#define GV_ARRAY_INFO_CLASS 'a' +static ArrayInfo * +GV_ARRAY_INFO (GVariantTypeInfo *info) +{ + return (ArrayInfo *) info; +} + +static void +array_info_free (GVariantTypeInfo *info) +{ + ArrayInfo *array_info; + + g_assert (info->container_class == GV_ARRAY_INFO_CLASS); + array_info = (ArrayInfo *) info; + + g_variant_type_info_unref (array_info->element); + g_slice_free (ArrayInfo, array_info); +} + +static ContainerInfo * +array_info_new (const GVariantType *type) +{ + ArrayInfo *info; + + info = g_slice_new (ArrayInfo); + info->container.info.container_class = GV_ARRAY_INFO_CLASS; + + info->element = g_variant_type_info_get (g_variant_type_element (type)); + info->container.info.alignment = info->element->alignment; + info->container.info.fixed_size = 0; + + return (ContainerInfo *) info; +} + +/* == tuple == */ +#define GV_TUPLE_INFO_CLASS 'r' +static TupleInfo * +GV_TUPLE_INFO (GVariantTypeInfo *info) +{ + return (TupleInfo *) info; +} + +static void +tuple_info_free (GVariantTypeInfo *info) +{ + TupleInfo *tuple_info; + gint i; + + g_assert (info->container_class == GV_TUPLE_INFO_CLASS); + tuple_info = (TupleInfo *) info; + + for (i = 0; i < tuple_info->n_members; i++) + g_variant_type_info_unref (tuple_info->members[i].type_info); + + g_slice_free1 (sizeof (GVariantMemberInfo) * tuple_info->n_members, + tuple_info->members); + g_slice_free (TupleInfo, tuple_info); +} + +static void +tuple_allocate_members (const GVariantType *type, + GVariantMemberInfo **members, + gsize *n_members) +{ + const GVariantType *item_type; + gsize i = 0; + + *n_members = g_variant_type_n_items (type); + *members = g_slice_alloc (sizeof (GVariantMemberInfo) * *n_members); + + item_type = g_variant_type_first (type); + while (item_type) + { + GVariantMemberInfo *member = &(*members)[i++]; + + member->type_info = g_variant_type_info_get (item_type); + item_type = g_variant_type_next (item_type); + + if (member->type_info->fixed_size) + member->ending_type = G_VARIANT_MEMBER_ENDING_FIXED; + else if (item_type == NULL) + member->ending_type = G_VARIANT_MEMBER_ENDING_LAST; + else + member->ending_type = G_VARIANT_MEMBER_ENDING_OFFSET; + } + + g_assert (i == *n_members); +} + +/* this is g_variant_type_info_query for a given member of the tuple. + * before the access is done, it is ensured that the item is within + * range and %FALSE is returned if not. + */ +static gboolean +tuple_get_item (TupleInfo *info, + GVariantMemberInfo *item, + gsize *d, + gsize *e) +{ + if (&info->members[info->n_members] == item) + return FALSE; + + *d = item->type_info->alignment; + *e = item->type_info->fixed_size; + return TRUE; +} + +/* Read the documentation for #GVariantMemberInfo in gvarianttype.h + * before attempting to understand this. + * + * This function adds one set of "magic constant" values (for one item + * in the tuple) to the table. + * + * The algorithm in tuple_generate_table() calculates values of 'a', 'b' + * and 'c' for each item, such that the procedure for finding the item + * is to start at the end of the previous variable-sized item, add 'a', + * then round up to the nearest multiple of 'b', then add 'c'. + * Note that 'b' is stored in the usual "one less than" form. ie: + * + * start = ROUND_UP(prev_end + a, (b + 1)) + c; + * + * We tweak these values a little to allow for a slightly easier + * computation and more compact storage. + */ +static void +tuple_table_append (GVariantMemberInfo **items, + gsize i, + gsize a, + gsize b, + gsize c) +{ + GVariantMemberInfo *item = (*items)++; + + /* We can shift multiples of the alignment size from 'c' into 'a'. + * As long as we're shifting whole multiples, it won't affect the + * result. This means that we can take the "aligned" portion off of + * 'c' and add it into 'a'. + * + * Imagine (for sake of clarity) that ROUND_10 rounds up to the + * nearest 10. It is clear that: + * + * ROUND_10(a) + c == ROUND_10(a + 10*(c / 10)) + (c % 10) + * + * ie: remove the 10s portion of 'c' and add it onto 'a'. + * + * To put some numbers on it, imagine we start with a = 34 and c = 27: + * + * ROUND_10(34) + 27 = 40 + 27 = 67 + * + * but also, we can split 27 up into 20 and 7 and do this: + * + * ROUND_10(34 + 20) + 7 = ROUND_10(54) + 7 = 60 + 7 = 67 + * ^^ ^ + * without affecting the result. We do that here. + * + * This reduction in the size of 'c' means that we can store it in a + * gchar instead of a gsize. Due to how the structure is packed, this + * ends up saving us 'two pointer sizes' per item in each tuple when + * allocating using GSlice. + */ + a += ~b & c; /* take the "aligned" part of 'c' and add to 'a' */ + c &= b; /* chop 'c' to contain only the unaligned part */ + + + /* Finally, we made one last adjustment. Recall: + * + * start = ROUND_UP(prev_end + a, (b + 1)) + c; + * + * Forgetting the '+ c' for the moment: + * + * ROUND_UP(prev_end + a, (b + 1)); + * + * we can do a "round up" operation by adding 1 less than the amount + * to round up to, then rounding down. ie: + * + * #define ROUND_UP(x, y) ROUND_DOWN(x + (y-1), y) + * + * Of course, for rounding down to a power of two, we can just mask + * out the appropriate number of low order bits: + * + * #define ROUND_DOWN(x, y) (x & ~(y - 1)) + * + * Which gives us + * + * #define ROUND_UP(x, y) (x + (y - 1) & ~(y - 1)) + * + * but recall that our alignment value 'b' is already "one less". + * This means that to round 'prev_end + a' up to 'b' we can just do: + * + * ((prev_end + a) + b) & ~b + * + * Associativity, and putting the 'c' back on: + * + * (prev_end + (a + b)) & ~b + c + * + * Now, since (a + b) is constant, we can just add 'b' to 'a' now and + * store that as the number to add to prev_end. Then we use ~b as the + * number to take a bitwise 'and' with. Finally, 'c' is added on. + * + * Note, however, that all the low order bits of the 'aligned' value + * are masked out and that all of the high order bits of 'c' have been + * "moved" to 'a' (in the previous step). This means that there are + * no overlapping bits in the addition -- so we can do a bitwise 'or' + * equivalently. + * + * This means that we can now compute the start address of a given + * item in the tuple using the algorithm given in the documentation + * for #GVariantMemberInfo: + * + * item_start = ((prev_end + a) & b) | c; + */ + + item->i = i; + item->a = a + b; + item->b = ~b; + item->c = c; +} + +static gsize +tuple_align (gsize offset, + guint alignment) +{ + return offset + ((-offset) & alignment); +} + +/* This function is the heart of the algorithm for calculating 'i', 'a', + * 'b' and 'c' for each item in the tuple. + * + * Imagine we want to find the start of the "i" in the type "(su(qx)ni)". + * That's a string followed by a uint32, then a tuple containing a + * uint16 and a int64, then an int16, then our "i". In order to get to + * our "i" we: + * + * Start at the end of the string, align to 4 (for the uint32), add 4. + * Align to 8, add 16 (for the tuple). Align to 2, add 2 (for the + * int16). Then we're there. It turns out that, given 3 simple rules, + * we can flatten this iteration into one addition, one alignment, then + * one more addition. + * + * The loop below plays through each item in the tuple, querying its + * alignment and fixed_size into 'd' and 'e', respectively. At all + * times the variables 'a', 'b', and 'c' are maintained such that in + * order to get to the current point, you add 'a', align to 'b' then add + * 'c'. 'b' is kept in "one less than" form. For each item, the proper + * alignment is applied to find the values of 'a', 'b' and 'c' to get to + * the start of that item. Those values are recorded into the table. + * The fixed size of the item (if applicable) is then added on. + * + * These 3 rules are how 'a', 'b' and 'c' are modified for alignment and + * addition of fixed size. They have been proven correct but are + * presented here, without proof: + * + * 1) in order to "align to 'd'" where 'd' is less than or equal to the + * largest level of alignment seen so far ('b'), you align 'c' to + * 'd'. + * 2) in order to "align to 'd'" where 'd' is greater than the largest + * level of alignment seen so far, you add 'c' aligned to 'b' to the + * value of 'a', set 'b' to 'd' (ie: increase the 'largest alignment + * seen') and reset 'c' to 0. + * 3) in order to "add 'e'", just add 'e' to 'c'. + */ +static void +tuple_generate_table (TupleInfo *info) +{ + GVariantMemberInfo *items = info->members; + gsize i = -1, a = 0, b = 0, c = 0, d, e; + + /* iterate over each item in the tuple. + * 'd' will be the alignment of the item (in one-less form) + * 'e' will be the fixed size (or 0 for variable-size items) + */ + while (tuple_get_item (info, items, &d, &e)) + { + /* align to 'd' */ + if (d <= b) + c = tuple_align (c, d); /* rule 1 */ + else + a += tuple_align (c, b), b = d, c = 0; /* rule 2 */ + + /* the start of the item is at this point (ie: right after we + * have aligned for it). store this information in the table. + */ + tuple_table_append (&items, i, a, b, c); + + /* "move past" the item by adding in its size. */ + if (e == 0) + /* variable size: + * + * we'll have an offset stored to mark the end of this item, so + * just bump the offset index to give us a new starting point + * and reset all the counters. + */ + i++, a = b = c = 0; + else + /* fixed size */ + c += e; /* rule 3 */ + } +} + +static void +tuple_set_base_info (TupleInfo *info) +{ + GVariantTypeInfo *base = &info->container.info; + + if (info->n_members > 0) + { + GVariantMemberInfo *m; + + /* the alignment requirement of the tuple is the alignment + * requirement of its largest item. + */ + base->alignment = 0; + for (m = info->members; m < &info->members[info->n_members]; m++) + /* can find the max of a list of "one less than" powers of two + * by 'or'ing them + */ + base->alignment |= m->type_info->alignment; + + m--; /* take 'm' back to the last item */ + + /* the structure only has a fixed size if no variable-size + * offsets are stored and the last item is fixed-sized too (since + * an offset is never stored for the last item). + */ + if (m->i == -1 && m->type_info->fixed_size) + /* in that case, the fixed size can be found by finding the + * start of the last item (in the usual way) and adding its + * fixed size. + * + * if a tuple has a fixed size then it is always a multiple of + * the alignment requirement (to make packing into arrays + * easier) so we round up to that here. + */ + base->fixed_size = + tuple_align (((m->a & m->b) | m->c) + m->type_info->fixed_size, + base->alignment); + else + /* else, the tuple is not fixed size */ + base->fixed_size = 0; + } + else + { + /* the empty tuple: '()'. + * + * has a size of 1 and an no alignment requirement. + * + * It has a size of 1 (not 0) for two practical reasons: + * + * 1) So we can determine how many of them are in an array + * without dividing by zero or without other tricks. + * + * 2) Even if we had some trick to know the number of items in + * the array (as GVariant did at one time) this would open a + * potential denial of service attack: an attacker could send + * you an extremely small array (in terms of number of bytes) + * containing trillions of zero-sized items. If you iterated + * over this array you would effectively infinite-loop your + * program. By forcing a size of at least one, we bound the + * amount of computation done in response to a message to a + * reasonable function of the size of that message. + */ + base->alignment = 0; + base->fixed_size = 1; + } +} + +static ContainerInfo * +tuple_info_new (const GVariantType *type) +{ + TupleInfo *info; + + info = g_slice_new (TupleInfo); + info->container.info.container_class = GV_TUPLE_INFO_CLASS; + + tuple_allocate_members (type, &info->members, &info->n_members); + tuple_generate_table (info); + tuple_set_base_info (info); + + return (ContainerInfo *) info; +} + +static const GVariantMemberInfo * +g_variant_type_info_member_info (GVariantTypeInfo *info, + gsize index) +{ + TupleInfo *tuple_info = GV_TUPLE_INFO (info); + + if (index < tuple_info->n_members) + return &tuple_info->members[index]; + + return NULL; +} + +static GVariantTypeInfo * +g_variant_type_info_element (GVariantTypeInfo *info) +{ + return GV_ARRAY_INFO (info)->element; +} + +static GVariantTypeInfo * +g_variant_type_info_ref (GVariantTypeInfo *info) +{ + if (info->container_class) + { + ContainerInfo *container = (ContainerInfo *) info; + + g_assert_cmpint (container->ref_count, >, 0); + g_atomic_int_inc (&container->ref_count); + } + + return info; +} + +static void +g_variant_type_info_unref (GVariantTypeInfo *info) +{ + if (info->container_class) + { + ContainerInfo *container = (ContainerInfo *) info; + + g_rec_mutex_lock (&g_variant_type_info_lock); + if (g_atomic_int_dec_and_test (&container->ref_count)) + { + g_hash_table_remove (g_variant_type_info_table, + container->type_string); + if (g_hash_table_size (g_variant_type_info_table) == 0) + { + g_hash_table_unref (g_variant_type_info_table); + g_variant_type_info_table = NULL; + } + g_rec_mutex_unlock (&g_variant_type_info_lock); + + g_free (container->type_string); + + if (info->container_class == GV_ARRAY_INFO_CLASS) + array_info_free (info); + + else if (info->container_class == GV_TUPLE_INFO_CLASS) + tuple_info_free (info); + + else + g_assert_not_reached (); + } + else + g_rec_mutex_unlock (&g_variant_type_info_lock); + } +} + +static GVariantTypeInfo * +g_variant_type_info_get (const GVariantType *type) +{ + char type_char; + + type_char = g_variant_type_peek_string (type)[0]; + + if (type_char == G_VARIANT_TYPE_INFO_CHAR_MAYBE || + type_char == G_VARIANT_TYPE_INFO_CHAR_ARRAY || + type_char == G_VARIANT_TYPE_INFO_CHAR_TUPLE || + type_char == G_VARIANT_TYPE_INFO_CHAR_DICT_ENTRY) + { + GVariantTypeInfo *info; + gchar *type_string; + + type_string = g_variant_type_dup_string (type); + + g_rec_mutex_lock (&g_variant_type_info_lock); + + if (g_variant_type_info_table == NULL) + g_variant_type_info_table = g_hash_table_new (g_str_hash, + g_str_equal); + info = g_hash_table_lookup (g_variant_type_info_table, type_string); + + if (info == NULL) + { + ContainerInfo *container; + + if (type_char == G_VARIANT_TYPE_INFO_CHAR_MAYBE || + type_char == G_VARIANT_TYPE_INFO_CHAR_ARRAY) + { + container = array_info_new (type); + } + else /* tuple or dict entry */ + { + container = tuple_info_new (type); + } + + info = (GVariantTypeInfo *) container; + container->type_string = type_string; + container->ref_count = 1; + + g_hash_table_insert (g_variant_type_info_table, type_string, info); + type_string = NULL; + } + else + g_variant_type_info_ref (info); + + g_rec_mutex_unlock (&g_variant_type_info_lock); + g_free (type_string); + + return info; + } + else + { + const GVariantTypeInfo *info; + int index; + + index = type_char - 'b'; + g_assert (G_N_ELEMENTS (g_variant_type_info_basic_table) == 24); + g_assert_cmpint (0, <=, index); + g_assert_cmpint (index, <, 24); + + info = g_variant_type_info_basic_table + index; + + return (GVariantTypeInfo *) info; + } +} + +static inline void +gvs_write_unaligned_le (guchar *bytes, + gsize value, + guint size) +{ + union + { + guchar bytes[GLIB_SIZEOF_SIZE_T]; + gsize integer; + } tmpvalue; + + tmpvalue.integer = GSIZE_TO_LE (value); + memcpy (bytes, &tmpvalue.bytes, size); +} + +static guint +gvs_get_offset_size (gsize size) +{ + if (size > G_MAXUINT32) + return 8; + + else if (size > G_MAXUINT16) + return 4; + + else if (size > G_MAXUINT8) + return 2; + + else if (size > 0) + return 1; + + return 0; +} + +static gsize +gvs_calculate_total_size (gsize body_size, + gsize offsets) +{ + if (body_size + 1 * offsets <= G_MAXUINT8) + return body_size + 1 * offsets; + + if (body_size + 2 * offsets <= G_MAXUINT16) + return body_size + 2 * offsets; + + if (body_size + 4 * offsets <= G_MAXUINT32) + return body_size + 4 * offsets; + + return body_size + 8 * offsets; +} + + +/***************************************************************************************** + * End of glib code + *****************************************************************************************/ + +typedef struct _OtVariantBuilderInfo OtVariantBuilderInfo; + +struct _OtVariantBuilderInfo { + OtVariantBuilderInfo *parent; + OtVariantBuilder *builder; + GVariantType *type; + GVariantTypeInfo *type_info; + guint64 offset; + int n_children; + GArray *child_ends; + + /* type constraint explicitly specified by 'type'. + * for tuple types, this moves along as we add more items. + */ + const GVariantType *expected_type; + + /* type constraint implied by previous array item. + */ + const GVariantType *prev_item_type; + GVariantType *prev_item_type_base; + + /* constraints on the number of children. max = -1 for unlimited. */ + gsize min_items; + gsize max_items; + + /* set to '1' if all items in the container will have the same type + * (ie: maybe, array, variant) '0' if not (ie: tuple, dict entry) + */ + guint uniform_item_types : 1; +} ; + +struct _OtVariantBuilder { + gint ref_count; + int fd; + + /* This is only useful for the topmost builder and points to the top + * of the builder stack. Public APIs take the topmost builder reference + * and use this to find the currently active builder */ + OtVariantBuilderInfo *head; +}; + +static OtVariantBuilderInfo * +ot_variant_builder_info_new (OtVariantBuilder *builder, const GVariantType *type) +{ + OtVariantBuilderInfo *info; + + info = (OtVariantBuilderInfo *) g_slice_new0 (OtVariantBuilderInfo); + + g_return_val_if_fail (g_variant_type_is_container (type), NULL); + + info->builder = builder; + info->type = g_variant_type_copy (type); + info->type_info = g_variant_type_info_get (type); + info->offset = 0; + info->n_children = 0; + info->child_ends = g_array_new (FALSE, TRUE, sizeof (guint64)); + + switch (*(const gchar *) type) + { + case G_VARIANT_CLASS_VARIANT: + info->uniform_item_types = TRUE; + info->expected_type = NULL; + info->min_items = 1; + info->max_items = 1; + break; + + case G_VARIANT_CLASS_ARRAY: + info->uniform_item_types = TRUE; + info->expected_type = + g_variant_type_element (info->type); + info->min_items = 0; + info->max_items = -1; + break; + + case G_VARIANT_CLASS_MAYBE: + info->uniform_item_types = TRUE; + info->expected_type = + g_variant_type_element (info->type); + info->min_items = 0; + info->max_items = 1; + break; + + case G_VARIANT_CLASS_DICT_ENTRY: + info->uniform_item_types = FALSE; + info->expected_type = + g_variant_type_key (info->type); + info->min_items = 2; + info->max_items = 2; + break; + + case 'r': /* G_VARIANT_TYPE_TUPLE was given */ + info->uniform_item_types = FALSE; + info->expected_type = NULL; + info->min_items = 0; + info->max_items = -1; + break; + + case G_VARIANT_CLASS_TUPLE: /* a definite tuple type was given */ + info->expected_type = + g_variant_type_first (info->type); + info->min_items = g_variant_type_n_items (type); + info->max_items = info->min_items; + info->uniform_item_types = FALSE; + break; + + default: + g_assert_not_reached (); + } + + return info; +} + +static void +ot_variant_builder_info_free (OtVariantBuilderInfo *info) +{ + if (info->parent) + ot_variant_builder_info_free (info); + + g_variant_type_free (info->type); + g_array_unref (info->child_ends); + g_free (info->prev_item_type_base); + + g_slice_free (OtVariantBuilderInfo, info); +} + +OtVariantBuilder * +ot_variant_builder_new (const GVariantType *type, + int fd) +{ + OtVariantBuilder *builder; + + builder = (OtVariantBuilder *) g_slice_new0 (OtVariantBuilder); + + g_return_val_if_fail (g_variant_type_is_container (type), NULL); + + builder->head = ot_variant_builder_info_new (builder, type); + builder->ref_count = 1; + builder->fd = fd; + + return builder; +} + +void +ot_variant_builder_unref (OtVariantBuilder *builder) +{ + if (--builder->ref_count) + return; + + ot_variant_builder_info_free (builder->head); + + g_slice_free (OtVariantBuilder, builder); +} + +OtVariantBuilder * +ot_variant_builder_ref (OtVariantBuilder *builder) +{ + builder->ref_count++; + return builder; +} + +/* This is called before adding a child to the container. It updates + the internal state and does the needed alignment */ +static gboolean +ot_variant_builder_pre_add (OtVariantBuilderInfo *info, + const GVariantType *type, + GError **error) +{ + guint alignment = 0; + + if (!info->uniform_item_types) + { + /* advance our expected type pointers */ + if (info->expected_type) + info->expected_type = + g_variant_type_next (info->expected_type); + + if (info->prev_item_type) + info->prev_item_type = + g_variant_type_next (info->prev_item_type); + } + else + { + g_free (info->prev_item_type_base); + info->prev_item_type_base = (GVariantType *)g_strdup ((char *)type); + info->prev_item_type = info->prev_item_type_base; + } + + if (g_variant_type_is_tuple (info->type) || + g_variant_type_is_dict_entry (info->type)) + { + const GVariantMemberInfo *member_info; + + member_info = g_variant_type_info_member_info (info->type_info, info->n_children); + alignment = member_info->type_info->alignment; + } + else if (g_variant_type_is_array (info->type)) + { + GVariantTypeInfo *element_info = g_variant_type_info_element (info->type_info); + + alignment = element_info->alignment; + } + else if (g_variant_type_is_variant (info->type)) + { + alignment = info->type_info->alignment; + } + else + return glnx_throw (error, "adding to type %s not supported", (char *)info->type); + + while (info->offset & alignment) + { + if (glnx_loop_write (info->builder->fd, "\0", 1) < 0) + return glnx_throw_errno (error); + info->offset++; + } + + return TRUE; +} + +static void +ot_variant_builder_add_child_end (OtVariantBuilderInfo *info) +{ + guint64 v = info->offset; + g_array_append_val (info->child_ends, v); +} + +/* This is called after adding a child to the container. It + updates offset, n_children and keeps track of an offset + table if needed */ + +static gboolean +ot_variant_builder_post_add (OtVariantBuilderInfo *info, + const GVariantType *type, + guint64 bytes_added, + GError **error) +{ + info->offset += bytes_added; + + if (g_variant_type_is_tuple (info->type) || + g_variant_type_is_dict_entry (info->type)) + { + const GVariantMemberInfo *member_info; + + member_info = g_variant_type_info_member_info (info->type_info, info->n_children); + if (member_info->ending_type == G_VARIANT_MEMBER_ENDING_OFFSET) + ot_variant_builder_add_child_end (info); + } + else if (g_variant_type_is_array (info->type)) + { + GVariantTypeInfo *element_info = g_variant_type_info_element (info->type_info); + + if (!element_info->fixed_size) + ot_variant_builder_add_child_end (info); + } + else if (g_variant_type_is_variant (info->type)) + { + /* Zero separate */ + if (glnx_loop_write (info->builder->fd, "\0", 1) < 0) + return glnx_throw_errno (error); + + if (glnx_loop_write (info->builder->fd, (char *)type, strlen ((char *)type)) < 0) + return glnx_throw_errno (error); + + info->offset += 1 + strlen ((char *)type); + } + else + return glnx_throw (error, "adding to type %s not supported", (char *)info->type); + + info->n_children++; + + return TRUE; +} + +gboolean +ot_variant_builder_add_from_fd (OtVariantBuilder *builder, + const GVariantType *type, + int fd, + guint64 size, + GError **error) +{ + OtVariantBuilderInfo *info = builder->head; + + g_return_val_if_fail (info->n_children < info->max_items, + FALSE); + g_return_val_if_fail (!info->expected_type || + g_variant_type_is_subtype_of (type, + info->expected_type), + FALSE); + g_return_val_if_fail (!info->prev_item_type || + g_variant_type_is_subtype_of (info->prev_item_type, + type), + FALSE); + + if (!ot_variant_builder_pre_add (info, type, error)) + return FALSE; + + if (glnx_regfile_copy_bytes (fd, builder->fd, size) < 0) + return glnx_throw_errno (error); + + if (!ot_variant_builder_post_add (info, type, size, error)) + return FALSE; + + return TRUE; +} + +gboolean +ot_variant_builder_add_value (OtVariantBuilder *builder, + GVariant *value, + GError **error) +{ + OtVariantBuilderInfo *info = builder->head; + gconstpointer data; + gsize data_size; + /* We ref-sink value, just like g_variant_builder_add_value does */ + g_autoptr(GVariant) keep_around_until_return G_GNUC_UNUSED = g_variant_ref_sink (value); + + g_return_val_if_fail (info->n_children < info->max_items, + FALSE); + g_return_val_if_fail (!info->expected_type || + g_variant_is_of_type (value, + info->expected_type), + FALSE); + g_return_val_if_fail (!info->prev_item_type || + g_variant_is_of_type (value, + info->prev_item_type), + FALSE); + + if (!ot_variant_builder_pre_add (info, g_variant_get_type (value), error)) + return FALSE; + + data = g_variant_get_data (value); + data_size = g_variant_get_size (value); + + if (data) + { + if (glnx_loop_write (builder->fd, data, data_size) < 0) + return glnx_throw_errno (error); + } + + if (!ot_variant_builder_post_add (info, g_variant_get_type (value), data_size, error)) + return FALSE; + + return TRUE; +} + +gboolean +ot_variant_builder_add (OtVariantBuilder *builder, + GError **error, + const gchar *format_string, + ...) +{ + GVariant *variant; + va_list ap; + + va_start (ap, format_string); + variant = g_variant_new_va (format_string, NULL, &ap); + va_end (ap); + + return ot_variant_builder_add_value (builder, variant, error); +} + + +gboolean +ot_variant_builder_open (OtVariantBuilder *builder, + const GVariantType *type, + GError **error) +{ + OtVariantBuilderInfo *info = builder->head; + OtVariantBuilderInfo *new_info; + + g_return_val_if_fail (info->n_children < info->max_items, + FALSE); + g_return_val_if_fail (!info->expected_type || + g_variant_type_is_subtype_of (type, + info->expected_type), + FALSE); + g_return_val_if_fail (!info->prev_item_type || + g_variant_type_is_subtype_of (info->prev_item_type, + type), + FALSE); + + if (!ot_variant_builder_pre_add (info, type, error)) + return FALSE; + + new_info = ot_variant_builder_info_new (builder, type); + new_info->parent = info; + + /* push the prev_item_type down into the subcontainer */ + if (info->prev_item_type) + { + if (!new_info->uniform_item_types) + /* tuples and dict entries */ + new_info->prev_item_type = + g_variant_type_first (info->prev_item_type); + + else if (!g_variant_type_is_variant (new_info->type)) + /* maybes and arrays */ + new_info->prev_item_type = + g_variant_type_element (info->prev_item_type); + } + + builder->head = new_info; + return TRUE; +} + +gboolean +ot_variant_builder_close (OtVariantBuilder *builder, + GError **error) +{ + OtVariantBuilderInfo *info = builder->head; + OtVariantBuilderInfo *parent; + + g_return_val_if_fail (info->parent != NULL, FALSE); + + if (!ot_variant_builder_end (builder, error)) + return FALSE; + + parent = info->parent; + + if (!ot_variant_builder_post_add (parent, info->type, info->offset, error)) + return FALSE; + + builder->head = parent; + + info->parent = NULL; + ot_variant_builder_info_free (info); + + return TRUE; +} + +gboolean +ot_variant_builder_end (OtVariantBuilder *builder, + GError **error) +{ + OtVariantBuilderInfo *info = builder->head; + gsize total_size; + gsize offset_size; + int i; + g_autofree guchar *offset_table = NULL; + gsize offset_table_size; + gboolean add_offset_table = FALSE; + gboolean reverse_offset_table = FALSE; + guchar *p; + + g_return_val_if_fail (info->n_children >= info->min_items, + FALSE); + g_return_val_if_fail (!info->uniform_item_types || + info->prev_item_type != NULL || + g_variant_type_is_definite (info->type), + FALSE); + + if (g_variant_type_is_tuple (info->type) || + g_variant_type_is_dict_entry (info->type)) + { + add_offset_table = TRUE; + reverse_offset_table = TRUE; + } + else if (g_variant_type_is_array (info->type)) + { + GVariantTypeInfo *element_info = g_variant_type_info_element (info->type_info); + + if (!element_info->fixed_size) + add_offset_table = TRUE; + } + else if (g_variant_type_is_variant (info->type)) + { + /* noop */ + } + else + return glnx_throw (error, "closing type %s not supported", (char *)info->type); + + if (add_offset_table) + { + total_size = gvs_calculate_total_size (info->offset, info->child_ends->len); + offset_size = gvs_get_offset_size (total_size); + + offset_table_size = total_size - info->offset; + offset_table = g_malloc (offset_table_size); + p = offset_table; + if (reverse_offset_table) + { + for (i = info->child_ends->len - 1; i >= 0; i--) + { + gvs_write_unaligned_le (p, g_array_index (info->child_ends, guint64, i), offset_size); + p += offset_size; + } + } + else + { + for (i = 0; i < info->child_ends->len; i++) + { + gvs_write_unaligned_le (p, g_array_index (info->child_ends, guint64, i), offset_size); + p += offset_size; + } + } + + if (glnx_loop_write (builder->fd, offset_table, offset_table_size) < 0) + return glnx_throw_errno (error); + + info->offset += offset_table_size; + } + else + g_assert (info->child_ends->len == 0); + + return TRUE; +} diff --git a/src/libotutil/ot-variant-builder.h b/src/libotutil/ot-variant-builder.h new file mode 100644 index 00000000..684bd8c4 --- /dev/null +++ b/src/libotutil/ot-variant-builder.h @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2017 Alexander Larsson . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson . + */ + +#pragma once + +#include + +#include "libglnx.h" + +G_BEGIN_DECLS + +typedef struct _OtVariantBuilder OtVariantBuilder; + +OtVariantBuilder *ot_variant_builder_new (const GVariantType *type, + int fd); +void ot_variant_builder_unref (OtVariantBuilder *builder); +OtVariantBuilder *ot_variant_builder_ref (OtVariantBuilder *builder); +gboolean ot_variant_builder_end (OtVariantBuilder *builder, + GError **error); +gboolean ot_variant_builder_open (OtVariantBuilder *builder, + const GVariantType *type, + GError **error); +gboolean ot_variant_builder_close (OtVariantBuilder *builder, + GError **error); +gboolean ot_variant_builder_add_from_fd (OtVariantBuilder *builder, + const GVariantType *type, + int fd, + guint64 size, + GError **error); +gboolean ot_variant_builder_add_value (OtVariantBuilder *builder, + GVariant *value, + GError **error); +gboolean ot_variant_builder_add (OtVariantBuilder *builder, + GError **error, + const gchar *format_string, + ...); +void ot_variant_builder_add_parsed (OtVariantBuilder *builder, + const gchar *format, + ...); + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (OtVariantBuilder, ot_variant_builder_unref) + +G_END_DECLS diff --git a/src/libotutil/otutil.h b/src/libotutil/otutil.h index 80acb475..05666d2c 100644 --- a/src/libotutil/otutil.h +++ b/src/libotutil/otutil.h @@ -48,6 +48,7 @@ #include #include #include +#include #include #include #include From 74a5df7bd7410125674c7a9398d429baa29a51a3 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Wed, 25 Oct 2017 20:45:21 +0200 Subject: [PATCH 86/98] static deltas: Use OtVariantBuilder to create deltas This allows us to create the final delta desciptor directly on disk rather than having it all in memory. This is nice because it can become quite large if inlined parts are used. Note however, that we currently generate all the delta parts in memory before adding them to the delta, so we still keep all individual parts in memory. Fixing that is the next step. Closes: #1309 Approved by: cgwalters --- .../ostree-repo-static-delta-compilation.c | 123 +++++++++++------- 1 file changed, 76 insertions(+), 47 deletions(-) diff --git a/src/libostree/ostree-repo-static-delta-compilation.c b/src/libostree/ostree-repo-static-delta-compilation.c index 67bfc96e..5fe82557 100644 --- a/src/libostree/ostree-repo-static-delta-compilation.c +++ b/src/libostree/ostree-repo-static-delta-compilation.c @@ -1199,13 +1199,11 @@ ostree_repo_static_delta_generate (OstreeRepo *self, guint min_fallback_size; guint max_bsdiff_size; guint max_chunk_size; - g_auto(GVariantBuilder) metadata_builder = OT_VARIANT_BUILDER_INITIALIZER; DeltaOpts delta_opts = DELTAOPT_FLAG_NONE; guint64 total_compressed_size = 0; guint64 total_uncompressed_size = 0; g_autoptr(GVariantBuilder) part_headers = NULL; g_autoptr(GPtrArray) part_temp_paths = NULL; - g_autoptr(GVariant) delta_descriptor = NULL; g_autoptr(GVariant) to_commit = NULL; const char *opt_filename; g_autofree char *descriptor_name = NULL; @@ -1217,6 +1215,8 @@ ostree_repo_static_delta_generate (OstreeRepo *self, glnx_autofd int tmp_dfd = -1; builder.parts = g_ptr_array_new_with_free_func ((GDestroyNotify)ostree_static_delta_part_builder_unref); builder.fallback_objects = g_ptr_array_new_with_free_func ((GDestroyNotify)g_variant_unref); + g_auto(GLnxTmpfile) descriptor_tmpf = { 0, }; + g_autoptr(OtVariantBuilder) descriptor_builder = NULL; if (!g_variant_lookup (params, "min-fallback-size", "u", &min_fallback_size)) min_fallback_size = 4; @@ -1263,11 +1263,43 @@ ostree_repo_static_delta_generate (OstreeRepo *self, cancellable, error)) goto out; + if (opt_filename) + { + g_autofree char *dnbuf = g_strdup (opt_filename); + const char *dn = dirname (dnbuf); + descriptor_name = g_strdup (opt_filename); + + if (!glnx_opendirat (AT_FDCWD, dn, TRUE, &descriptor_dfd, error)) + goto out; + } + else + { + g_autofree char *descriptor_relpath = _ostree_get_relative_static_delta_superblock_path (from, to); + g_autofree char *dnbuf = g_strdup (descriptor_relpath); + const char *dn = dirname (dnbuf); + + if (!glnx_shutil_mkdir_p_at (self->repo_dir_fd, dn, 0755, cancellable, error)) + goto out; + if (!glnx_opendirat (self->repo_dir_fd, dn, TRUE, &descriptor_dfd, error)) + goto out; + + descriptor_name = g_strdup (basename (descriptor_relpath)); + } + + if (!glnx_open_tmpfile_linkable_at (descriptor_dfd, ".", O_WRONLY | O_CLOEXEC, + &descriptor_tmpf, error)) + goto out; + + descriptor_builder = ot_variant_builder_new (G_VARIANT_TYPE (OSTREE_STATIC_DELTA_SUPERBLOCK_FORMAT), descriptor_tmpf.fd); + + /* Open the metadata dict */ + if (!ot_variant_builder_open (descriptor_builder, G_VARIANT_TYPE ("a{sv}"), error)) + goto out; + /* NOTE: Add user-supplied metadata first. This is used by at least - * xdg-app as a way to provide MIME content sniffing, since the + * flatpak as a way to provide MIME content sniffing, since the * metadata appears first in the file. */ - g_variant_builder_init (&metadata_builder, G_VARIANT_TYPE ("a{sv}")); if (metadata != NULL) { GVariantIter iter; @@ -1276,7 +1308,8 @@ ostree_repo_static_delta_generate (OstreeRepo *self, g_variant_iter_init (&iter, metadata); while ((item = g_variant_iter_next_value (&iter))) { - g_variant_builder_add (&metadata_builder, "@{sv}", item); + if (!ot_variant_builder_add_value (descriptor_builder, item, error)) + goto out; g_variant_unref (item); } } @@ -1294,7 +1327,8 @@ ostree_repo_static_delta_generate (OstreeRepo *self, default: g_assert_not_reached (); } - g_variant_builder_add (&metadata_builder, "{sv}", "ostree.endianness", g_variant_new_byte (endianness_char)); + if (!ot_variant_builder_add (descriptor_builder, error, "{sv}", "ostree.endianness", g_variant_new_byte (endianness_char))) + goto out; } if (opt_filename) @@ -1384,7 +1418,8 @@ ostree_repo_static_delta_generate (OstreeRepo *self, if (inline_parts) { g_autofree char *part_relpath = _ostree_get_relative_static_delta_part_path (from, to, i); - g_variant_builder_add (&metadata_builder, "{sv}", part_relpath, delta_part); + if (!ot_variant_builder_add (descriptor_builder, error, "{sv}", part_relpath, delta_part)) + goto out; } else { @@ -1427,30 +1462,6 @@ ostree_repo_static_delta_generate (OstreeRepo *self, part_builder->uncompressed_size); } } - - if (opt_filename) - { - g_autofree char *dnbuf = g_strdup (opt_filename); - const char *dn = dirname (dnbuf); - descriptor_name = g_strdup (opt_filename); - - if (!glnx_opendirat (AT_FDCWD, dn, TRUE, &descriptor_dfd, error)) - goto out; - } - else - { - g_autofree char *descriptor_relpath = _ostree_get_relative_static_delta_superblock_path (from, to); - g_autofree char *dnbuf = g_strdup (descriptor_relpath); - const char *dn = dirname (dnbuf); - - if (!glnx_shutil_mkdir_p_at (self->repo_dir_fd, dn, 0755, cancellable, error)) - goto out; - if (!glnx_opendirat (self->repo_dir_fd, dn, TRUE, &descriptor_dfd, error)) - goto out; - - descriptor_name = g_strdup (basename (descriptor_relpath)); - } - for (i = 0; i < part_temp_paths->len; i++) { g_autofree char *partstr = g_strdup_printf ("%u", i); @@ -1479,9 +1490,14 @@ ostree_repo_static_delta_generate (OstreeRepo *self, if (detached) { g_autofree char *detached_key = _ostree_get_relative_static_delta_path (from, to, "commitmeta"); - g_variant_builder_add (&metadata_builder, "{sv}", detached_key, detached); + if (!ot_variant_builder_add (descriptor_builder, error, "{sv}", detached_key, detached)) + goto out; } + /* Close metadata dict */ + if (!ot_variant_builder_close (descriptor_builder, error)) + goto out; + /* Generate OSTREE_STATIC_DELTA_SUPERBLOCK_FORMAT */ { GDateTime *now = g_date_time_new_now_utc (); @@ -1490,17 +1506,26 @@ ostree_repo_static_delta_generate (OstreeRepo *self, /* floating */ GVariant *to_csum_v = ostree_checksum_to_bytes_v (to); - delta_descriptor = g_variant_ref_sink (g_variant_new ("(@a{sv}t@ay@ay@" OSTREE_COMMIT_GVARIANT_STRING "@ay" - "a" OSTREE_STATIC_DELTA_META_ENTRY_FORMAT - "@a" OSTREE_STATIC_DELTA_FALLBACK_FORMAT ")", - g_variant_builder_end (&metadata_builder), - GUINT64_TO_BE (g_date_time_to_unix (now)), - from_csum_v, - to_csum_v, - to_commit, - ot_gvariant_new_bytearray ((guchar*)"", 0), - part_headers, - fallback_headers)); + + if (!ot_variant_builder_add (descriptor_builder, error, "t", + GUINT64_TO_BE (g_date_time_to_unix (now))) || + !ot_variant_builder_add_value (descriptor_builder, + from_csum_v, error) || + !ot_variant_builder_add_value (descriptor_builder, + to_csum_v, error) || + !ot_variant_builder_add_value (descriptor_builder, + to_commit, error) || + !ot_variant_builder_add_value (descriptor_builder, + ot_gvariant_new_bytearray ((guchar*)"", 0), error) || + !ot_variant_builder_add_value (descriptor_builder, + g_variant_builder_end (part_headers), error) || + !ot_variant_builder_add_value (descriptor_builder, + fallback_headers, error)) + goto out; + + if (!ot_variant_builder_end (descriptor_builder, error)) + goto out; + g_date_time_unref (now); } @@ -1516,10 +1541,14 @@ ostree_repo_static_delta_generate (OstreeRepo *self, g_printerr ("bsdiff=%u objects\n", builder.n_bsdiff); } - if (!glnx_file_replace_contents_at (descriptor_dfd, descriptor_name, - g_variant_get_data (delta_descriptor), - g_variant_get_size (delta_descriptor), - 0, cancellable, error)) + if (fchmod (descriptor_tmpf.fd, 0644) < 0) + { + glnx_set_error_from_errno (error); + goto out; + } + + if (!glnx_link_tmpfile_at (&descriptor_tmpf, GLNX_LINK_TMPFILE_REPLACE, + descriptor_dfd, descriptor_name, error)) goto out; ret = TRUE; From cbbd159a5dc66988cfccb7dbeaf1de68b177ff15 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Wed, 25 Oct 2017 21:53:38 +0200 Subject: [PATCH 87/98] static-delta-compilation: Move some things around We will do some changes later that need these earliers, so move them up. Closes: #1309 Approved by: cgwalters --- .../ostree-repo-static-delta-compilation.c | 86 +++++++++---------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/src/libostree/ostree-repo-static-delta-compilation.c b/src/libostree/ostree-repo-static-delta-compilation.c index 5fe82557..70a18c36 100644 --- a/src/libostree/ostree-repo-static-delta-compilation.c +++ b/src/libostree/ostree-repo-static-delta-compilation.c @@ -37,6 +37,12 @@ #define CONTENT_SIZE_SIMILARITY_THRESHOLD_PERCENT (30) +typedef enum { + DELTAOPT_FLAG_NONE = (1 << 0), + DELTAOPT_FLAG_DISABLE_BSDIFF = (1 << 1), + DELTAOPT_FLAG_VERBOSE = (1 << 2) +} DeltaOpts; + typedef struct { guint64 uncompressed_size; GPtrArray *objects; @@ -62,11 +68,43 @@ typedef struct { gboolean swap_endian; } OstreeStaticDeltaBuilder; -typedef enum { - DELTAOPT_FLAG_NONE = (1 << 0), - DELTAOPT_FLAG_DISABLE_BSDIFF = (1 << 1), - DELTAOPT_FLAG_VERBOSE = (1 << 2) -} DeltaOpts; +/* Get an input stream for a GVariant */ +static GInputStream * +variant_to_inputstream (GVariant *variant) +{ + GMemoryInputStream *ret = (GMemoryInputStream*) + g_memory_input_stream_new_from_data (g_variant_get_data (variant), + g_variant_get_size (variant), + NULL); + g_object_set_data_full ((GObject*)ret, "ot-variant-data", + g_variant_ref (variant), (GDestroyNotify) g_variant_unref); + return (GInputStream*)ret; +} + +static GBytes * +objtype_checksum_array_new (GPtrArray *objects) +{ + guint i; + GByteArray *ret = g_byte_array_new (); + + for (i = 0; i < objects->len; i++) + { + GVariant *serialized_key = objects->pdata[i]; + OstreeObjectType objtype; + const char *checksum; + guint8 csum[OSTREE_SHA256_DIGEST_LEN]; + guint8 objtype_v; + + ostree_object_name_deserialize (serialized_key, &checksum, &objtype); + objtype_v = (guint8) objtype; + + ostree_checksum_inplace_to_bytes (checksum, csum); + + g_byte_array_append (ret, &objtype_v, 1); + g_byte_array_append (ret, csum, sizeof (csum)); + } + return g_byte_array_free_to_bytes (ret); +} static void ostree_static_delta_part_builder_unref (OstreeStaticDeltaPartBuilder *part_builder) @@ -221,31 +259,6 @@ write_unique_variant_chunk (OstreeStaticDeltaPartBuilder *current_part, return offset; } -static GBytes * -objtype_checksum_array_new (GPtrArray *objects) -{ - guint i; - GByteArray *ret = g_byte_array_new (); - - for (i = 0; i < objects->len; i++) - { - GVariant *serialized_key = objects->pdata[i]; - OstreeObjectType objtype; - const char *checksum; - guint8 csum[OSTREE_SHA256_DIGEST_LEN]; - guint8 objtype_v; - - ostree_object_name_deserialize (serialized_key, &checksum, &objtype); - objtype_v = (guint8) objtype; - - ostree_checksum_inplace_to_bytes (checksum, csum); - - g_byte_array_append (ret, &objtype_v, 1); - g_byte_array_append (ret, csum, sizeof (csum)); - } - return g_byte_array_free_to_bytes (ret); -} - static gboolean splice_stream_to_payload (OstreeStaticDeltaPartBuilder *current_part, GInputStream *istream, @@ -1141,19 +1154,6 @@ get_fallback_headers (OstreeRepo *self, return TRUE; } -/* Get an input stream for a GVariant */ -static GInputStream * -variant_to_inputstream (GVariant *variant) -{ - GMemoryInputStream *ret = (GMemoryInputStream*) - g_memory_input_stream_new_from_data (g_variant_get_data (variant), - g_variant_get_size (variant), - NULL); - g_object_set_data_full ((GObject*)ret, "ot-variant-data", - g_variant_ref (variant), (GDestroyNotify) g_variant_unref); - return (GInputStream*)ret; -} - /** * ostree_repo_static_delta_generate: * @self: Repo From de0e015908d50ffa64c50ef5aaf1e3e2df61e763 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Wed, 25 Oct 2017 22:32:02 +0200 Subject: [PATCH 88/98] static deltas: Process each part as soon as its done Directly when we allocate a new part we finish the old one, writing the compressed data to a temporary file and generating the delta header for it. When all these are done we loop over them and collect the headers, sizes and either copy the tempfile data into the inlined superblock or link the tempfiles to disk with the proper names. Closes: #1309 Approved by: cgwalters --- .../ostree-repo-static-delta-compilation.c | 313 ++++++++++-------- 1 file changed, 180 insertions(+), 133 deletions(-) diff --git a/src/libostree/ostree-repo-static-delta-compilation.c b/src/libostree/ostree-repo-static-delta-compilation.c index 70a18c36..41cd347e 100644 --- a/src/libostree/ostree-repo-static-delta-compilation.c +++ b/src/libostree/ostree-repo-static-delta-compilation.c @@ -44,6 +44,7 @@ typedef enum { } DeltaOpts; typedef struct { + guint64 compressed_size; guint64 uncompressed_size; GPtrArray *objects; GString *payload; @@ -52,6 +53,8 @@ typedef struct { GPtrArray *modes; GHashTable *xattr_set; /* GVariant(ayay) -> offset */ GPtrArray *xattrs; + GLnxTmpfile part_tmpf; + GVariant *header; } OstreeStaticDeltaPartBuilder; typedef struct { @@ -66,6 +69,8 @@ typedef struct { guint n_bsdiff; guint n_fallback; gboolean swap_endian; + int parts_dfd; + DeltaOpts delta_opts; } OstreeStaticDeltaBuilder; /* Get an input stream for a GVariant */ @@ -119,6 +124,9 @@ ostree_static_delta_part_builder_unref (OstreeStaticDeltaPartBuilder *part_build g_ptr_array_unref (part_builder->modes); g_hash_table_unref (part_builder->xattr_set); g_ptr_array_unref (part_builder->xattrs); + glnx_tmpfile_clear (&part_builder->part_tmpf); + if (part_builder->header) + g_variant_unref (part_builder->header); g_free (part_builder); } @@ -200,10 +208,123 @@ xattr_chunk_equals (const void *one, const void *two) return memcmp (g_variant_get_data (v1), g_variant_get_data (v2), l1) == 0; } +static gboolean +finish_part (OstreeStaticDeltaBuilder *builder, GError **error) +{ + OstreeStaticDeltaPartBuilder *part_builder = builder->parts->pdata[builder->parts->len - 1]; + g_autofree guchar *part_checksum = NULL; + g_autoptr(GBytes) objtype_checksum_array = NULL; + g_autoptr(GBytes) checksum_bytes = NULL; + g_autoptr(GOutputStream) part_temp_outstream = NULL; + g_autoptr(GInputStream) part_in = NULL; + g_autoptr(GInputStream) part_payload_in = NULL; + g_autoptr(GMemoryOutputStream) part_payload_out = NULL; + g_autoptr(GConverterOutputStream) part_payload_compressor = NULL; + g_autoptr(GConverter) compressor = NULL; + g_autoptr(GVariant) delta_part_content = NULL; + g_autoptr(GVariant) delta_part = NULL; + g_autoptr(GVariant) delta_part_header = NULL; + g_auto(GVariantBuilder) mode_builder = OT_VARIANT_BUILDER_INITIALIZER; + g_auto(GVariantBuilder) xattr_builder = OT_VARIANT_BUILDER_INITIALIZER; + guint8 compression_type_char; + + g_variant_builder_init (&mode_builder, G_VARIANT_TYPE ("a(uuu)")); + g_variant_builder_init (&xattr_builder, G_VARIANT_TYPE ("aa(ayay)")); + guint j; + + for (j = 0; j < part_builder->modes->len; j++) + g_variant_builder_add_value (&mode_builder, part_builder->modes->pdata[j]); + + for (j = 0; j < part_builder->xattrs->len; j++) + g_variant_builder_add_value (&xattr_builder, part_builder->xattrs->pdata[j]); + + { + g_autoptr(GBytes) payload_b; + g_autoptr(GBytes) operations_b; + + payload_b = g_string_free_to_bytes (part_builder->payload); + part_builder->payload = NULL; + + operations_b = g_string_free_to_bytes (part_builder->operations); + part_builder->operations = NULL; + + delta_part_content = g_variant_new ("(a(uuu)aa(ayay)@ay@ay)", + &mode_builder, &xattr_builder, + ot_gvariant_new_ay_bytes (payload_b), + ot_gvariant_new_ay_bytes (operations_b)); + g_variant_ref_sink (delta_part_content); + } + + /* Hardcode xz for now */ + compressor = (GConverter*)_ostree_lzma_compressor_new (NULL); + compression_type_char = 'x'; + part_payload_in = variant_to_inputstream (delta_part_content); + part_payload_out = (GMemoryOutputStream*)g_memory_output_stream_new (NULL, 0, g_realloc, g_free); + part_payload_compressor = (GConverterOutputStream*)g_converter_output_stream_new ((GOutputStream*)part_payload_out, compressor); + + { + gssize n_bytes_written = g_output_stream_splice ((GOutputStream*)part_payload_compressor, part_payload_in, + G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET | G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE, + NULL, error); + if (n_bytes_written < 0) + return FALSE; + } + + g_clear_pointer (&delta_part_content, g_variant_unref); + + { g_autoptr(GBytes) payload = g_memory_output_stream_steal_as_bytes (part_payload_out); + delta_part = g_variant_ref_sink (g_variant_new ("(y@ay)", + compression_type_char, + ot_gvariant_new_ay_bytes (payload))); + } + + if (!glnx_open_tmpfile_linkable_at (builder->parts_dfd, ".", O_RDWR | O_CLOEXEC, + &part_builder->part_tmpf, error)) + return FALSE; + + part_temp_outstream = g_unix_output_stream_new (part_builder->part_tmpf.fd, FALSE); + + part_in = variant_to_inputstream (delta_part); + if (!ot_gio_splice_get_checksum (part_temp_outstream, part_in, + &part_checksum, + NULL, error)) + return FALSE; + + checksum_bytes = g_bytes_new (part_checksum, OSTREE_SHA256_DIGEST_LEN); + objtype_checksum_array = objtype_checksum_array_new (part_builder->objects); + delta_part_header = g_variant_new ("(u@aytt@ay)", + maybe_swap_endian_u32 (builder->swap_endian, OSTREE_DELTAPART_VERSION), + ot_gvariant_new_ay_bytes (checksum_bytes), + maybe_swap_endian_u64 (builder->swap_endian, (guint64) g_variant_get_size (delta_part)), + maybe_swap_endian_u64 (builder->swap_endian, part_builder->uncompressed_size), + ot_gvariant_new_ay_bytes (objtype_checksum_array)); + g_variant_ref_sink (delta_part_header); + + part_builder->header = g_variant_ref (delta_part_header); + part_builder->compressed_size = g_variant_get_size (delta_part); + + if (builder->delta_opts & DELTAOPT_FLAG_VERBOSE) + { + g_printerr ("part %u n:%u compressed:%" G_GUINT64_FORMAT " uncompressed:%" G_GUINT64_FORMAT "\n", + builder->parts->len, part_builder->objects->len, + part_builder->compressed_size, + part_builder->uncompressed_size); + } + + return TRUE; +} + static OstreeStaticDeltaPartBuilder * -allocate_part (OstreeStaticDeltaBuilder *builder) +allocate_part (OstreeStaticDeltaBuilder *builder, GError **error) { OstreeStaticDeltaPartBuilder *part = g_new0 (OstreeStaticDeltaPartBuilder, 1); + + if (builder->parts->len > 0) + { + if (!finish_part (builder, error)) + return NULL; + } + part->objects = g_ptr_array_new_with_free_func ((GDestroyNotify)g_variant_unref); part->payload = g_string_new (NULL); part->operations = g_string_new (NULL); @@ -351,7 +472,10 @@ process_one_object (OstreeRepo *repo, if (current_part->objects->len > 0 && current_part->payload->len + content_size > builder->max_chunk_size_bytes) { - *current_part_val = current_part = allocate_part (builder); + current_part = allocate_part (builder, error); + if (current_part == NULL) + return FALSE; + *current_part_val = current_part; } guint64 compressed_size; @@ -590,7 +714,10 @@ process_one_rollsum (OstreeRepo *repo, if (current_part->objects->len > 0 && current_part->payload->len > builder->max_chunk_size_bytes) { - *current_part_val = current_part = allocate_part (builder); + current_part = allocate_part (builder, error); + if (current_part == NULL) + return FALSE; + *current_part_val = current_part; } g_autoptr(GBytes) tmp_to = NULL; @@ -705,7 +832,10 @@ process_one_bsdiff (OstreeRepo *repo, if (current_part->objects->len > 0 && current_part->payload->len > builder->max_chunk_size_bytes) { - *current_part_val = current_part = allocate_part (builder); + current_part = allocate_part (builder, error); + if (current_part == NULL) + return FALSE; + *current_part_val = current_part; } g_autoptr(GBytes) tmp_from = NULL; @@ -977,7 +1107,9 @@ generate_delta_lowlatency (OstreeRepo *repo, g_hash_table_size (modified_regfile_content)); } - current_part = allocate_part (builder); + current_part = allocate_part (builder, error); + if (current_part == NULL) + return FALSE; /* Pack the metadata first */ g_hash_table_iter_init (&hashiter, new_reachable_metadata); @@ -1093,6 +1225,9 @@ generate_delta_lowlatency (OstreeRepo *repo, return FALSE; } + if (!finish_part (builder, error)) + return FALSE; + return TRUE; } @@ -1258,6 +1393,26 @@ ostree_repo_static_delta_generate (OstreeRepo *self, &to_commit, error)) goto out; + if (opt_filename) + { + g_autofree char *dnbuf = g_strdup (opt_filename); + const char *dn = dirname (dnbuf); + if (!glnx_opendirat (AT_FDCWD, dn, TRUE, &tmp_dfd, error)) + goto out; + } + else + { + tmp_dfd = fcntl (self->tmp_dir_fd, F_DUPFD_CLOEXEC, 3); + if (tmp_dfd < 0) + { + glnx_set_error_from_errno (error); + goto out; + } + } + + builder.parts_dfd = tmp_dfd; + builder.delta_opts = delta_opts; + /* Ignore optimization flags */ if (!generate_delta_lowlatency (self, from, to, delta_opts, &builder, cancellable, error)) @@ -1331,153 +1486,45 @@ ostree_repo_static_delta_generate (OstreeRepo *self, goto out; } - if (opt_filename) - { - g_autofree char *dnbuf = g_strdup (opt_filename); - const char *dn = dirname (dnbuf); - if (!glnx_opendirat (AT_FDCWD, dn, TRUE, &tmp_dfd, error)) - goto out; - } - else - { - tmp_dfd = fcntl (self->tmp_dir_fd, F_DUPFD_CLOEXEC, 3); - if (tmp_dfd < 0) - { - glnx_set_error_from_errno (error); - goto out; - } - } - part_headers = g_variant_builder_new (G_VARIANT_TYPE ("a" OSTREE_STATIC_DELTA_META_ENTRY_FORMAT)); part_temp_paths = g_ptr_array_new_with_free_func ((GDestroyNotify)glnx_tmpfile_clear); for (i = 0; i < builder.parts->len; i++) { OstreeStaticDeltaPartBuilder *part_builder = builder.parts->pdata[i]; - g_autoptr(GBytes) payload_b; - g_autoptr(GBytes) operations_b; - g_autofree guchar *part_checksum = NULL; - g_autoptr(GBytes) objtype_checksum_array = NULL; - g_autoptr(GBytes) checksum_bytes = NULL; - g_autoptr(GOutputStream) part_temp_outstream = NULL; - g_autoptr(GInputStream) part_in = NULL; - g_autoptr(GInputStream) part_payload_in = NULL; - g_autoptr(GMemoryOutputStream) part_payload_out = NULL; - g_autoptr(GConverterOutputStream) part_payload_compressor = NULL; - g_autoptr(GConverter) compressor = NULL; - g_autoptr(GVariant) delta_part_content = NULL; - g_autoptr(GVariant) delta_part = NULL; - g_autoptr(GVariant) delta_part_header = NULL; - g_auto(GVariantBuilder) mode_builder = OT_VARIANT_BUILDER_INITIALIZER; - g_auto(GVariantBuilder) xattr_builder = OT_VARIANT_BUILDER_INITIALIZER; - guint8 compression_type_char; - - g_variant_builder_init (&mode_builder, G_VARIANT_TYPE ("a(uuu)")); - g_variant_builder_init (&xattr_builder, G_VARIANT_TYPE ("aa(ayay)")); - { guint j; - for (j = 0; j < part_builder->modes->len; j++) - g_variant_builder_add_value (&mode_builder, part_builder->modes->pdata[j]); - - for (j = 0; j < part_builder->xattrs->len; j++) - g_variant_builder_add_value (&xattr_builder, part_builder->xattrs->pdata[j]); - } - - payload_b = g_string_free_to_bytes (part_builder->payload); - part_builder->payload = NULL; - - operations_b = g_string_free_to_bytes (part_builder->operations); - part_builder->operations = NULL; - /* FIXME - avoid duplicating memory here */ - delta_part_content = g_variant_new ("(a(uuu)aa(ayay)@ay@ay)", - &mode_builder, &xattr_builder, - ot_gvariant_new_ay_bytes (payload_b), - ot_gvariant_new_ay_bytes (operations_b)); - g_variant_ref_sink (delta_part_content); - - /* Hardcode xz for now */ - compressor = (GConverter*)_ostree_lzma_compressor_new (NULL); - compression_type_char = 'x'; - part_payload_in = variant_to_inputstream (delta_part_content); - part_payload_out = (GMemoryOutputStream*)g_memory_output_stream_new (NULL, 0, g_realloc, g_free); - part_payload_compressor = (GConverterOutputStream*)g_converter_output_stream_new ((GOutputStream*)part_payload_out, compressor); - - { - gssize n_bytes_written = g_output_stream_splice ((GOutputStream*)part_payload_compressor, part_payload_in, - G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET | G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE, - cancellable, error); - if (n_bytes_written < 0) - goto out; - } - - /* FIXME - avoid duplicating memory here */ - { g_autoptr(GBytes) payload = g_memory_output_stream_steal_as_bytes (part_payload_out); - delta_part = g_variant_ref_sink (g_variant_new ("(y@ay)", - compression_type_char, - ot_gvariant_new_ay_bytes (payload))); - } if (inline_parts) { g_autofree char *part_relpath = _ostree_get_relative_static_delta_part_path (from, to, i); - if (!ot_variant_builder_add (descriptor_builder, error, "{sv}", part_relpath, delta_part)) + + lseek (part_builder->part_tmpf.fd, 0, SEEK_SET); + + if (!ot_variant_builder_open (descriptor_builder, G_VARIANT_TYPE ("{sv}"), error) || + !ot_variant_builder_add (descriptor_builder, error, "s", part_relpath) || + !ot_variant_builder_open (descriptor_builder, G_VARIANT_TYPE ("v"), error) || + !ot_variant_builder_add_from_fd (descriptor_builder, G_VARIANT_TYPE ("(yay)"), part_builder->part_tmpf.fd, part_builder->compressed_size, error) || + !ot_variant_builder_close (descriptor_builder, error) || + !ot_variant_builder_close (descriptor_builder, error)) goto out; } else { - GLnxTmpfile *part_tmpf = g_new0 (GLnxTmpfile, 1); + g_autofree char *partstr = g_strdup_printf ("%u", i); - if (!glnx_open_tmpfile_linkable_at (tmp_dfd, ".", O_WRONLY | O_CLOEXEC, - part_tmpf, error)) + if (fchmod (part_builder->part_tmpf.fd, 0644) < 0) + { + glnx_set_error_from_errno (error); + goto out; + } + + if (!glnx_link_tmpfile_at (&part_builder->part_tmpf, GLNX_LINK_TMPFILE_REPLACE, + descriptor_dfd, partstr, error)) goto out; - - /* Transfer tempfile ownership */ - part_temp_outstream = g_unix_output_stream_new (part_tmpf->fd, FALSE); - g_ptr_array_add (part_temp_paths, g_steal_pointer (&part_tmpf)); } - part_in = variant_to_inputstream (delta_part); - if (!ot_gio_splice_get_checksum (part_temp_outstream, part_in, - &part_checksum, - cancellable, error)) - goto out; + g_variant_builder_add_value (part_headers, g_variant_ref (part_builder->header)); - checksum_bytes = g_bytes_new (part_checksum, OSTREE_SHA256_DIGEST_LEN); - objtype_checksum_array = objtype_checksum_array_new (part_builder->objects); - delta_part_header = g_variant_new ("(u@aytt@ay)", - maybe_swap_endian_u32 (builder.swap_endian, OSTREE_DELTAPART_VERSION), - ot_gvariant_new_ay_bytes (checksum_bytes), - maybe_swap_endian_u64 (builder.swap_endian, (guint64) g_variant_get_size (delta_part)), - maybe_swap_endian_u64 (builder.swap_endian, part_builder->uncompressed_size), - ot_gvariant_new_ay_bytes (objtype_checksum_array)); - - g_variant_builder_add_value (part_headers, g_variant_ref (delta_part_header)); - - total_compressed_size += g_variant_get_size (delta_part); + total_compressed_size += part_builder->compressed_size; total_uncompressed_size += part_builder->uncompressed_size; - - if (delta_opts & DELTAOPT_FLAG_VERBOSE) - { - g_printerr ("part %u n:%u compressed:%" G_GUINT64_FORMAT " uncompressed:%" G_GUINT64_FORMAT "\n", - i, part_builder->objects->len, - (guint64)g_variant_get_size (delta_part), - part_builder->uncompressed_size); - } - } - for (i = 0; i < part_temp_paths->len; i++) - { - g_autofree char *partstr = g_strdup_printf ("%u", i); - /* Take ownership of the path/fd here */ - g_auto(GLnxTmpfile) tmpf = *((GLnxTmpfile*)part_temp_paths->pdata[i]); - g_clear_pointer (&(part_temp_paths->pdata[i]), g_free); - - if (fchmod (tmpf.fd, 0644) < 0) - { - glnx_set_error_from_errno (error); - goto out; - } - - if (!glnx_link_tmpfile_at (&tmpf, GLNX_LINK_TMPFILE_REPLACE, - descriptor_dfd, partstr, error)) - goto out; } if (!get_fallback_headers (self, &builder, &fallback_headers, From 0d259ac401b4beeae4474d121fb474b6f8449c98 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Fri, 27 Oct 2017 16:57:10 -0400 Subject: [PATCH 89/98] lib/deltas: Fix change to use pread() in write opcode Fixes: 93457071cb5d47c08b60d3244f9632725634010a "lib/deltas: Use pread() instead of lseek()+read()" Caught this when trying to test alex's patch locally. I am going to review our static delta pulls and try to get something more comprehensive locally. But in the meantime this patch is clearly right. Closes: #1312 Approved by: jlebon --- src/libostree/ostree-repo-static-delta-processing.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libostree/ostree-repo-static-delta-processing.c b/src/libostree/ostree-repo-static-delta-processing.c index 7517046e..87b5c8c9 100644 --- a/src/libostree/ostree-repo-static-delta-processing.c +++ b/src/libostree/ostree-repo-static-delta-processing.c @@ -745,6 +745,7 @@ dispatch_write (OstreeRepo *repo, return FALSE; content_size -= bytes_read; + content_offset += bytes_read; } } else From 7f8ff5756eb7a668b3513adec8a697f203f73cb9 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Fri, 27 Oct 2017 16:14:02 -0400 Subject: [PATCH 90/98] lib: Minor static delta fixes First, the manual crosscheck script bitrotted; it got caught up in the "use libtest repo creation wrapper" bit, and also it seems like at some point `pull --require-static-deltas` changed meaning when dealing with `file:///` repos. I have more work to unwind that. Next, I'm seeing a delta failure which looks like a static delta miscompilation with rollsums; change the compiler to print out the source object too, which helped me debug this. And finally in the processing code, fix incorrect error prefixing, which was misleading. Closes: #1311 Approved by: ashcrow --- manual-tests/static-delta-generate-crosscheck.sh | 6 +++--- src/libostree/ostree-repo-static-delta-compilation.c | 4 ++-- src/libostree/ostree-repo-static-delta-processing.c | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manual-tests/static-delta-generate-crosscheck.sh b/manual-tests/static-delta-generate-crosscheck.sh index fd8f2189..2eea3ff2 100755 --- a/manual-tests/static-delta-generate-crosscheck.sh +++ b/manual-tests/static-delta-generate-crosscheck.sh @@ -42,11 +42,11 @@ assert_streq() { } validate_delta_options() { - mkdir testrepo - ostree_repo_init testrepo --mode=bare-user + ostree --repo=testrepo init --mode=bare-user ostree --repo=testrepo remote add --set=gpg-verify=false local file://${repo} ostree --repo=${repo} static-delta generate $@ --from=${from} --to=${to} - ostree --repo=testrepo pull --require-static-deltas local ${branch}@${from} + ostree --repo=${repo} summary -u + ostree --repo=testrepo pull local ${branch}@${from} assert_streq $(ostree --repo=testrepo rev-parse ${branch}) ${from} ostree --repo=testrepo pull --require-static-deltas local ${branch} assert_streq $(ostree --repo=testrepo rev-parse ${branch}) ${to} diff --git a/src/libostree/ostree-repo-static-delta-compilation.c b/src/libostree/ostree-repo-static-delta-compilation.c index 41cd347e..19272984 100644 --- a/src/libostree/ostree-repo-static-delta-compilation.c +++ b/src/libostree/ostree-repo-static-delta-compilation.c @@ -651,8 +651,8 @@ try_content_rollsum (OstreeRepo *repo, if (opts & DELTAOPT_FLAG_VERBOSE) { - g_printerr ("rollsum for %s; crcs=%u bufs=%u total=%u matchsize=%llu\n", - to, matches->crcmatches, + g_printerr ("rollsum for %s -> %s; crcs=%u bufs=%u total=%u matchsize=%llu\n", + from, to, matches->crcmatches, matches->bufmatches, matches->total, (unsigned long long)matches->match_size); } diff --git a/src/libostree/ostree-repo-static-delta-processing.c b/src/libostree/ostree-repo-static-delta-processing.c index 87b5c8c9..4545b39f 100644 --- a/src/libostree/ostree-repo-static-delta-processing.c +++ b/src/libostree/ostree-repo-static-delta-processing.c @@ -711,7 +711,7 @@ dispatch_write (OstreeRepo *repo, GCancellable *cancellable, GError **error) { - GLNX_AUTO_PREFIX_ERROR("opcode open-splice-and-close", error); + GLNX_AUTO_PREFIX_ERROR("opcode write", error); guint64 content_size; guint64 content_offset; @@ -816,7 +816,7 @@ dispatch_close (OstreeRepo *repo, GCancellable *cancellable, GError **error) { - GLNX_AUTO_PREFIX_ERROR("opcode open-splice-and-close", error); + GLNX_AUTO_PREFIX_ERROR("opcode close", error); if (state->content_out) { From 80ff73ba2618a1d740a92aecb15c67050d31f80e Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Fri, 27 Oct 2017 17:24:49 -0400 Subject: [PATCH 91/98] lib/pull: When --require-static-deltas, use them even for file:/// repos I didn't fully spelunk this, but from what `static-delta-generate-crosscheck.sh` had, we appeared to be doing this before, and it's clearly useful for local testing rather than needing to spin up a HTTP server. Closes: #1313 Approved by: jlebon --- src/libostree/ostree-repo-pull.c | 12 ++++++++++-- tests/pull-test.sh | 16 ++++++++++++++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/libostree/ostree-repo-pull.c b/src/libostree/ostree-repo-pull.c index efe312d3..5588118c 100644 --- a/src/libostree/ostree-repo-pull.c +++ b/src/libostree/ostree-repo-pull.c @@ -1438,6 +1438,10 @@ static char * get_real_remote_repo_collection_id (OstreeRepo *repo, const gchar *remote_name) { + /* remote_name == NULL can happen for pull-local */ + if (!remote_name) + return NULL; + g_autofree gchar *remote_collection_id = NULL; if (!ostree_repo_get_remote_option (repo, remote_name, "collection-id", NULL, &remote_collection_id, NULL) || @@ -3544,8 +3548,12 @@ ostree_repo_pull_with_options (OstreeRepo *self, g_autofree char *first_scheme = _ostree_fetcher_uri_get_scheme (first_uri); /* NB: we don't support local mirrors in mirrorlists, so if this passes, it - * means that we're not using mirrorlists (see also fetch_mirrorlist()) */ - if (g_str_equal (first_scheme, "file")) + * means that we're not using mirrorlists (see also fetch_mirrorlist()) + * Also, we explicitly disable the "local repo" path if static deltas + * were explicitly requested to be required; this is going to happen + * most often for testing deltas without setting up a HTTP server. + */ + if (g_str_equal (first_scheme, "file") && !pull_data->require_static_deltas) { g_autofree char *path = _ostree_fetcher_uri_get_path (first_uri); g_autoptr(GFile) remote_repo_path = g_file_new_for_path (path); diff --git a/tests/pull-test.sh b/tests/pull-test.sh index b2613fc7..3f8030e0 100644 --- a/tests/pull-test.sh +++ b/tests/pull-test.sh @@ -52,7 +52,7 @@ function verify_initial_contents() { assert_file_has_content baz/cow '^moo$' } -echo "1..32" +echo "1..33" # Try both syntaxes repo_init --no-gpg-verify @@ -348,12 +348,24 @@ repo_init --no-gpg-verify ${CMD_PREFIX} ostree --repo=repo pull origin main@${prev_rev} ${CMD_PREFIX} ostree --repo=repo pull --dry-run --require-static-deltas origin ${delta_target} >dry-run-pull.txt # Compression can vary, so we support 400-699 -assert_file_has_content dry-run-pull.txt 'Delta update: 0/1 parts, 0 bytes/[456][0-9][0-9] bytes, 455 bytes total uncompressed' +delta_dry_run_regexp='Delta update: 0/1 parts, 0 bytes/[456][0-9][0-9] bytes, 455 bytes total uncompressed' +assert_file_has_content dry-run-pull.txt "${delta_dry_run_regexp}" rev=$(${CMD_PREFIX} ostree --repo=repo rev-parse origin:main) assert_streq "${prev_rev}" "${rev}" ${CMD_PREFIX} ostree --repo=repo fsck done +# Test pull via file:/// - this should still use the deltas path for testing +cd ${test_tmpdir} +repo_init --no-gpg-verify +${CMD_PREFIX} ostree --repo=repo remote delete origin +${CMD_PREFIX} ostree --repo=repo remote add --set=gpg-verify=false origin file://$(pwd)/ostree-srv/gnomerepo +${CMD_PREFIX} ostree --repo=repo pull origin main@${prev_rev} +${CMD_PREFIX} ostree --repo=repo pull --dry-run --require-static-deltas origin ${delta_target} >dry-run-pull.txt +# See above +assert_file_has_content dry-run-pull.txt "${delta_dry_run_regexp}" +echo "ok pull file:// + deltas required" + # Explicitly test delta fetches via ref name as well as commit hash for delta_target in main ${new_rev}; do cd ${test_tmpdir} From 62445166fc94ee350caa8e51d6f443dd3583c68a Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Fri, 27 Oct 2017 17:39:17 -0400 Subject: [PATCH 92/98] lib/pull: Delete unused "exampleos" code We never ended up using this, and I'm going to revisit this in another patch with a different approach that has useful *content* and not just a lot of files. Closes: #1314 Approved by: jlebon --- tests/libtest.sh | 100 ----------------------------------------------- 1 file changed, 100 deletions(-) diff --git a/tests/libtest.sh b/tests/libtest.sh index a0c0e36f..8798563b 100755 --- a/tests/libtest.sh +++ b/tests/libtest.sh @@ -267,106 +267,6 @@ setup_fake_remote_repo1() { export OSTREE="${CMD_PREFIX} ostree --repo=repo" } -# Set up a large repository for stress testing. -# Something like the Fedora Atomic Workstation branch which has -# objects: meta: 7497 content: 103541 -# 9443 directories, 7097 symlinks, 112832 regfiles -# So we'll make ~11 files per dir, with one of them a symlink -# Actually, let's cut this down to 1/3 which is still useful. So: -# 3147 dirs, with still ~11 files per dir, for 37610 content objects -setup_exampleos_repo() { - args=${1:-} - cd ${test_tmpdir} - mkdir ostree-srv - mkdir -p ostree-srv/exampleos/{repo,build-repo} - export ORIGIN_REPO=ostree-srv/exampleos/repo - export ORIGIN_BUILD_REPO=ostree-srv/exampleos/build-repo - ostree_repo_init ${ORIGIN_REPO} --mode=archive - ostree_repo_init ${ORIGIN_BUILD_REPO} --mode=bare-user - cd ${test_tmpdir} - rm main -rf - mkdir main - cd main - ndirs=3147 - depth=0 - set +x # No need to spam the logs for this - echo "$(date): Generating initial content..." - while [ $ndirs -gt 0 ]; do - # 2/3 of the time, recurse a dir, up to a max of 9, otherwise back up - x=$(($ndirs % 3)) - case $x in - 0) if [ $depth -gt 0 ]; then cd ..; depth=$((depth-1)); fi ;; - 1|2) if [ $depth -lt 9 ]; then - mkdir dir-${ndirs} - cd dir-${ndirs} - depth=$((depth+1)) - else - if [ $depth -gt 0 ]; then cd ..; depth=$((depth-1)); fi - fi ;; - esac - # One symlink - we use somewhat predictable content to have dupes - ln -s $(($x % 20)) link-$ndirs - # 10 files - nfiles=10 - while [ $nfiles -gt 0 ]; do - echo file-$ndirs-$nfiles > f$ndirs-$nfiles - # Make an unreadable file to trigger https://github.com/ostreedev/ostree/pull/634 - if [ $(($x % 10)) -eq 0 ]; then - chmod 0600 f$ndirs-$nfiles - fi - nfiles=$((nfiles-1)) - done - ndirs=$((ndirs-1)) - done - cd ${test_tmpdir} - set -x - - export REF=exampleos/42/standard - - ${CMD_PREFIX} ostree --repo=${ORIGIN_BUILD_REPO} commit -b ${REF} --tree=dir=main - rm main -rf - ${CMD_PREFIX} ostree --repo=${ORIGIN_BUILD_REPO} checkout ${REF} main - - find main > files.txt - nfiles=$(wc -l files.txt | cut -f 1 -d ' ') - # We'll make 5 more commits - for iter in $(seq 5); do - set +x - # Change 10% of files - for fiter in $(seq $(($nfiles / 10))); do - filenum=$(($RANDOM % ${nfiles})) - set +o pipefail - filename=$(tail -n +${filenum} < files.txt | head -1) - set -o pipefail - if test -f $filename; then - rm -f $filename - echo file-${iter}-${fiter} > ${filename} - fi - done - set -x - ${CMD_PREFIX} ostree --repo=${ORIGIN_BUILD_REPO} commit --link-checkout-speedup -b ${REF} --tree=dir=main - done - - ${CMD_PREFIX} ostree --repo=${ORIGIN_REPO} pull-local --depth=-1 ${ORIGIN_BUILD_REPO} - - for x in "^^" "^" ""; do - ${CMD_PREFIX} ostree --repo=${ORIGIN_REPO} static-delta generate --from="${REF}${x}^" --to="${REF}${x}" - done - ${CMD_PREFIX} ostree --repo=${ORIGIN_REPO} summary -u - - cd ${test_tmpdir}/ostree-srv - mkdir httpd - ${OSTREE_HTTPD} --autoexit --log-file $(pwd)/httpd/httpd.log --daemonize -p httpd/port $args - port=$(cat httpd/port) - echo "http://127.0.0.1:${port}" > httpd/address - - cd ${test_tmpdir} - rm repo -rf - ostree_repo_init repo --mode=bare-user - ${CMD_PREFIX} ostree --repo=repo remote add --set=gpg-verify=false origin $(cat ostree-srv/httpd/address)/exampleos/repo - export OSTREE="${CMD_PREFIX} ostree --repo=repo" -} - setup_os_boot_syslinux() { # Stub syslinux configuration mkdir -p sysroot/boot/loader.0 From e885d029aaa7d18128fd91b7552fc97834dd1956 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Sun, 29 Oct 2017 07:00:36 -0400 Subject: [PATCH 93/98] bin/delta-compilation: Add a "progress bar" for bsdiff generation It's the slowest part, let's show admins something. This "update every 10%" code was copied from the fsck command; obviously a better approach would be "progress every N seconds" but doing that somewhat accurately requires making things async; not worth it here yet. Closes: #1314 Approved by: jlebon --- .../ostree-repo-static-delta-compilation.c | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/libostree/ostree-repo-static-delta-compilation.c b/src/libostree/ostree-repo-static-delta-compilation.c index 19272984..93a191a0 100644 --- a/src/libostree/ostree-repo-static-delta-compilation.c +++ b/src/libostree/ostree-repo-static-delta-compilation.c @@ -1145,18 +1145,27 @@ generate_delta_lowlatency (OstreeRepo *repo, /* Now do bsdiff'ed objects */ - g_hash_table_iter_init (&hashiter, bsdiff_optimized_content_objects); - while (g_hash_table_iter_next (&hashiter, &key, &value)) + const guint n_bsdiff = g_hash_table_size (bsdiff_optimized_content_objects); + if (n_bsdiff > 0) { - const char *checksum = key; - ContentBsdiff *bsdiff = value; + const guint mod = n_bsdiff / 10; + g_hash_table_iter_init (&hashiter, bsdiff_optimized_content_objects); + while (g_hash_table_iter_next (&hashiter, &key, &value)) + { + const char *checksum = key; + ContentBsdiff *bsdiff = value; - if (!process_one_bsdiff (repo, builder, ¤t_part, - checksum, bsdiff, - cancellable, error)) - return FALSE; + if (opts & DELTAOPT_FLAG_VERBOSE && + (mod == 0 || builder->n_bsdiff % mod == 0)) + g_printerr ("processing bsdiff: [%u/%u]\n", builder->n_bsdiff, n_bsdiff); - builder->n_bsdiff++; + if (!process_one_bsdiff (repo, builder, ¤t_part, + checksum, bsdiff, + cancellable, error)) + return FALSE; + + builder->n_bsdiff++; + } } /* Scan for large objects, so we can fall back to plain HTTP-based From aec1191fa951c07a6cd7986d027b1fce3fb0703b Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Mon, 30 Oct 2017 11:04:46 -0400 Subject: [PATCH 94/98] deltas: Add an if0'd bit to print bsdiff objects I used this to find the bsdiff'd objects. Closes: #1314 Approved by: jlebon --- .../ostree-repo-static-delta-compilation.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/libostree/ostree-repo-static-delta-compilation.c b/src/libostree/ostree-repo-static-delta-compilation.c index 93a191a0..2dc61718 100644 --- a/src/libostree/ostree-repo-static-delta-compilation.c +++ b/src/libostree/ostree-repo-static-delta-compilation.c @@ -906,6 +906,20 @@ process_one_bsdiff (OstreeRepo *repo, _ostree_write_varuint64 (current_part->operations, current_part->payload->len); _ostree_write_varuint64 (current_part->operations, payload_size); + /* A bit too verbose to print by default...but leaving this #if 0'd out to + * use later. One approach I've been thinking about is to optionally + * output e.g. a JSON file as we build the deltas. Alternatively, we could + * try to reverse engineer things more in the "show" path, but that gets + * hard/messy as it's quite optimized for execution now. + */ +#if 0 + g_printerr ("bspatch %s [%llu] → %s [%llu] bsdiff:%llu (%f)\n", + bsdiff_content->from_checksum, (unsigned long long)tmp_from_len, + to_checksum, (unsigned long long)tmp_to_len, + (unsigned long long)payload_size, + ((double)payload_size)/tmp_to_len); +#endif + g_string_append_len (current_part->payload, payload, payload_size); } g_string_append_c (current_part->operations, (gchar)OSTREE_STATIC_DELTA_OP_CLOSE); From 9d82d258baa3dd89a78a720ccb3d9a963c30be24 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Mon, 30 Oct 2017 14:17:10 -0400 Subject: [PATCH 95/98] tests: Add a "pull-test2" that uses slightly more realistic content This one actually exercises the delta paths more; I pulled the data from some local F26AH builds. One thing I noticed while doing that is that we try bsdiff on xz'd data, but that won't be useful. https://github.com/projectatomic/rpm-ostree/issues/470 https://bugzilla.redhat.com/show_bug.cgi?id=1367496 Anyways I verified this test fails without the fixup for `pread()` in https://github.com/ostreedev/ostree/pull/1312 Closes: #1314 Approved by: jlebon --- Makefile-tests.am | 4 ++ tests/fah-deltadata-new.tar.xz | Bin 0 -> 529564 bytes tests/fah-deltadata-old.tar.xz | Bin 0 -> 528212 bytes tests/libtest.sh | 46 +++++++++++++++++++++++ tests/pull-test2.sh | 61 +++++++++++++++++++++++++++++++ tests/test-pull2-bareuseronly.sh | 27 ++++++++++++++ 6 files changed, 138 insertions(+) create mode 100644 tests/fah-deltadata-new.tar.xz create mode 100644 tests/fah-deltadata-old.tar.xz create mode 100644 tests/pull-test2.sh create mode 100755 tests/test-pull2-bareuseronly.sh diff --git a/Makefile-tests.am b/Makefile-tests.am index 42e73fa0..bc962aac 100644 --- a/Makefile-tests.am +++ b/Makefile-tests.am @@ -70,6 +70,7 @@ _installed_or_uninstalled_test_scripts = \ tests/test-pull-bare.sh \ tests/test-pull-bareuser.sh \ tests/test-pull-bareuseronly.sh \ + tests/test-pull2-bareuseronly.sh \ tests/test-pull-commit-only.sh \ tests/test-pull-depth.sh \ tests/test-pull-mirror-summary.sh \ @@ -160,10 +161,13 @@ endif dist_installed_test_data = tests/archive-test.sh \ tests/pull-test.sh \ + tests/pull-test2.sh \ tests/admin-test.sh \ tests/basic-test.sh \ tests/pre-endian-deltas-repo-big.tar.xz \ tests/pre-endian-deltas-repo-little.tar.xz \ + tests/fah-deltadata-old.tar.xz \ + tests/fah-deltadata-new.tar.xz \ tests/libtest-core.sh \ $(NULL) diff --git a/tests/fah-deltadata-new.tar.xz b/tests/fah-deltadata-new.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..aea6a0234dc430d0af0822493538b34f6fa34833 GIT binary patch literal 529564 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 F))#Tm-DO#rNeWT-$yWxp8E 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 z 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%0AhjAZr#gd-kT~B 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≠gpWvR0YJD6 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�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 K000001X)^3a|%WP literal 0 HcmV?d00001 diff --git a/tests/fah-deltadata-old.tar.xz b/tests/fah-deltadata-old.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..876873371eb13b6438f0c098920fac990abe9dcb GIT binary patch literal 528212 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≪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℘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 ~DSi@T>FWuoEA3TuklrvL9gh*K%Z4 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 ${test_tmpdir}/httpd-address + cd ${oldpwd} + export OSTREE="${CMD_PREFIX} ostree --repo=repo" +} + setup_os_boot_syslinux() { # Stub syslinux configuration mkdir -p sysroot/boot/loader.0 diff --git a/tests/pull-test2.sh b/tests/pull-test2.sh new file mode 100644 index 00000000..5957996a --- /dev/null +++ b/tests/pull-test2.sh @@ -0,0 +1,61 @@ +# This file is to be sourced, not executed + +# Copyright (C) 2011 Colin Walters +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +set -euo pipefail + +function repo_init() { + cd ${test_tmpdir} + rm repo -rf + mkdir repo + ostree_repo_init repo --mode=${repo_mode} + ${CMD_PREFIX} ostree --repo=repo remote add origin $(cat httpd-address)/ostree/gnomerepo "$@" +} + +repo_init --no-gpg-verify + +# See also the copy of this in basic-test.sh +COMMIT_ARGS="" +CHECKOUT_U_ARG="" +CHECKOUT_H_ARGS="-H" +if is_bare_user_only_repo repo; then + COMMIT_ARGS="--canonical-permissions" + # Also, since we can't check out uid=0 files we need to check out in user mode + CHECKOUT_U_ARG="-U" + CHECKOUT_H_ARGS="-U -H" +else + if grep -E -q '^mode=bare-user' repo/config; then + CHECKOUT_H_ARGS="-U -H" + fi +fi + +echo "1..1" +cd ${test_tmpdir} +repo_init --no-gpg-verify +prev_rev=$(ostree --repo=ostree-srv/repo rev-parse ${remote_ref}^) +rev=$(ostree --repo=ostree-srv/repo rev-parse ${remote_ref}) +${CMD_PREFIX} ostree --repo=ostree-srv/repo static-delta generate ${remote_ref} +${CMD_PREFIX} ostree --repo=ostree-srv/repo summary -u +${CMD_PREFIX} ostree --repo=repo pull origin ${remote_ref}@${prev_rev} +${CMD_PREFIX} ostree --repo=repo pull --dry-run --require-static-deltas origin ${remote_ref} >dry-run-pull.txt +assert_file_has_content dry-run-pull.txt 'Delta update: 0/1 parts, 0 bytes/[45][0-9].[0-9] kB, 1.[678] MB total uncompressed' +${CMD_PREFIX} ostree --repo=repo pull --require-static-deltas origin ${remote_ref} +final_rev=$(${CMD_PREFIX} ostree --repo=repo rev-parse origin:${remote_ref}) +assert_streq "${rev}" "${final_rev}" +${CMD_PREFIX} ostree --repo=repo fsck +echo "ok delta" diff --git a/tests/test-pull2-bareuseronly.sh b/tests/test-pull2-bareuseronly.sh new file mode 100755 index 00000000..59875442 --- /dev/null +++ b/tests/test-pull2-bareuseronly.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# +# Copyright (C) 2017 Colin Walters +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +set -euo pipefail + +. $(dirname $0)/libtest.sh + +setup_fake_remote_repo2 "archive" "--canonical-permissions" + +repo_mode=bare-user-only +. ${test_srcdir}/pull-test2.sh From 370cbd006b2183b72b05537e6ba1aa68dd4e1208 Mon Sep 17 00:00:00 2001 From: Shaun Taheri Date: Wed, 1 Nov 2017 17:40:19 +0100 Subject: [PATCH 96/98] static deltas: Set optional flag for superblock Closes: #1317 Approved by: cgwalters --- src/libostree/ostree-repo-pull.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libostree/ostree-repo-pull.c b/src/libostree/ostree-repo-pull.c index 5588118c..44fae35e 100644 --- a/src/libostree/ostree-repo-pull.c +++ b/src/libostree/ostree-repo-pull.c @@ -3045,7 +3045,7 @@ initiate_delta_request (OtPullData *pull_data, _ostree_fetcher_request_to_membuf (pull_data->fetcher, pull_data->content_mirrorlist, - delta_name, 0, + delta_name, OSTREE_FETCHER_REQUEST_OPTIONAL_CONTENT, OSTREE_MAX_METADATA_SIZE, 0, pull_data->cancellable, on_superblock_fetched, fdata); From d1b5997d8c47879854103b2c7d69a717d54cfcc6 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Wed, 1 Nov 2017 14:49:35 -0400 Subject: [PATCH 97/98] Update libglnx Mostly for https://github.com/GNOME/libglnx/pull/94 since I keep seeing it in the terminal. Update submodule: libglnx Closes: #1318 Approved by: jlebon --- libglnx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libglnx b/libglnx index 5362f6bc..d15a3790 160000 --- a/libglnx +++ b/libglnx @@ -1 +1 @@ -Subproject commit 5362f6bc3ff3e30f379e767b203d15c9e56d6f08 +Subproject commit d15a3790074fd982f2611a5b450dea61052dfc0b From ae61321046ad7f4148a5884c8c6c8b2594ff840e Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Wed, 1 Nov 2017 16:39:44 -0400 Subject: [PATCH 98/98] Release 2017.13 We've accumulated a fair bit, time for a new release before we e.g. try to land the locking PR. Closes: #1319 Approved by: jlebon --- configure.ac | 2 +- src/libostree/libostree-devel.sym | 7 ++----- src/libostree/libostree-released.sym | 6 ++++++ tests/test-symbols.sh | 2 +- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/configure.ac b/configure.ac index e5dbe16a..92248af8 100644 --- a/configure.ac +++ b/configure.ac @@ -7,7 +7,7 @@ m4_define([year_version], [2017]) m4_define([release_version], [13]) m4_define([package_version], [year_version.release_version]) AC_INIT([libostree], [package_version], [walters@verbum.org]) -is_release_build=no +is_release_build=yes AC_CONFIG_HEADER([config.h]) AC_CONFIG_MACRO_DIR([buildutil]) AC_CONFIG_AUX_DIR([build-aux]) diff --git a/src/libostree/libostree-devel.sym b/src/libostree/libostree-devel.sym index aa3a82e9..3c5da23e 100644 --- a/src/libostree/libostree-devel.sym +++ b/src/libostree/libostree-devel.sym @@ -18,11 +18,8 @@ ***/ /* Add new symbols here. Release commits should copy this section into -released.sym. */ -LIBOSTREE_2017.13 { -global: - ostree_checksum_file_at; - ostree_repo_checkout_at_options_set_devino; -} LIBOSTREE_2017.12; +LIBOSTREE_2017.14 { +} LIBOSTREE_2017.13; /* Stub section for the stable release *after* this development one; don't * edit this other than to update the last number. This is just a copy/paste diff --git a/src/libostree/libostree-released.sym b/src/libostree/libostree-released.sym index d1465290..4cab4e5d 100644 --- a/src/libostree/libostree-released.sym +++ b/src/libostree/libostree-released.sym @@ -436,6 +436,12 @@ global: ostree_repo_hash; } LIBOSTREE_2017.11; +LIBOSTREE_2017.13 { +global: + ostree_checksum_file_at; + ostree_repo_checkout_at_options_set_devino; +} LIBOSTREE_2017.12; + /* NOTE: Only add more content here in release commits! See the * comments at the top of this file. */ diff --git a/tests/test-symbols.sh b/tests/test-symbols.sh index c7b3124c..0bde00af 100755 --- a/tests/test-symbols.sh +++ b/tests/test-symbols.sh @@ -52,7 +52,7 @@ echo 'ok documented symbols' # ONLY update this checksum in release commits! cat > released-sha256.txt <

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≻-zb0{ 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