diff options
Diffstat (limited to 'recipes-core/swupd-client/swupd-client-2.87/0006-Backport-Use-rename-instead-of-tar-transform.patch')
-rw-r--r-- | recipes-core/swupd-client/swupd-client-2.87/0006-Backport-Use-rename-instead-of-tar-transform.patch | 156 |
1 files changed, 0 insertions, 156 deletions
diff --git a/recipes-core/swupd-client/swupd-client-2.87/0006-Backport-Use-rename-instead-of-tar-transform.patch b/recipes-core/swupd-client/swupd-client-2.87/0006-Backport-Use-rename-instead-of-tar-transform.patch deleted file mode 100644 index be4d908..0000000 --- a/recipes-core/swupd-client/swupd-client-2.87/0006-Backport-Use-rename-instead-of-tar-transform.patch +++ /dev/null @@ -1,156 +0,0 @@ -From e9ad32a273efe2d177c1bbd394ae944ae598fd50 Mon Sep 17 00:00:00 2001 -From: Dmitry Rozhkov <dmitry.rozhkov@intel.com> -Date: Mon, 8 Feb 2016 18:12:48 +0200 -Subject: [PATCH] Backport: Use rename instead of tar transform - -This patch is a backport from swupd-client v2.88 -Author: William Douglas <william.douglas@intel.com> -Subject: Use rename instead of tar transform - -In order to prevent issues with transform name escaping, update logic -for moving an object from staging. First rename the object in the -staging path to its final name (in case of a directory the rename places -it in a seperate directory first to avoid hash colisions), then use tar -to update or create the object in the filesystem. Once finished rename -the object back to the hash name so it can be reused as needed. - -This also fixes up some issues with the SWUPD_LINUX_ROOTFS checks not -always encapsulating variable use within the do_staging function. - -Note: the SWUPD_LINUX_ROOTFS checks have been removed entirely, since -they are not used anywhere in the code at present. - -Upstream-Status: Backported [v2.88+] - -Signed-off-by: Dmitry Rozhkov <dmitry.rozhkov@linux.intel.com> ---- - src/staging.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----- - 1 file changed, 67 insertions(+), 6 deletions(-) - -diff --git a/src/staging.c b/src/staging.c -index b8545c1..16dafbb 100644 ---- a/src/staging.c -+++ b/src/staging.c -@@ -36,6 +36,31 @@ - #include "swupd-build-variant.h" - #include <swupd.h> - -+/* clean then recreate temporary folder for tar renames */ -+static int create_staging_renamedir(char *rename_tmpdir) -+{ -+ int ret; -+ char *rmcommand = NULL; -+ -+ string_or_die(&rmcommand, "rm -fr %s", rename_tmpdir); -+ if (!system(rmcommand)) { -+ /* Not fatal but pretty scary, likely to really fail at the -+ * next command too. Pass for now as printing may just cause -+ * confusion */ -+ ; -+ } -+ free(rmcommand); -+ -+ ret = mkdir(rename_tmpdir, S_IRWXU); -+ if (ret == -1 && errno != EEXIST) { -+ ret = -errno; -+ } else { -+ ret = 0; -+ } -+ -+ return ret; -+} -+ - #ifdef SWUPD_WITH_BTRFS - static int create_staging_subvol_from(const char *version) - { -@@ -269,6 +294,9 @@ int prepare(bool UNUSED_PARAM *is_corrupted, int UNUSED_PARAM current_version, i - #endif - - /* Do the staging of new files into the filesystem */ -+#warning do_staging is currently not able to be run in parallel -+/* Consider adding a remove_leftovers() that runs in verify/fix in order to -+ * allow this function to mkdtemp create folders for parallel build */ - int do_staging(struct file *file) - { - char *statfile = NULL, *tmp = NULL, *tmp2 = NULL; -@@ -280,6 +308,8 @@ int do_staging(struct file *file) - char *targetpath = NULL; - char *symbase = NULL; - #endif -+ char *rename_target = NULL; -+ char *rename_tmpdir = NULL; - int ret; - struct stat s; - -@@ -360,12 +390,28 @@ int do_staging(struct file *file) - * attributes and it includes internal logic that does the - * right thing to overlay a directory onto something - * pre-existing: */ -- string_or_die(&tarcommand, "tar -C %s/staged " TAR_PERM_ATTR_ARGS " -cf - %s 2> /dev/null | " -- "tar -C %s%s " TAR_PERM_ATTR_ARGS " -xf - --transform=\"s/%s/%s/\" 2> /dev/null", -- STATE_DIR, file->hash, path_prefix, rel_dir, file->hash, base); -+ /* In order to avoid tar transforms with directories, rename -+ * the directory before and after the tar command */ -+ string_or_die(&rename_tmpdir, "%s/tmprenamedir", STATE_DIR); -+ ret = create_staging_renamedir(rename_tmpdir); -+ if (ret) { -+ goto out; -+ } -+ string_or_die(&rename_target, "%s/%s", rename_tmpdir, base); -+ if (rename(original, rename_target)) { -+ ret = -errno; -+ goto out; -+ } -+ string_or_die(&tarcommand, "tar -C %s " TAR_PERM_ATTR_ARGS " -cf - %s 2> /dev/null | " -+ "tar -C %s%s " TAR_PERM_ATTR_ARGS " -xf - 2> /dev/null", -+ rename_tmpdir, base, path_prefix, rel_dir); - LOG_DEBUG(file, "directory overwrite", class_osvol_staging, "%s", tarcommand); - ret = system(tarcommand); - free(tarcommand); -+ if (rename(rename_target, original)) { -+ ret = -errno; -+ goto out; -+ } - if (ret < 0) { - LOG_ERROR(file, "Failed directory overwrite", class_osvol_staging, "%s", strerror(errno)); - ret = -EDIR_OVERWRITE; -@@ -386,12 +432,25 @@ int do_staging(struct file *file) - } - if (ret < 0) { - /* either the hardlink failed, or it was undesirable (config), do a tar-tar dance */ -- string_or_die(&tarcommand, "tar -C %s/staged " TAR_PERM_ATTR_ARGS " -cf - %s 2> /dev/null | " -- "tar -C %s%s " TAR_PERM_ATTR_ARGS " -xf - --transform=\"s/%s/.update.%s/\" 2> /dev/null", -- STATE_DIR, file->hash, path_prefix, rel_dir, file->hash, base); -+ /* In order to avoid tar transforms, rename the file -+ * before and after the tar command */ -+ string_or_die(&rename_target, "%s/staged/.update.%s", STATE_DIR, base); -+ ret = rename(original, rename_target); -+ if (ret) { -+ ret = -errno; -+ goto out; -+ } -+ string_or_die(&tarcommand, "tar -C %s/staged " TAR_PERM_ATTR_ARGS " -cf - .update.%s 2> /dev/null | " -+ "tar -C %s%s " TAR_PERM_ATTR_ARGS " -xf - 2> /dev/null", -+ STATE_DIR, base, path_prefix, rel_dir); - LOG_DEBUG(file, "dotfile install", class_osvol_staging, "%s", tarcommand); - ret = system(tarcommand); - free(tarcommand); -+ ret = rename(rename_target, original); -+ if (ret) { -+ ret = -errno; -+ goto out; -+ } - } - if (ret < 0) { - LOG_ERROR(file, "Failed tar dotfile install", class_osvol_staging, -@@ -436,6 +495,8 @@ int do_staging(struct file *file) - out: - free(target); - free(original); -+ free(rename_target); -+ free(rename_tmpdir); - free(tmp); - free(tmp2); - --- -2.5.0 |