diff options
author | Lennart Poettering <lennart@poettering.net> | 2020-07-21 11:13:54 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2020-07-21 14:16:02 +0200 |
commit | c400d040cee32b90fa7f06742d0725c79d30339f (patch) | |
tree | 8cc652952e5c74c41a7bc6b0993056c8f7e2cb70 /src/import/import-common.c | |
parent | Merge pull request #16519 from yuwata/networkctl-altnames (diff) | |
download | systemd-c400d040cee32b90fa7f06742d0725c79d30339f.tar.xz systemd-c400d040cee32b90fa7f06742d0725c79d30339f.zip |
import: always prefer GNU tar, to avoid cmdline incompatibilities
Fixes: #16506
Diffstat (limited to '')
-rw-r--r-- | src/import/import-common.c | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/src/import/import-common.c b/src/import/import-common.c index 2f27dda76b..ca96f073b1 100644 --- a/src/import/import-common.c +++ b/src/import/import-common.c @@ -79,6 +79,17 @@ int import_fork_tar_x(const char *path, pid_t *ret) { if (r < 0) return r; if (r == 0) { + const char *cmdline[] = { + "tar", + "--numeric-owner", + "-C", path, + "-px", + "--xattrs", + "--xattrs-include=*", + use_selinux ? "--selinux" : "--no-selinux", + NULL + }; + uint64_t retain = (1ULL << CAP_CHOWN) | (1ULL << CAP_FOWNER) | @@ -104,8 +115,15 @@ int import_fork_tar_x(const char *path, pid_t *ret) { if (r < 0) log_error_errno(r, "Failed to drop capabilities, ignoring: %m"); - execlp("tar", "tar", "--numeric-owner", "-C", path, "-px", "--xattrs", "--xattrs-include=*", - use_selinux ? "--selinux" : "--no-selinux", NULL); + /* Try "gtar" before "tar". We only test things upstream with GNU tar. Some distros appear to + * install a different implementation as "tar" (in particular some that do not support the + * same command line switches), but then provide "gtar" as alias for the real thing, hence + * let's prefer that. (Yes, it's a bad idea they do that, given they don't provide equivalent + * command line support, but we are not here to argue, let's just expose the same + * behaviour/implementation everywhere.) */ + execvp("gtar", (char* const*) cmdline); + execvp("tar", (char* const*) cmdline); + log_error_errno(errno, "Failed to execute tar: %m"); _exit(EXIT_FAILURE); } @@ -133,6 +151,17 @@ int import_fork_tar_c(const char *path, pid_t *ret) { if (r < 0) return r; if (r == 0) { + const char *cmdline[] = { + "tar", + "-C", path, + "-c", + "--xattrs", + "--xattrs-include=*", + use_selinux ? "--selinux" : "--no-selinux", + ".", + NULL + }; + uint64_t retain = (1ULL << CAP_DAC_OVERRIDE); /* Child */ @@ -152,8 +181,9 @@ int import_fork_tar_c(const char *path, pid_t *ret) { if (r < 0) log_error_errno(r, "Failed to drop capabilities, ignoring: %m"); - execlp("tar", "tar", "-C", path, "-c", "--xattrs", "--xattrs-include=*", - use_selinux ? "--selinux" : "--no-selinux", ".", NULL); + execvp("gtar", (char* const*) cmdline); + execvp("tar", (char* const*) cmdline); + log_error_errno(errno, "Failed to execute tar: %m"); _exit(EXIT_FAILURE); } |