diff options
author | Lasse Collin <lasse.collin@tukaani.org> | 2021-01-11 23:41:16 +0200 |
---|---|---|
committer | Lasse Collin <lasse.collin@tukaani.org> | 2021-01-11 23:41:16 +0200 |
commit | 074259f4f3966aeac6edb205fecbc1a8d2b58bb2 (patch) | |
tree | 1a7f4ffedfe9ce2cd36f56ff23156db3b5d4ae43 | |
parent | Scripts: Fix exit status of xzgrep. (diff) | |
download | xz-074259f4f3966aeac6edb205fecbc1a8d2b58bb2.tar.xz |
xz: Make --keep accept symlinks, hardlinks, and setuid/setgid/sticky.
Previously this required using --force but that has other
effects too which might be undesirable. Changing the behavior
of --keep has a small risk of breaking existing scripts but
since this is a fairly special corner case I expect the
likehood of breakage to be low enough.
I think the new behavior is more logical. The only reason for
the old behavior was to be consistent with gzip and bzip2.
Thanks to Vincent Lefevre and Sebastian Andrzej Siewior.
-rw-r--r-- | src/xz/file_io.c | 9 | ||||
-rw-r--r-- | src/xz/xz.1 | 16 |
2 files changed, 20 insertions, 5 deletions
diff --git a/src/xz/file_io.c b/src/xz/file_io.c index e1a37d5f..80b56d38 100644 --- a/src/xz/file_io.c +++ b/src/xz/file_io.c @@ -536,8 +536,9 @@ io_open_src_real(file_pair *pair) } // Symlinks are not followed unless writing to stdout or --force - // was used. - const bool follow_symlinks = opt_stdout || opt_force; + // or --keep was used. + const bool follow_symlinks + = opt_stdout || opt_force || opt_keep_original; // We accept only regular files if we are writing the output // to disk too. bzip2 allows overriding this with --force but @@ -674,7 +675,7 @@ io_open_src_real(file_pair *pair) } #ifndef TUKLIB_DOSLIKE - if (reg_files_only && !opt_force) { + if (reg_files_only && !opt_force && !opt_keep_original) { if (pair->src_st.st_mode & (S_ISUID | S_ISGID)) { // gzip rejects setuid and setgid files even // when --force was used. bzip2 doesn't check @@ -683,7 +684,7 @@ io_open_src_real(file_pair *pair) // and setgid bits there. // // We accept setuid and setgid files if - // --force was used. We drop these bits + // --force or --keep was used. We drop these bits // explicitly in io_copy_attr(). message_warning(_("%s: File has setuid or " "setgid bit set, skipping"), diff --git a/src/xz/xz.1 b/src/xz/xz.1 index db9de4ff..9721ed39 100644 --- a/src/xz/xz.1 +++ b/src/xz/xz.1 @@ -5,7 +5,7 @@ .\" This file has been put into the public domain. .\" You can do whatever you want with this file. .\" -.TH XZ 1 "2020-11-01" "Tukaani" "XZ Utils" +.TH XZ 1 "2021-01-11" "Tukaani" "XZ Utils" . .SH NAME xz, unxz, xzcat, lzma, unlzma, lzcat \- Compress or decompress .xz and .lzma files @@ -392,6 +392,20 @@ should be used. .TP .BR \-k ", " \-\-keep Don't delete the input files. +.IP "" +Since +.B xz +5.4.0, +this option also makes +.B xz +compress or decompress even if the input is +a symbolic link to a regular file, +has more than one hard link, +or has the setuid, setgid, or sticky bit set. +The setuid, setgid, and sticky bits are not copied +to the target file. +In earlier versions this was only done with +.BR \-\-force . .TP .BR \-f ", " \-\-force This option has several effects: |