Browse Source

tar package update

Signed-off-by: basebuilder_pel7ppc64bebuilder0 <basebuilder@powerel.org>
master
basebuilder_pel7ppc64bebuilder0 7 years ago
parent
commit
c8241fc466
  1. 29
      SOURCES/tar-1.14-loneZeroWarning.patch
  2. 31
      SOURCES/tar-1.15.1-vfatTruncate.patch
  3. 92
      SOURCES/tar-1.17-wildcards.patch
  4. 13
      SOURCES/tar-1.22-atime-rofs.patch
  5. 14
      SOURCES/tar-1.23-oldarchive.patch
  6. 370
      SOURCES/tar-1.26-add-skip-old-files-option.patch
  7. 27
      SOURCES/tar-1.26-allow-extract-single-volume.patch
  8. 266
      SOURCES/tar-1.26-default-acls.patch
  9. 3500
      SOURCES/tar-1.26-directory_with_remove-files.patch
  10. 372
      SOURCES/tar-1.26-docu-xattrs.patch
  11. 31
      SOURCES/tar-1.26-dont-segfault-with-disabled-selinux.patch
  12. 91
      SOURCES/tar-1.26-fix-symlink-eating-bug.patch
  13. 208
      SOURCES/tar-1.26-keep-directory-symlink-doc-and-test.patch
  14. 169
      SOURCES/tar-1.26-keep-directory-symlink.patch
  15. 389
      SOURCES/tar-1.26-large-sparse-file-listing.patch
  16. 77
      SOURCES/tar-1.26-non-deterministic-archive-detection.patch
  17. 66
      SOURCES/tar-1.26-pax-big-sparse-files.patch
  18. 15
      SOURCES/tar-1.26-posix-biguid.patch
  19. 250
      SOURCES/tar-1.26-restore-incremental-backups.patch
  20. 3602
      SOURCES/tar-1.26-selinux-gnulib.patch
  21. 152
      SOURCES/tar-1.26-silence-gcc.patch
  22. 14
      SOURCES/tar-1.26-stdio.in.patch
  23. 147
      SOURCES/tar-1.26-update-with-change-directory.patch
  24. 121
      SOURCES/tar-1.26-xattrs-exclude-include-repair.patch
  25. 38
      SOURCES/tar-1.26-xattrs-include-implies-xattrs.patch
  26. 35
      SOURCES/tar-1.26-xattrs-printing.patch
  27. 214
      SOURCES/tar-1.26-xattrs-skip-old-files-hangs.patch
  28. 3233
      SOURCES/tar-1.26-xattrs.patch
  29. 21
      SOURCES/tar-1.27-sparse-stat-detection.patch
  30. 638
      SOURCES/tar.1
  31. 956
      SPECS/tar.spec

29
SOURCES/tar-1.14-loneZeroWarning.patch

@ -0,0 +1,29 @@
diff --git a/src/list.c b/src/list.c
index cf2de09..f4e6e0a 100644
--- a/src/list.c
+++ b/src/list.c
@@ -212,6 +212,14 @@ read_and (void (*do_something) (void))

if (!ignore_zeros_option)
{
+ /*
+ * According to POSIX tar specs, this is wrong, but on the web
+ * there are some tar specs that can trigger this, and some tar
+ * implementations create tars according to that spec. For now,
+ * let's not be pedantic about issuing the warning.
+ */
+#if 0
+
char buf[UINTMAX_STRSIZE_BOUND];

status = read_header (&current_header, &current_stat_info,
@@ -221,6 +229,9 @@ read_and (void (*do_something) (void))
WARNOPT (WARN_ALONE_ZERO_BLOCK,
(0, 0, _("A lone zero block at %s"),
STRINGIFY_BIGINT (current_block_ordinal (), buf)));
+#endif
+ status = read_header (&current_header, &current_stat_info,
+ read_header_auto);
break;
}
status = prev_status;

31
SOURCES/tar-1.15.1-vfatTruncate.patch

@ -0,0 +1,31 @@
diff --git a/src/system.c b/src/system.c
index ba4ac2d..ea88cd6 100644
--- a/src/system.c
+++ b/src/system.c
@@ -231,8 +231,25 @@ sys_compare_links (struct stat *link_data, struct stat *stat_data)
int
sys_truncate (int fd)
{
+ struct stat st;
off_t pos = lseek (fd, (off_t) 0, SEEK_CUR);
- return pos < 0 ? -1 : ftruncate (fd, pos);
+
+ if ( pos < 0)
+ return -1;
+
+ if ( ftruncate(fd, pos) && errno == EPERM ) {
+ /* wrapper around ftruncate:
+ * ftruncate may fail to grow the size of a file with some OS and filesystem
+ * combinations. Linux and vfat/fat is one example. If this is the case do
+ * a write to grow the file to the desired length.
+ */
+ if( (fstat( fd, &st ) == -1) ||
+ (st.st_size >= pos) ||
+ (lseek( fd, pos - 1, SEEK_SET) == (off_t)-1) ||
+ (write( fd, "\0", 1) == -1) )
+ return -1;
+ }
+ return 0;
}

/* Return nonzero if NAME is the name of a regular file, or if the file

92
SOURCES/tar-1.17-wildcards.patch

@ -0,0 +1,92 @@
diff --git a/doc/tar.texi b/doc/tar.texi
index db8f986..d70d113 100644
--- a/doc/tar.texi
+++ b/doc/tar.texi
@@ -7597,7 +7597,7 @@ The following table summarizes pattern-matching default values:

@multitable @columnfractions .3 .7
@headitem Members @tab Default settings
-@item Inclusion @tab @option{--no-wildcards --anchored --no-wildcards-match-slash}
+@item Inclusion @tab @option{--wildcards --anchored --wildcards-match-slash}
@item Exclusion @tab @option{--wildcards --no-anchored --wildcards-match-slash}
@end multitable

@@ -12038,6 +12038,9 @@ version of this document is available at
@table @asis
@item Use of globbing patterns when listing and extracting.

+Note: Following is true for original unpatched GNU tar.
+For compatibility reasons, the old behavior was preserved.
+
Previous versions of GNU tar assumed shell-style globbing when
extracting from or listing an archive. For example:

diff --git a/src/names.c b/src/names.c
index ba4d509..3911f8c 100644
--- a/src/names.c
+++ b/src/names.c
@@ -966,10 +966,7 @@ collect_and_sort_names (void)

if (name->found_count || name->directory)
continue;
- if (name->matching_flags & EXCLUDE_WILDCARDS)
- /* NOTE: EXCLUDE_ANCHORED is not relevant here */
- /* FIXME: just skip regexps for now */
- continue;
+
chdir_do (name->change_dir);

if (name->name[0] == 0)
diff --git a/src/tar.c b/src/tar.c
index 928cfdd..22d3db1 100644
--- a/src/tar.c
+++ b/src/tar.c
@@ -722,7 +722,7 @@ static struct argp_option options[] = {
{"no-ignore-case", NO_IGNORE_CASE_OPTION, 0, 0,
N_("case sensitive matching (default)"), GRID+1 },
{"wildcards", WILDCARDS_OPTION, 0, 0,
- N_("use wildcards (default for exclusion)"), GRID+1 },
+ N_("use wildcards (default)"), GRID+1 },
{"no-wildcards", NO_WILDCARDS_OPTION, 0, 0,
N_("verbatim string matching"), GRID+1 },
{"no-wildcards-match-slash", NO_WILDCARDS_MATCH_SLASH_OPTION, 0, 0,
@@ -815,8 +815,7 @@ ARGMATCH_VERIFY (atime_preserve_args, atime_preserve_types);
/* Wildcard matching settings */
enum wildcards
{
- default_wildcards, /* For exclusion == enable_wildcards,
- for inclusion == disable_wildcards */
+ default_wildcards, /* enable_wildcards */
disable_wildcards,
enable_wildcards
};
@@ -847,7 +846,7 @@ struct tar_args /* Variables used during option parsing */
| recursion_option)

#define MAKE_INCL_OPTIONS(args) \
- ((((args)->wildcards == enable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
+ ((((args)->wildcards != disable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
| (args)->include_anchored \
| (args)->matching_flags \
| recursion_option)
@@ -2347,7 +2346,7 @@ decode_options (int argc, char **argv)

/* Warn about implicit use of the wildcards in command line arguments.
See TODO */
- warn_regex_usage = args.wildcards == default_wildcards;
+ warn_regex_usage = 0; /* args.wildcards == default_wildcards; */

/* Derive option values and check option consistency. */

diff --git a/tests/exclude01.at b/tests/exclude01.at
index 778a7fc..bd65ae0 100644
--- a/tests/exclude01.at
+++ b/tests/exclude01.at
@@ -59,6 +59,7 @@ testdir/dir2/file2
testdir/dir3/
NEXT
testdir/dir1/*
+testdir/dir1/file1
NEXT
testdir/dir1/*
NEXT

13
SOURCES/tar-1.22-atime-rofs.patch

@ -0,0 +1,13 @@
diff --git a/src/create.c b/src/create.c
index 43b5a4c..f98cbb5 100644
--- a/src/create.c
+++ b/src/create.c
@@ -1798,7 +1798,8 @@ dump_file0 (struct tar_stat_info *st, char const *name, char const *p)
}
else if (atime_preserve_option == replace_atime_preserve
&& fd && (is_dir || original_size != 0)
- && set_file_atime (fd, parentfd, name, st->atime) != 0)
+ && set_file_atime (fd, parentfd, name, st->atime) != 0
+ && errno != EROFS )
utime_error (p);
}

14
SOURCES/tar-1.23-oldarchive.patch

@ -0,0 +1,14 @@
diff -urNp tar-1.23-orig/src/tar.c tar-1.23/src/tar.c
--- tar-1.23-orig/src/tar.c 2010-06-01 13:55:03.792173060 +0200
+++ tar-1.23/src/tar.c 2010-06-01 14:01:40.494172986 +0200
@@ -1911,6 +1911,10 @@ parse_opt (int key, char *arg, struct ar
_("Invalid number")));
}
break;
+
+ case OLD_ARCHIVE_OPTION:
+ set_archive_format ("v7");
+ break;

case OVERWRITE_DIR_OPTION:
old_files_option = DEFAULT_OLD_FILES;

370
SOURCES/tar-1.26-add-skip-old-files-option.patch

@ -0,0 +1,370 @@
diff --git a/doc/tar.texi b/doc/tar.texi
index d70d113..a0e3d5f 100644
--- a/doc/tar.texi
+++ b/doc/tar.texi
@@ -1881,6 +1881,7 @@ The other operations of @command{tar} (@option{--list},
@option{--extract}, @option{--compare}, and @option{--update})
will act on the entire contents of the archive.

+@anchor{exit status}
@cindex exit status
@cindex return status
Besides successful exits, @GNUTAR{} may fail for
@@ -2815,7 +2816,10 @@ when extracting files from an archive.
@item --keep-old-files
@itemx -k

-Do not overwrite existing files when extracting files from an archive.
+Do not overwrite existing files when extracting files from an
+archive. Return error if such files exist. See also
+@ref{--skip-old-files}.
+
@xref{Keep Old Files}.

@opsummary{label}
@@ -3268,6 +3272,20 @@ the archive creation operations it instructs @command{tar} to list the
member names stored in the archive, as opposed to the actual file
names. @xref{listing member and file names}.

+@opsummary{skip-old-files}
+@item --skip-old-files
+
+Do not overwrite existing files when extracting files from an
+archive. @xref{Keep Old Files}.
+
+This option differs from @option{--keep-old-files} in that it does not
+treat such files as an error, instead it just silently avoids
+overwriting them.
+
+The @option{--warning=existing-file} option can be used together with
+this option to produce warning messages about existing old files
+(@pxref{warnings}).
+
@opsummary{sparse}
@item --sparse
@itemx -S
@@ -4443,11 +4461,11 @@ in the archive; the most recently archived members will be extracted
last. Additionally, an extracted member will @emph{replace} a file of
the same name which existed in the directory already, and @command{tar}
will not prompt you about this@footnote{Unless you give it
-@option{--keep-old-files} option, or the disk copy is newer than
-the one in the archive and you invoke @command{tar} with
-@option{--keep-newer-files} option.}. Thus, only the most recently archived
-member will end up being extracted, as it will replace the one
-extracted before it, and so on.
+@option{--keep-old-files} (or @option{--skip-old-files}) option, or
+the disk copy is newer than the one in the archive and you invoke
+@command{tar} with @option{--keep-newer-files} option.}. Thus, only
+the most recently archived member will end up being extracted, as it
+will replace the one extracted before it, and so on.

@cindex extracting @var{n}th copy of the file
@xopindex{occurrence, described}
@@ -5123,10 +5141,25 @@ such a directory, use the @option{--no-overwrite-dir} option.
@cindex Overwriting old files, prevention
@xopindex{keep-old-files, introduced}
To be even more cautious and prevent existing files from being replaced, use
-the @option{--keep-old-files} (@option{-k}) option. It causes @command{tar} to refuse
-to replace or update a file that already exists, i.e., a file with the
-same name as an archive member prevents extraction of that archive
-member. Instead, it reports an error.
+the @option{--keep-old-files} (@option{-k}) option. It causes
+@command{tar} to refuse to replace or update a file that already
+exists, i.e., a file with the same name as an archive member prevents
+extraction of that archive member. Instead, it reports an error. For
+example:
+
+@example
+$ @kbd{ls}
+blues
+$ @kbd{tar -x -k -f archive.tar}
+tar: blues: Cannot open: File exists
+tar: Exiting with failure status due to previous errors
+@end example
+
+@xopindex{skip-old-files, introduced}
+If you wish to preserve old files untouched, but don't want
+@command{tar} to treat them as errors, use the
+@option{--skip-old-files} option. This option causes @command{tar} to
+silently skip extracting over existing files.

@xopindex{overwrite, introduced}
To be more aggressive about altering existing files, use the
@@ -5192,16 +5225,24 @@ archive, but remove other files before extracting.
@node Keep Old Files
@unnumberedsubsubsec Keep Old Files

+@GNUTAR{} provides two options to control its actions in a situation
+when it is about to extract a file which already exists on disk.
+
@table @option
@opindex keep-old-files
@item --keep-old-files
@itemx -k
-Do not replace existing files from archive. The
-@option{--keep-old-files} (@option{-k}) option prevents @command{tar}
-from replacing existing files with files with the same name from the
-archive. The @option{--keep-old-files} option is meaningless with
-@option{--list} (@option{-t}). Prevents @command{tar} from replacing
-files in the file system during extraction.
+Do not replace existing files from archive. When such a file is
+encountered, @command{tar} issues an error message. Upon end of
+extraction, @command{tar} exits with code 2 (@pxref{exit status}).
+
+@item --skip-old-files
+Do not replace existing files from archive, but do not treat that
+as error. Such files are silently skipped and do not affect
+@command{tar} exit status.
+
+Additional verbosity can be obtained using @option{--warning=existing-file}
+together with that option (@pxref{warnings}).
@end table

@node Keep Newer Files
diff --git a/src/common.h b/src/common.h
index 0b9bd7a..2409413 100644
--- a/src/common.h
+++ b/src/common.h
@@ -182,6 +182,7 @@ enum old_files
OVERWRITE_OLD_FILES, /* --overwrite */
UNLINK_FIRST_OLD_FILES, /* --unlink-first */
KEEP_OLD_FILES, /* --keep-old-files */
+ SKIP_OLD_FILES, /* --skip-old-files */
KEEP_NEWER_FILES /* --keep-newer-files */
};
GLOBAL enum old_files old_files_option;
@@ -807,11 +808,12 @@ void checkpoint_run (bool do_write);
#define WARN_UNKNOWN_KEYWORD 0x00020000
#define WARN_XDEV 0x00040000
#define WARN_DECOMPRESS_PROGRAM 0x00080000
+#define WARN_EXISTING_FILE 0x00100000

/* The warnings composing WARN_VERBOSE_WARNINGS are enabled by default
in verbose mode */
#define WARN_VERBOSE_WARNINGS (WARN_RENAME_DIRECTORY|WARN_NEW_DIRECTORY|\
- WARN_DECOMPRESS_PROGRAM)
+ WARN_DECOMPRESS_PROGRAM|WARN_EXISTING_FILE)
#define WARN_ALL (~WARN_VERBOSE_WARNINGS)

void set_warning_option (const char *arg);
diff --git a/src/extract.c b/src/extract.c
index aaea56e..662ea0b 100644
--- a/src/extract.c
+++ b/src/extract.c
@@ -639,9 +639,14 @@ maybe_recoverable (char *file_name, bool regular, bool *interdir_made)

switch (old_files_option)
{
- case KEEP_OLD_FILES:
+ case SKIP_OLD_FILES:
+ WARNOPT (WARN_EXISTING_FILE,
+ (0, 0, _("%s: skipping existing file"), file_name));
return RECOVER_SKIP;

+ case KEEP_OLD_FILES:
+ return RECOVER_NO;
+
case KEEP_NEWER_FILES:
if (file_newer_p (file_name, stp, &current_stat_info))
break;
diff --git a/src/tar.c b/src/tar.c
index 7b62996..7a673e0 100644
--- a/src/tar.c
+++ b/src/tar.c
@@ -328,6 +328,7 @@ enum
SHOW_DEFAULTS_OPTION,
SHOW_OMITTED_DIRS_OPTION,
SHOW_TRANSFORMED_NAMES_OPTION,
+ SKIP_OLD_FILES_OPTION,
SPARSE_VERSION_OPTION,
STRIP_COMPONENTS_OPTION,
SUFFIX_OPTION,
@@ -452,7 +453,11 @@ static struct argp_option options[] = {
{"remove-files", REMOVE_FILES_OPTION, 0, 0,
N_("remove files after adding them to the archive"), GRID+1 },
{"keep-old-files", 'k', 0, 0,
- N_("don't replace existing files when extracting"), GRID+1 },
+ N_("don't replace existing files when extracting, "
+ "treat them as errors"), GRID+1 },
+ {"skip-old-files", SKIP_OLD_FILES_OPTION, 0, 0,
+ N_("don't replace existing files when extracting, silently skip over them"),
+ GRID+1 },
{"keep-newer-files", KEEP_NEWER_FILES_OPTION, 0, 0,
N_("don't replace existing files that are newer than their archive copies"), GRID+1 },
{"overwrite", OVERWRITE_OPTION, 0, 0,
@@ -1618,6 +1623,10 @@ parse_opt (int key, char *arg, struct argp_state *state)
sparse_option = true;
break;

+ case SKIP_OLD_FILES_OPTION:
+ old_files_option = SKIP_OLD_FILES;
+ break;
+
case SPARSE_VERSION_OPTION:
sparse_option = true;
{
diff --git a/src/warning.c b/src/warning.c
index 5d1bcab..ee9d684 100644
--- a/src/warning.c
+++ b/src/warning.c
@@ -42,6 +42,7 @@ static char const *const warning_args[] = {
"unknown-keyword",
"xdev",
"decompress-program",
+ "existing-file",
NULL
};

@@ -66,7 +67,8 @@ static int warning_types[] = {
WARN_UNKNOWN_CAST,
WARN_UNKNOWN_KEYWORD,
WARN_XDEV,
- WARN_DECOMPRESS_PROGRAM
+ WARN_DECOMPRESS_PROGRAM,
+ WARN_EXISTING_FILE,
};

ARGMATCH_VERIFY (warning_args, warning_types);
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 119f1f3..3d78ea2 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -77,6 +77,8 @@ TESTSUITE_AT = \
extrac07.at\
extrac08.at\
extrac09.at\
+ extrac18.at\
+ extrac19.at\
extrac10.at\
extrac11.at\
extrac12.at\
diff --git a/tests/extrac18.at b/tests/extrac18.at
new file mode 100644
index 0000000..8b42ef7
--- /dev/null
+++ b/tests/extrac18.at
@@ -0,0 +1,60 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+#
+# Test suite for GNU tar.
+# Copyright (C) 2011 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Description: Check the functionality of the --keep-old-files option.
+# It should report an error and cause tar to exit with status 2.
+#
+# There was a regression in versions 1.23 to 1.26 inclusive, where
+# this option silently skipped such files.
+# Reported by: Doug McLaren <dougmc@frenzied.us>,
+# Gary Partis <gary@partis.co.uk>,
+# Jim Meyering <jim@meyering.net>
+#
+# References: <20111117045433.GA8245@algol.frenzied.us>,
+# <4F3D824717847C4487F77228F83329A3514CBB@server.Partis.local>,
+# <87wrar6zzz.fsf@rho.meyering.net>
+
+AT_SETUP([keep-old-files])
+AT_KEYWORDS([extract extrac18 old-files keep-old-files])
+
+AT_TAR_CHECK([
+mkdir dir
+cd dir
+echo 'Old file a' > a
+echo 'Old file b' > b
+
+tar cf ../archive .
+
+rm b
+echo 'File a' > a
+
+tar -x -k -f ../archive
+echo status=$?
+
+cat a
+],
+[0],
+[status=2
+File a
+],
+[tar: ./a: Cannot open: File exists
+tar: Exiting with failure status due to previous errors
+])
+
+AT_CLEANUP
+
diff --git a/tests/extrac19.at b/tests/extrac19.at
new file mode 100644
index 0000000..43c4c50
--- /dev/null
+++ b/tests/extrac19.at
@@ -0,0 +1,44 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+#
+# Test suite for GNU tar.
+# Copyright (C) 2011 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+AT_SETUP([skip-old-files])
+AT_KEYWORDS([extract extrac19 old-files skip-old-files])
+
+AT_TAR_CHECK([
+mkdir dir
+cd dir
+echo 'Old file a' > a
+echo 'Old file b' > b
+
+tar cf ../archive .
+
+rm b
+echo 'File a' > a
+
+tar -x --skip-old-files -f ../archive
+echo status=$?
+
+cat a
+],
+[0],
+[status=0
+File a
+])
+
+AT_CLEANUP
+
diff --git a/tests/testsuite.at b/tests/testsuite.at
index d1dab36..e43653e 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -166,6 +166,9 @@ m4_include([extrac15.at])
m4_include([extrac16.at])
m4_include([extrac17.at])

+m4_include([extrac18.at])
+m4_include([extrac19.at])
+
m4_include([label01.at])
m4_include([label02.at])
m4_include([label03.at])

27
SOURCES/tar-1.26-allow-extract-single-volume.patch

@ -0,0 +1,27 @@
diff --git a/src/extract.c b/src/extract.c
index 87b383a..340beea 100644
--- a/src/extract.c
+++ b/src/extract.c
@@ -1415,6 +1415,13 @@ extract_failure (char *file_name, int typeflag)
return 1;
}

+static int
+extract_skip (char *file_name, int typeflag)
+{
+ skip_member ();
+ return 0;
+}
+
typedef int (*tar_extractor_t) (char *file_name, int typeflag);

@@ -1495,7 +1502,7 @@ prepare_to_extract (char const *file_name, int typeflag, tar_extractor_t *fun)
ERROR ((0, 0,
_("%s: Cannot extract -- file is continued from another volume"),
quotearg_colon (current_stat_info.file_name)));
- *fun = extract_failure;
+ *fun = extract_skip;
break;

case GNUTYPE_LONGNAME:

266
SOURCES/tar-1.26-default-acls.patch

@ -0,0 +1,266 @@
From e3a7b9c8f26ca3b5a9aedd4c1d596a4a8504c812 Mon Sep 17 00:00:00 2001
From: Pavel Raiskup <praiskup@redhat.com>
Date: Thu, 4 Jun 2015 09:30:38 +0200
Subject: [PATCH] acls: don't mistakenly set default ACLs

Upstream commits
efbf4cce0b93e8c5a5fc93335b917bbeae2f67cb
9df17e6005e7a333399e3dc21a7afec75565c767
7fe7adcbb985e78aaf9f78051fa26167779be1f6
---
configure.ac | 2 +
src/xattrs.c | 37 ++++++++++++---
tests/Makefile.am | 1 +
tests/acls03.at | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/testsuite.at | 1 +
5 files changed, 165 insertions(+), 7 deletions(-)
create mode 100644 tests/acls03.at

diff --git a/configure.ac b/configure.ac
index 9b3e0c8..7ccb579 100644
--- a/configure.ac
+++ b/configure.ac
@@ -85,6 +85,8 @@ if test "x$with_posix_acls" != "xno"; then
AC_SEARCH_LIBS([acl_set_fd], [acl pacl],, [with_posix_acl=no])
AC_SEARCH_LIBS([acl_to_text], [acl pacl],, [with_posix_acl=no])
AC_SEARCH_LIBS([acl_from_text], [acl pacl],, [with_posix_acl=no])
+ AC_SEARCH_LIBS([acl_delete_def_file], [acl pacl],, [with_posix_acl=no])
+ AC_SEARCH_LIBS([acl_free], [acl pacl],, [with_posix_acl=no])
if test "x$with_posix_acls" != xno; then
AC_DEFINE(HAVE_POSIX_ACLS,,[Define when we have working POSIX acls])
fi
diff --git a/src/xattrs.c b/src/xattrs.c
index bdf6ba0..5bd4b02 100644
--- a/src/xattrs.c
+++ b/src/xattrs.c
@@ -61,6 +61,7 @@ static struct
acl_t acl_get_file_at (int dirfd, const char *file, acl_type_t type);
int acl_set_file_at (int dirfd, const char *file, acl_type_t type, acl_t acl);
int file_has_acl_at (int dirfd, char const *, struct stat const *);
+int acl_delete_def_file_at (int, char const *);

/* acl_get_file_at */
#define AT_FUNC_NAME acl_get_file_at
@@ -88,6 +89,17 @@ int file_has_acl_at (int dirfd, char const *, struct stat const *);
#undef AT_FUNC_POST_FILE_PARAM_DECLS
#undef AT_FUNC_POST_FILE_ARGS

+/* acl_delete_def_file_at */
+#define AT_FUNC_NAME acl_delete_def_file_at
+#define AT_FUNC_F1 acl_delete_def_file
+#define AT_FUNC_POST_FILE_PARAM_DECLS
+#define AT_FUNC_POST_FILE_ARGS
+#include "at-func.c"
+#undef AT_FUNC_NAME
+#undef AT_FUNC_F1
+#undef AT_FUNC_POST_FILE_PARAM_DECLS
+#undef AT_FUNC_POST_FILE_ARGS
+
/* gnulib file_has_acl_at */
#define AT_FUNC_NAME file_has_acl_at
#define AT_FUNC_F1 file_has_acl
@@ -187,7 +199,8 @@ fixup_extra_acl_fields (char *ptr)
return ptr;
}

-/* "system.posix_acl_access" */
+/* Set the "system.posix_acl_access/system.posix_acl_default" extended
+ attribute. Called only when acls_option > 0. */
static void
xattrs__acls_set (struct tar_stat_info const *st,
char const *file_name, int type,
@@ -199,15 +212,25 @@ xattrs__acls_set (struct tar_stat_info const *st,
{
/* assert (strlen (ptr) == len); */
ptr = fixup_extra_acl_fields (ptr);
-
acl = acl_from_text (ptr);
- acls_option = 1;
}
- else if (acls_option > 0)
+ else if (def)
+ {
+ /* No "default" IEEE 1003.1e ACL set for directory. At this moment,
+ FILE_NAME may already have inherited default acls from parent
+ directory; clean them up. */
+ if (acl_delete_def_file_at (chdir_fd, file_name))
+ WARNOPT (WARN_XATTR_WRITE,
+ (0, errno,
+ _("acl_delete_def_file_at: Cannot drop default POSIX ACLs "
+ "for file '%s'"),
+ file_name));
+ return;
+ }
+ else
+ /* There is nothing like "acl_delete_def_file" for non-default acls, we
+ need to re-set ACLs based on permission bits */
acl = perms2acl (st->stat.st_mode);
- else
- return; /* don't call acl functions unless we first hit an ACL, or
- --acls was passed explicitly */

if (!acl)
{
diff --git a/tests/Makefile.am b/tests/Makefile.am
index b0da439..228e936 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -179,6 +179,7 @@ TESTSUITE_AT = \
xattr05.at\
acls01.at\
acls02.at\
+ acls03.at\
selnx01.at\
selacl01.at\
capabs_raw01.at
diff --git a/tests/acls03.at b/tests/acls03.at
new file mode 100644
index 0000000..83c5bdc
--- /dev/null
+++ b/tests/acls03.at
@@ -0,0 +1,131 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+#
+# Test suite for GNU tar.
+# Copyright 2013, 2014 Free Software Foundation, Inc.
+
+# This file is part of GNU tar.
+
+# GNU tar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# GNU tar 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 General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# Test description:
+#
+# Check the storing/restoring with/without default ACLs. When --acls is passed,
+# restored directory tree should always match archive contents (even when the
+# archive does not contain any ACLs).
+#
+# References:
+# http://www.mail-archive.com/bug-tar@gnu.org/msg04355.html
+
+AT_SETUP([acls: default ACLs])
+AT_KEYWORDS([xattrs acls acls03])
+
+m4_define([ACL_LISTDIR], [
+ cd $1
+ $1="$(find d1 | sort | xargs -n 1 getfacl)"
+ cd ..
+])
+
+m4_define([ACL_ASSERT], [
+ echo "$$1" > $1.log
+ echo "$$2" > $2.log
+ if test ! "$$1" "$3" "$$2"; then
+ echo "bad '$1' against '$2' output"
+ fi
+])
+
+AT_TAR_CHECK([
+AT_XATTRS_UTILS_PREREQ
+AT_ACLS_PREREQ
+AT_SORT_PREREQ
+
+MYNAME=$( id -un )
+MYGROUP=$( id -gn )
+
+# Prepare directory structure with default ACLs
+mkdir -p pure/d1/d2
+genfile --file pure/d1/f2a
+genfile --file pure/d1/f2b
+genfile --file pure/d1/d2/f3a
+genfile --file pure/d1/d2/f3b
+setfacl -m g:$MYGROUP:r-x pure/d1
+setfacl -d -m g:$MYGROUP:rwx pure/d1
+setfacl -d -m u:$MYNAME:rwx pure/d1
+# "*a" files have "some" additional ACLs
+setfacl -m u:$MYNAME:--- pure/d1/d2/f3a
+setfacl -m u:$MYNAME:--- pure/d1/f2a
+
+# use default format (no acls stored)
+tar -cf noacl.tar -C pure d1
+
+# use posix format, acls stored
+tar --acls -cf acl.tar -C pure d1
+
+# Directory names are chosen based on "how the files were extracted from
+# archive". Equivalent no* tags are used also:
+# ^sacl_ — extracted archive has stored ACLs
+# _def_ — target directory (-C) has default ACLs
+# _optacl$ — extraction was done with --acls option
+
+mkdir sacl_def_optacl
+mkdir sacl_def_optnoacl
+mkdir sacl_nodef_optacl
+mkdir sacl_nodef_optnoacl
+mkdir nosacl_def_optacl
+mkdir nosacl_def_optnoacl
+mkdir nosacl_nodef_optacl
+mkdir nosacl_nodef_optnoacl
+
+setfacl -d -m u:$MYNAME:--- nosacl_def_optnoacl sacl_def_optnoacl sacl_def_optacl nosacl_def_optacl
+setfacl -d -m g:$MYGROUP:--- nosacl_def_optnoacl sacl_def_optnoacl sacl_def_optacl nosacl_def_optacl
+
+tar -xf acl.tar -C sacl_nodef_optnoacl
+tar --acls -xf acl.tar -C sacl_nodef_optacl
+tar -xf acl.tar -C sacl_def_optnoacl
+tar --acls -xf acl.tar -C sacl_def_optacl
+tar -xf noacl.tar -C nosacl_def_optnoacl
+# _NO_ ACLs in output
+tar -xf noacl.tar -C nosacl_nodef_optnoacl
+tar -xf noacl.tar -C nosacl_nodef_optacl
+tar -cf noacl_repackaged.tar -C nosacl_nodef_optnoacl d1
+# _NO_ ACLs in output (even when default ACLs exist)
+tar --acls -xf noacl_repackaged.tar -C nosacl_def_optacl
+
+ACL_LISTDIR(pure)
+
+ACL_LISTDIR(sacl_def_optacl)
+ACL_LISTDIR(sacl_def_optnoacl)
+ACL_LISTDIR(sacl_nodef_optacl)
+ACL_LISTDIR(sacl_nodef_optnoacl)
+ACL_LISTDIR(nosacl_def_optacl)
+ACL_LISTDIR(nosacl_def_optnoacl)
+ACL_LISTDIR(nosacl_nodef_optacl)
+ACL_LISTDIR(nosacl_nodef_optnoacl)
+
+ACL_ASSERT(pure, sacl_def_optacl, =)
+
+ACL_ASSERT(sacl_def_optacl, sacl_nodef_optacl, =)
+ACL_ASSERT(sacl_def_optnoacl, nosacl_def_optnoacl, =)
+ACL_ASSERT(sacl_nodef_optnoacl, nosacl_nodef_optnoacl, =)
+ACL_ASSERT(nosacl_def_optacl, nosacl_nodef_optacl, =)
+ACL_ASSERT(nosacl_def_optacl, nosacl_nodef_optnoacl, =)
+
+ACL_ASSERT(sacl_def_optacl, sacl_def_optnoacl, !=)
+ACL_ASSERT(sacl_def_optacl, nosacl_def_optnoacl, !=)
+ACL_ASSERT(nosacl_def_optnoacl, nosacl_nodef_optnoacl, !=)
+],
+[0],
+[],
+[])
+
+AT_CLEANUP
diff --git a/tests/testsuite.at b/tests/testsuite.at
index d5925b3..10cf26a 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -341,6 +341,7 @@ m4_include([xattr05.at])

m4_include([acls01.at])
m4_include([acls02.at])
+m4_include([acls03.at])

m4_include([selnx01.at])
m4_include([selacl01.at])
--
2.1.0

3500
SOURCES/tar-1.26-directory_with_remove-files.patch

File diff suppressed because it is too large Load Diff

372
SOURCES/tar-1.26-docu-xattrs.patch

@ -0,0 +1,372 @@
diff --git a/doc/tar.texi b/doc/tar.texi
index d678db9..ab8a0c8 100644
--- a/doc/tar.texi
+++ b/doc/tar.texi
@@ -37,7 +37,8 @@ This manual is for @acronym{GNU} @command{tar} (version
from archives.

Copyright @copyright{} 1992, 1994, 1995, 1996, 1997, 1999, 2000, 2001,
-2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software
+Foundation, Inc.

@quotation
Permission is granted to copy, distribute and/or modify this document
@@ -162,6 +163,7 @@ How to Create Archives
How to List Archives

* list dir::
+* List Extended Attributes::

How to Extract Members from an Archive

@@ -1492,6 +1494,7 @@ for a detailed discussion of globbing patterns and related

@menu
* list dir::
+* List Extended Attributes::
@end menu

@node list dir
@@ -1522,6 +1525,116 @@ drwxrwxrwx myself/user 0 1990-05-31 21:49 practice/
When you use a directory name as a file name argument, @command{tar} acts on
all the files (including sub-directories) in that directory.

+@node List Extended Attributes
+@unnumberedsubsec Listing xattrs, POSIX ACLs and SELinux context
+
+From upstream GNU tar 1.26.9, tar is able to store, extract and list extended
+file attributes. Listing of those attributes is then active only in verbose and
+double-verbose mode.
+
+This section exercises how to list attributes on examples. Lets start with
+simple verbose mode. This output is inspired by GNU @command{ls -l} command
+output.
+
+@itemize @bullet
+@item
+Show only pure extended attributes.
+
+@smallexample
+$ tar --xattrs --list -v archive.tar
+-rw-rwxr-- user/group 0 2012-08-08 15:15 acls.txt
+-rw-rw-r--* user/group 0 2012-08-08 15:15 xattrs.txt
+@end smallexample
+
+Note the asterisk on the third line! It reflects the situation that the file
+'xattrs.txt' has some extended attribute set. The default mode (same as if you
+are extracting extended attributes) shows information only about extended
+attributes from 'user.*' domain. Anyway, feel free to change the sensitivity
+using @option{--xattrs-include} or @option{--xattrs-exclude} options.
+
+@item Show only POSIX ACLs - the character you should look for is '+':
+
+@smallexample
+$ tar --acls --list -v archive.tar
+-rw-rwxr--+ praiskup/praiskup 0 2012-08-08 15:15 acls.txt
+-rw-rw-r-- praiskup/praiskup 0 2012-08-08 15:15 xattrs.txt
+@end smallexample
+
+@item Show only SELinux - the key character is '.':
+
+@smallexample
+$ tar --selinux --list -v archive.tar
+-rw-rw-r--. praiskup/praiskup 0 2012-08-08 15:16 selinux_only.txt
+-rw-rw-r-- praiskup/praiskup 0 2012-08-08 15:15 xattrs.txt
+@end smallexample
+
+@item
+Show info about ACLs, SELinux and general extended attributes together:
+
+@smallexample
+$ tar --selinux --acls --xattrs --list -v archive.tar
+-rw-rw-r--. praiskup/praiskup 0 2012-08-08 15:16 selinux_only.txt
+-rw-rwxr--+ praiskup/praiskup 0 2012-08-08 15:15 acls.txt
+-rw-rw-r--. praiskup/praiskup 0 2012-08-08 15:15 xattrs.txt
+@end smallexample
+
+In this case, the priority of character is '+' > '.' > '*'. You don't see the
+general extended attributes flag ('*' character) on this example because it is
+hidden by '.' (meaning that the file has SELinux context set).
+
+@end itemize
+
+The example of double verbose mode is here. In this output the single verbose
+characters '.', '+' and '*' are also present after the permission string.
+
+@smallexample
+$ tar --xattrs --selinux --acls -tvvf archive.tar
+-rw-rw-r--. praiskup/praiskup 0 2012-08-08 15:16 selinux_only.txt
+ s: unconfined_u:object_r:user_tmp_t:s0
+-rw-rwxr--+ praiskup/praiskup 0 2012-08-08 15:15 acls.txt
+ s: unconfined_u:object_r:user_tmp_t:s0
+ a: user::rw-,user:tester:rwx,group::rw-,mask::rwx,other::r--
+-rw-rw-r--. praiskup/praiskup 0 2012-08-08 15:15 xattrs.txt
+ s: unconfined_u:object_r:user_tmp_t:s0
+ x: 12 user.xattr
+ x: 12 user.we_like_tar
+@end smallexample
+
+This mode extends tar's output with additional lines beginning with
+distinguishing characters - 's' for SELinux context, 'a' for POSIX Access
+Control Lists and 'x' for generic extended attributes.
+
+In this format, POSIX ACLs are written in SHORT TEXT FORM as specified in manual
+page @command{man 5 acl}.
+
+Use the @option{--xattrs-include} again if you want to print other than default
+'user.*' extended attributes domain:
+
+@smallexample
+$ tar --xattrs --xattrs-include='*' --acls --selinux -tvvf archive.tar
+-rw-rw-r--. praiskup/praiskup 0 2012-08-08 15:16 selinux_only.txt
+ s: unconfined_u:object_r:user_tmp_t:s0
+ x: 36 security.selinux
+-rw-rwxr--+ praiskup/praiskup 0 2012-08-08 15:15 acls.txt
+ s: unconfined_u:object_r:user_tmp_t:s0
+ a: user::rw-,user:tester:rwx,group::rw-,mask::rwx,other::r--
+ x: 36 security.selinux
+ x: 44 system.posix_acl_access
+-rw-rw-r--. praiskup/praiskup 0 2012-08-08 15:15 xattrs.txt
+ s: unconfined_u:object_r:user_tmp_t:s0
+ x: 36 security.selinux
+ x: 12 user.xattr
+ x: 12 user.we_like_tar
+@end smallexample
+
+As is in @pxref{Option Summary} section described, tar by default stores all
+extended attributes that are available (not only 'user.*' domain). It means
+that the SELinux context and POSIX ACLs (because they are implemented using the
+generic extended attributes on usual file system) may be stored twice sometimes
+-- firstly in "raw" file system binary format and secondly in more portable way
+-- using appropriate system calls (invoked by @command{tar} options
+@option{--selinux} and @option{--acls}).
+
@node extract
@section How to Extract Members from an Archive
@cindex Extraction
@@ -2371,6 +2484,10 @@ Normally when creating an archive, @command{tar} strips an initial
@samp{/} from member names. This option disables that behavior.
@xref{absolute}.

+@opsummary{acls}
+@item --acls
+Causes @command{tar} to store/restore/list POSIX ACL's. @xref{Attributes}.
+
@opsummary{after-date}
@item --after-date

@@ -2919,6 +3036,11 @@ contents have changed (as opposed to just @option{--newer}, which will
also back up files for which any status information has
changed). @xref{after}.

+@opsummary{no-acls}
+@item --no-acls
+Causes @command{tar} not to store, extract or list POSIX ACL's.
+@xref{Attributes}.
+
@opsummary{no-anchored}
@item --no-anchored
An exclude pattern can match any subsequence of the name's components.
@@ -3002,11 +3124,20 @@ locations. Usually @command{tar} determines automatically whether
the archive can be seeked or not. Use this option to disable this
mechanism.

+@opsummary{no-selinux}
+@item --no-selinux
+Causes @command{tar} not to store, extract or list SELinux security context.
+@xref{Attributes}.
+
@opsummary{no-unquote}
@item --no-unquote
Treat all input file or member names literally, do not interpret
escape sequences. @xref{input name quoting}.

+@opsummary{no-xattrs}
+@item --no-xattrs
+Causes @command{tar} not to store, extract or list xattrs. @xref{Attributes}.
+
@opsummary{no-wildcards}
@item --no-wildcards
Do not use wildcards.
@@ -3239,6 +3370,11 @@ in cases when such recognition fails. It takes effect only if the
archive is open for reading (e.g. with @option{--list} or
@option{--extract} options).

+@opsummary{selinux}
+@item --selinux
+Causes @command{tar} to store, extract or list SELinux security context.
+@xref{Attributes}.
+
@opsummary{show-defaults}
@item --show-defaults

@@ -3466,6 +3602,11 @@ Enable or disable warning messages identified by @var{keyword}. The
messages are suppressed if @var{keyword} is prefixed with @samp{no-}.
@xref{warnings}.

+@opsummary{xattrs}
+@item --xattrs
+Causes @command{tar} to store, restore or list extended file attributes. For
+more info see @xref{Attributes}.
+
@opsummary{wildcards}
@item --wildcards
Use wildcards when matching member names with patterns.
@@ -4218,6 +4359,11 @@ tar (child): trying gzip
This means that @command{tar} first tried to decompress
@file{archive.Z} using @command{compress}, and, when that
failed, switched to @command{gzip}.
+@kwindex xattr-write
+@item xattr-write
+@samp{%s: Cannot set '%s' extended attribute for file '%s'}
+@*@samp{%s: Cannot set POSIX ACLs for file '%s'}
+@*@samp{%s: Cannot set SELinux context for file '%s'}
@end table

@subheading Keywords controlling incremental extraction:
@@ -8770,6 +8916,8 @@ implementation able to read @samp{ustar} archives will be able to read
most @samp{posix} archives as well, with the only exception that any
additional information (such as long file names etc.) will in such
case be extracted as plain text files along with the files it refers to.
+This is the only format that can store ACLs, SELinux context and extended
+attributes.

This archive format will be the default format for future versions
of @GNUTAR{}.
@@ -9412,6 +9560,135 @@ Same as both @option{--same-permissions} and @option{--same-order}.

This option is deprecated, and will be removed in @GNUTAR{} version 1.23.

+@opindex xattrs
+@item --xattrs
+This option causes @command{tar} to store, restore or list the extended file
+attributes (for information about extended attributes see @command{man(5)
+attr}).
+
+Note that all extended attributes are stored "as-is" (in file system binary
+format) and the resulting archive may be not fully portable. See the
+@option{--selinux} and @option{--acls} options when you want to deal with these
+types of extended attributes in a better way.
+
+The @option{--xattrs} option implies the option @option{--format=posix} when
+tar is in @option{--create} operation mode. It is the only one format which
+hase usable headers for storing additional file information like extended
+attributes are.
+
+By default, all extended attributes are stored into the archive. The reason is
+that we want to make the backup process as complete as possible by default. On
+the other hand, during extracting only the 'user.*' domain is extracted by
+default. Anyway, this default behaviour may be easily modified by the
+@option{--xattrs-include} and @option{--xattrs-exclude} options.
+
+When you list an archive in verbose mode
+(@command{tar --xattrs --verbose -tf archive.tar}), tar shows the '*' character
+after the permissions string of concrete file ringht to tell you that at least
+one extended attribute is stored with corresponding file.
+
+Double verbose mode (@command{tar --xattrs -tvvf archive.tar}) prints the
+extended attribute length (in bytes) and its ASCII key (for printed examples
+@pxref{List Extended Attributes}).
+
+@option{--xattrs} option has no equivalent short option.
+
+Warnings which occur during impossible writing of extended attributes to
+a file system may be suppressed using the @option{--warning=no-xattr-write}
+option.
+
+@opindex no-xattrs
+@item --no-xattrs
+This option causes @command{tar} not to store/extract or list the current
+extended attributes. This option does not affect options @option{--no-selinux}
+or @option{--no-acls}.
+
+The @option{--no-xattrs} option has no equivalent short option name.
+
+@opindex xattrs-include
+@opindex xattrs-exclude
+@item --xattrs-include=MASK
+@itemx --xattrs-exclude=MASK
+
+These options allows the xattr store/restore/list process to be more fine
+grained. The default configuration is that @option{--create} mode handles all
+available extended attributes and the @option{--extract}/@option{--list} mode
+handles only 'user.*' domain. These options may be used for editing of this
+default behaviour.
+
+@itemize @bullet
+@item
+Lets say we want to store all attributes except some "public restricted" domain
+(e.g. 'user.restricted.*' domain. The correct way how to do it is:
+
+@command{tar --xattrs --xattrs-include='*' --xattrs-exclude='user.restricted.*'
+-cf archive.tar FILES}
+@item
+And, when we want to extract only some specific domain from an archive - we can
+use:
+
+@command{tar --xattrs --xattrs-include='security.capability' -xf archive.tar
+FILES}
+@end itemize
+
+Multiple passed include/exclude patterns are combined together. The attribute
+is covered then only if (1) at least one of all include patterns matches its
+keyword and (2) no exclude pattern matches its keyword.
+
+When only include pattern is set - exclude pattern is left in default mode (and
+vice versa).
+
+@opindex selinux
+@item --selinux
+This option causes @command{tar} to store/extract/list the SELinux context
+information into/from an archive. Command @command{tar} is able to show info
+whether the SELinux context is present in archived file using the verbose
+listing mode (@command{tar --selinux -tvf archive.tar}). It shows the '.'
+character after permission string in that case. Double-verbose listing mode
+(@command{tar -tvvf archive.tar}) then prints the full SELinux context to
+standard output, @pxref{List Extended Attributes} for printed example.
+
+This option implies the @option{--format=posix} when @command{tar} works in
+@option{--create} operation mode.
+
+Warnings complaining that SELinux context may not be written to a file system
+may be suppressed by the @option{--warning=no-xattr-write} option.
+
+The @option{--selinux} option has no equivalent short option name.
+
+@opindex no-selinux
+@item --no-selinux
+This option causes @command{tar} not to store the current SELinux security
+context information in the archive and not to extract any SELinux information in
+an archive.
+
+The @option{--no-selinux} option has no equivalent short option name.
+
+@opindex acls
+@item --acls
+This option causes @command{tar} to store the current POSIX access control lists
+into the archive or restore POSIX ACLs from an archive. It also allows
+@command{tar} to show whether archived file contains ACLs when the verbose mode
+is active (@option{tar --acls -tvf} shows the symbol '+' after the permission
+characters in that case). Double-verbose mode allows @command{tar} to list
+contained POSIX ACLs (@command{tar --acls -tvvf archive.tar}), for printed
+examples @pxref{List Extended Attributes}.
+
+This option implies the @option{--format=posix} when @command{tar} works in
+@option{--create} operation mode.
+
+Warnings complaining that POSIX ACLs may not be written to a file system may be
+suppressed by the @option{--warning=no-xattr-write} option.
+
+The @option{--acls} option has no equivalent short form.
+
+@opindex no-acls
+@item --no-acls
+This option causes @command{tar} not to store the current POSIX ACL into the
+archive and not to extract any POSIX ACL information from an archive.
+
+The @option{--no-acls} option has no equivalent short option name.
+
@end table

@node Portability

31
SOURCES/tar-1.26-dont-segfault-with-disabled-selinux.patch

@ -0,0 +1,31 @@
From b6b3ed1fa4c6de12908a9f01d1689f156c3cd441 Mon Sep 17 00:00:00 2001
From: Pavel Raiskup <praiskup@redhat.com>
Date: Wed, 1 Jul 2015 12:30:57 +0200
Subject: [PATCH] selinux-h: avoid double free after *getfilecon()

Originally reported by Ben Shelton on bug-tar:
http://lists.gnu.org/archive/html/bug-tar/2015-04/msg00009.html

* lib/getfilecon.c (map_to_failure): Set the already freed '*con'
pointer to NULL. Man getfilecon(3) says that any non-NULL '*con'
parameter should be freed by freecon(3) (regardless the return
value).
---
ChangeLog | 9 +++++++++
lib/getfilecon.c | 1 +
2 files changed, 10 insertions(+)

diff --git a/lib/getfilecon.c b/lib/getfilecon.c
index 9ac69be..ef6adc8 100644
--- a/gnu/getfilecon.c
+++ b/gnu/getfilecon.c
@@ -57,6 +57,7 @@ map_to_failure (int ret, security_context_t *con)
if (ret == 10 && strcmp (*con, "unlabeled") == 0)
{
freecon (*con);
+ *con = NULL;
errno = ENODATA;
return -1;
}
--
2.7.4

91
SOURCES/tar-1.26-fix-symlink-eating-bug.patch

@ -0,0 +1,91 @@
diff --git a/gnu/stat-time.h b/gnu/stat-time.h
index 1dc4098..7b8428e 100644
--- a/gnu/stat-time.h
+++ b/gnu/stat-time.h
@@ -144,7 +144,7 @@ get_stat_mtime (struct stat const *st)
}

/* Return *ST's birth time, if available; otherwise return a value
- with negative tv_nsec. */
+ with tv_sec and tv_nsec both equal to -1. */
static inline struct timespec
get_stat_birthtime (struct stat const *st)
{
@@ -163,7 +163,7 @@ get_stat_birthtime (struct stat const *st)
t.tv_sec = st->st_ctime;
t.tv_nsec = 0;
#else
- /* Birth time is not supported. Set tv_sec to avoid undefined behavior. */
+ /* Birth time is not supported. */
t.tv_sec = -1;
t.tv_nsec = -1;
/* Avoid a "parameter unused" warning. */
@@ -177,10 +177,12 @@ get_stat_birthtime (struct stat const *st)
using zero. Attempt to work around this problem. Alas, this can
report failure even for valid time stamps. Also, NetBSD
sometimes returns junk in the birth time fields; work around this
- bug if it it is detected. There's no need to detect negative
- tv_nsec junk as negative tv_nsec already indicates an error. */
- if (t.tv_sec == 0 || 1000000000 <= t.tv_nsec)
- t.tv_nsec = -1;
+ bug if it is detected. */
+ if (! (t.tv_sec && 0 <= t.tv_nsec && t.tv_nsec < 1000000000))
+ {
+ t.tv_sec = -1;
+ t.tv_nsec = -1;
+ }
#endif

return t;
diff --git a/src/extract.c b/src/extract.c
index 340beea..3afb95d 100644
--- a/src/extract.c
+++ b/src/extract.c
@@ -119,12 +119,15 @@ struct delayed_link
/* The next delayed link in the list. */
struct delayed_link *next;

- /* The device, inode number and ctime of the placeholder. Use
- ctime, not mtime, to make false matches less likely if some
- other process removes the placeholder. */
+ /* The device, inode number and birthtime of the placeholder.
+ birthtime.tv_nsec is negative if the birthtime is not available.
+ Don't use mtime as this would allow for false matches if some
+ other process removes the placeholder. Don't use ctime as
+ this would cause race conditions and other screwups, e.g.,
+ when restoring hard-linked symlinks. */
dev_t dev;
ino_t ino;
- struct timespec ctime;
+ struct timespec birthtime;

/* True if the link is symbolic. */
bool is_symlink;
@@ -1200,7 +1203,7 @@ create_placeholder_file (char *file_name, bool is_symlink, bool *interdir_made)
delayed_link_head = p;
p->dev = st.st_dev;
p->ino = st.st_ino;
- p->ctime = get_stat_ctime (&st);
+ p->birthtime = get_stat_birthtime (&st);
p->is_symlink = is_symlink;
if (is_symlink)
{
@@ -1265,7 +1268,8 @@ extract_link (char *file_name, int typeflag)
if (ds->change_dir == chdir_current
&& ds->dev == st1.st_dev
&& ds->ino == st1.st_ino
- && timespec_cmp (ds->ctime, get_stat_ctime (&st1)) == 0)
+ && (timespec_cmp (ds->birthtime, get_stat_birthtime (&st1))
+ == 0))
{
struct string_list *p = xmalloc (offsetof (struct string_list, string)
+ strlen (file_name) + 1);
@@ -1638,7 +1642,7 @@ apply_delayed_links (void)
if (fstatat (chdir_fd, source, &st, AT_SYMLINK_NOFOLLOW) == 0
&& st.st_dev == ds->dev
&& st.st_ino == ds->ino
- && timespec_cmp (get_stat_ctime (&st), ds->ctime) == 0)
+ && timespec_cmp (get_stat_birthtime (&st), ds->birthtime) == 0)
{
/* Unlink the placeholder, then create a hard link if possible,
a symbolic link otherwise. */

208
SOURCES/tar-1.26-keep-directory-symlink-doc-and-test.patch

@ -0,0 +1,208 @@
From 49b5cd11bc3d64b0316cfc5b7245d25e4f7f4fcd Mon Sep 17 00:00:00 2001
From: Pavel Raiskup <praiskup@redhat.com>
Date: Thu, 19 Oct 2017 16:53:00 +0200
Subject: [PATCH] test keep-directory-symlink

Upstream commit:
From d06126f814563b01e598b85a8cc233604a2948f2 Mon Sep 17 00:00:00 2001
From: Pavel Raiskup <praiskup@redhat.com>
Date: Tue, 28 Feb 2017 09:55:09 +0100
Subject: [PATCH] Test and document --keep-directory-symlink

* doc/tar.1: Document the option.
* tests/extrac20.at: New testcase.
* tests/Makefile.am: Mention extrac20.
* tests/testsuite.at: Likewise.
---
tests/Makefile.am | 1 +
tests/extrac20.at | 151 +++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/testsuite.at | 2 +-
3 files changed, 153 insertions(+), 1 deletion(-)
create mode 100644 tests/extrac20.at

diff --git a/tests/Makefile.am b/tests/Makefile.am
index 094b71c..bd8d3e8 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -79,6 +79,7 @@ TESTSUITE_AT = \
extrac09.at\
extrac18.at\
extrac19.at\
+ extrac20.at\
extrac10.at\
extrac11.at\
extrac12.at\
diff --git a/tests/extrac20.at b/tests/extrac20.at
new file mode 100644
index 0000000..dd9b00d
--- /dev/null
+++ b/tests/extrac20.at
@@ -0,0 +1,151 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+#
+# Test suite for GNU tar.
+# Copyright 2017 Free Software Foundation, Inc.
+
+# This file is part of GNU tar.
+
+# GNU tar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# GNU tar 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 General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+AT_SETUP([keep-directory-symlink])
+AT_KEYWORDS([extrac20 extract old-files keep-old-files])
+
+AT_TAR_CHECK([
+AT_SORT_PREREQ
+
+for i in a b c
+do
+ dir=in$i
+ mkdir -p $dir/root/dir $dir/root/dirsymlink
+ touch $dir/root/dirsymlink/file$i
+ test $i != a && touch $dir/root/dirsymlink/file.conflict
+ tar cf archive$i.tar -C $dir root
+done
+
+prep()
+{
+ echo "== $1 =="
+ echo "== $1 ==" >&2
+ backup_dir=$1
+ dir=out
+ mkdir -p $dir/root/dir
+ ln -s dir $dir/root/dirsymlink
+ test $round = normal && cd $dir >/dev/null
+}
+
+clean()
+{
+ test $round = normal && cd .. >/dev/null
+ find $dir | sort
+ mv $dir $backup_dir
+}
+
+# Expand to '-f ../$1' or '-f $1 -C $dir' depending on $round variable
+file_spec()
+{
+ if test $round = normal
+ then
+ echo "-f ../$1"
+ else
+ echo "-f $1 -C $dir"
+ fi
+}
+
+for round in normal dir
+do
+ # Check that 'dirsymlink' replaces 'dir'
+ prep without_option_$round
+ tar -x `file_spec archivea.tar` || exit 1
+ tar -x `file_spec archiveb.tar` || exit 1
+ clean
+
+ # Keep directory symlink must keep root/dirsymlink
+ prep with_option_$round
+ tar -x --keep-directory-symlink `file_spec archivea.tar` || exit 1
+ tar -x --keep-directory-symlink `file_spec archiveb.tar` || exit 1
+ clean
+
+ prep collision_$round
+ tar -x --keep-directory-symlink `file_spec archivea.tar` --keep-old-files || exit 1
+ tar -x --keep-directory-symlink `file_spec archiveb.tar` --keep-old-files || exit 1
+ tar -x --keep-directory-symlink `file_spec archivec.tar` --keep-old-files && exit 1
+ clean
+done
+],
+[0],
+[== without_option_normal ==
+out
+out/root
+out/root/dir
+out/root/dirsymlink
+out/root/dirsymlink/file.conflict
+out/root/dirsymlink/filea
+out/root/dirsymlink/fileb
+== with_option_normal ==
+out
+out/root
+out/root/dir
+out/root/dir/file.conflict
+out/root/dir/filea
+out/root/dir/fileb
+out/root/dirsymlink
+== collision_normal ==
+out
+out/root
+out/root/dir
+out/root/dir/file.conflict
+out/root/dir/filea
+out/root/dir/fileb
+out/root/dir/filec
+out/root/dirsymlink
+== without_option_dir ==
+out
+out/root
+out/root/dir
+out/root/dirsymlink
+out/root/dirsymlink/file.conflict
+out/root/dirsymlink/filea
+out/root/dirsymlink/fileb
+== with_option_dir ==
+out
+out/root
+out/root/dir
+out/root/dir/file.conflict
+out/root/dir/filea
+out/root/dir/fileb
+out/root/dirsymlink
+== collision_dir ==
+out
+out/root
+out/root/dir
+out/root/dir/file.conflict
+out/root/dir/filea
+out/root/dir/fileb
+out/root/dir/filec
+out/root/dirsymlink
+],
+[== without_option_normal ==
+== with_option_normal ==
+== collision_normal ==
+tar: root/dirsymlink/file.conflict: Cannot open: File exists
+tar: Exiting with failure status due to previous errors
+== without_option_dir ==
+== with_option_dir ==
+== collision_dir ==
+tar: root/dirsymlink/file.conflict: Cannot open: File exists
+tar: Exiting with failure status due to previous errors
+])
+
+AT_CLEANUP
+
diff --git a/tests/testsuite.at b/tests/testsuite.at
index f7f00ee..b540948 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -234,9 +234,9 @@ m4_include([extrac14.at])
m4_include([extrac15.at])
m4_include([extrac16.at])
m4_include([extrac17.at])
-
m4_include([extrac18.at])
m4_include([extrac19.at])
+m4_include([extrac20.at])

m4_include([label01.at])
m4_include([label02.at])
--
2.13.6

169
SOURCES/tar-1.26-keep-directory-symlink.patch

@ -0,0 +1,169 @@
From c4a4cafaa330793d776b001c272bf19869aac39c Mon Sep 17 00:00:00 2001
From: Sergey Poznyakoff <gray@gnu.org.ua>
Date: Mon, 23 Sep 2013 19:35:29 +0300
Subject: [PATCH] Changes for compatibility with Slackware installation
scripts.

* src/buffer.c (short_read): the "Record size" message
is controlled by the WARN_RECORD_SIZE warning_option bit.
* src/common.h (keep_directory_symlink_option): New global.
(WARN_RECORD_SIZE): New constant.
(WARN_VERBOSE_WARNINGS): Add WARN_RECORD_SIZE.
* src/extract.c (extract_dir): If keep_directory_symlink_option is
set, follow symlinks to directories.
* src/suffix.c (compression_suffixes): Add support for txz
suffix.
* src/tar.c (KEEP_DIRECTORY_SYMLINK_OPTION): New constant.
(options): New option --keep-directory-symlink.
(parse_opt): Handle this option.
* src/warning.c: Implement "record-size" warning control.

* NEWS: Update.
* doc/tar.texi: Document new features.
---
NEWS | 12 ++++++++++++
doc/tar.texi | 15 +++++++++++++++
src/common.h | 2 ++
src/extract.c | 19 +++++++++++++++++++
src/tar.c | 8 ++++++++
5 files changed, 56 insertions(+)

diff --git a/NEWS b/NEWS
index 8f3c416..36a27da 100644
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,18 @@ Please send GNU tar bug reports to <bug-tar@gnu.org>
When creating a PAX-format archive, tar no longer arbitrarily restricts
the size of the representation of a sparse file to be less than 8 GiB.

+* New command line option --keep-directory-symlink
+
+By default, if when trying to extract a directory from the archive,
+tar discovers that the corresponding file name already exists and is a
+symbolic link, it first unlinks the entry, and then extracts the directory.
+
+This option disables this behavior and instructs tar to follow
+symlinks to directories when extracting from the archive.
+
+It is mainly intended to provide compatibility with the Slackware
+installation scripts.
+
version 1.26 - Sergey Poznyakoff, 2011-03-12

diff --git a/doc/tar.texi b/doc/tar.texi
index 6bd59c7..fb03b85 100644
--- a/doc/tar.texi
+++ b/doc/tar.texi
@@ -2923,6 +2923,21 @@ Specifies that @command{tar} should ask the user for confirmation before
performing potentially destructive options, such as overwriting files.
@xref{interactive}.

+@opsummary{--keep-directory-symlink}
+@item --keep-directory-symlink
+
+This option changes the behavior of tar when it encounters a symlink
+with the same name as the directory that it is about to extract. By
+default, in this case tar would first remove the symlink and then
+proceed extracting the directory.
+
+The @option{--keep-directory-symlink} option disables this behavior
+and instructs tar to follow symlinks to directories when extracting
+from the archive.
+
+It is mainly intended to provide compatibility with the Slackware
+installation scripts.
+
@opsummary{keep-newer-files}
@item --keep-newer-files

diff --git a/src/common.h b/src/common.h
index 16ba401..274da01 100644
--- a/src/common.h
+++ b/src/common.h
@@ -192,6 +192,8 @@ enum old_files
};
GLOBAL enum old_files old_files_option;

+GLOBAL bool keep_directory_symlink_option;
+
/* Specified file name for incremental list. */
GLOBAL const char *listed_incremental_option;
/* Incremental dump level */
diff --git a/src/extract.c b/src/extract.c
index 3afb95d..b622a2a 100644
--- a/src/extract.c
+++ b/src/extract.c
@@ -854,7 +854,21 @@ apply_nonancestor_delayed_set_stat (char const *file_name, bool after_links)
}

+static bool
+is_directory_link (const char *file_name)
+{
+ struct stat st;
+ int e = errno;
+ int res;

+ res = (fstatat (chdir_fd, file_name, &st, AT_SYMLINK_NOFOLLOW) == 0 &&
+ S_ISLNK (st.st_mode) &&
+ fstatat (chdir_fd, file_name, &st, 0) == 0 &&
+ S_ISDIR (st.st_mode));
+ errno = e;
+ return res;
+}
+
/* Extractor functions for various member types */

static int
@@ -910,10 +924,15 @@ extract_dir (char *file_name, int typeflag)

if (errno == EEXIST
&& (interdir_made
+ || keep_directory_symlink_option
|| old_files_option == DEFAULT_OLD_FILES
|| old_files_option == OVERWRITE_OLD_FILES))
{
struct stat st;
+
+ if (keep_directory_symlink_option && is_directory_link (file_name))
+ return 0;
+
if (deref_stat (file_name, &st) == 0)
{
current_mode = st.st_mode;
diff --git a/src/tar.c b/src/tar.c
index 18277e4..d62ca0e 100644
--- a/src/tar.c
+++ b/src/tar.c
@@ -290,6 +290,7 @@ enum
IGNORE_COMMAND_ERROR_OPTION,
IGNORE_FAILED_READ_OPTION,
INDEX_FILE_OPTION,
+ KEEP_DIRECTORY_SYMLINK_OPTION,
KEEP_NEWER_FILES_OPTION,
LEVEL_OPTION,
LZIP_OPTION,
@@ -488,6 +489,9 @@ static struct argp_option options[] = {
{"overwrite-dir", OVERWRITE_DIR_OPTION, 0, 0,
N_("overwrite metadata of existing directories when extracting (default)"),
GRID+1 },
+ {"keep-directory-symlink", KEEP_DIRECTORY_SYMLINK_OPTION, 0, 0,
+ N_("preserve existing symlinks to directories when extracting"),
+ GRID+1 },
#undef GRID

#define GRID 40
@@ -1878,6 +1882,10 @@ parse_opt (int key, char *arg, struct argp_state *state)
ignore_failed_read_option = true;
break;

+ case KEEP_DIRECTORY_SYMLINK_OPTION:
+ keep_directory_symlink_option = true;
+ break;
+
case KEEP_NEWER_FILES_OPTION:
old_files_option = KEEP_NEWER_FILES;
break;
--
2.9.3

389
SOURCES/tar-1.26-large-sparse-file-listing.patch

@ -0,0 +1,389 @@
From 77cef4ee39ee083838e5cf2137b0f344b49afb6a Mon Sep 17 00:00:00 2001
From: Pavel Raiskup <praiskup@redhat.com>
Date: Tue, 29 Jan 2013 10:39:30 +0100
Subject: [PATCH 1/4] Fix bug in sparse file listing

List posix archives containing sparse files >8GB correctly and do not fail.
This fixes also bug in format of listing for sparse files >8GB - now the
real size is printed instead of the effective one (this is not strictly
posix format related).

* src/list.c: Remove redundant assignment.
* src/tar.h: Add new 'real_size' and 'real_size_set' fields in
tar_stat_info struct.
* src/xheader.c: Correctly handle (especially sparse) file sizes directly in
xheader_decode().
---
src/list.c | 1 -
src/tar.h | 4 ++++
src/xheader.c | 15 ++++++++++++++-
3 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/src/list.c b/src/list.c
index dd501a9..6db36d1 100644
--- a/src/list.c
+++ b/src/list.c
@@ -670,7 +670,6 @@ decode_header (union block *header, struct tar_stat_info *stat_info,
}
}

- stat_info->archive_file_size = stat_info->stat.st_size;
xheader_decode (stat_info);

if (sparse_member_p (stat_info))
diff --git a/src/tar.h b/src/tar.h
index b181e58..690c146 100644
--- a/src/tar.h
+++ b/src/tar.h
@@ -327,6 +327,10 @@ struct tar_stat_info
size_t sparse_map_size; /* Size of the sparse map */
struct sp_array *sparse_map;

+ off_t real_size; /* The real size of sparse file */
+ int real_size_set; /* True when GNU.sparse.realsize is set in
+ archived file */
+
size_t xattr_map_size; /* Size of the xattr map */
struct xattr_array *xattr_map;

diff --git a/src/xheader.c b/src/xheader.c
index be793d4..708aece 100644
--- a/src/xheader.c
+++ b/src/xheader.c
@@ -764,6 +764,16 @@ xheader_decode (struct tar_stat_info *st)
continue;
}
run_override_list (keyword_override_list, st);
+
+ /* The archived (effective) file size is always set directly in tar header
+ field, possibly overridden by "size" extended header - in both cases,
+ result is now decoded in st->stat.st_size */
+ st->archive_file_size = st->stat.st_size;
+
+ /* The real file size (given by stat()) may be redefined for sparse
+ files in "GNU.sparse.realsize" extended header */
+ if (st->real_size_set)
+ st->stat.st_size = st->real_size;
}

static void
@@ -1438,7 +1435,10 @@ sparse_size_decoder (struct tar_stat_info *st,
{
uintmax_t u;
if (decode_num (&u, arg, TYPE_MAXIMUM (off_t), keyword))
- st->stat.st_size = u;
+ {
+ st->real_size_set = 1;
+ st->real_size = u;
+ }
}

static void
--
2.13.5


From 198d4621b2a367986c71cd2489c1465ec3be89dc Mon Sep 17 00:00:00 2001
From: Sergey Poznyakoff <gray@gnu.org>
Date: Fri, 7 Nov 2014 11:47:44 +0200
Subject: [PATCH 2/4] Add testcase for the previous commit.

* tests/sparse05.at: New file.
* tests/Makefile.am: Add sparse05.at
* tests/testsuite.at: Include sparse05.at
---
tests/Makefile.am | 1 +
tests/sparse05.at | 46 ++++++++++++++++++++++++++++++++++++++++++++++
tests/testsuite.at | 1 +
3 files changed, 48 insertions(+)
create mode 100644 tests/sparse05.at

diff --git a/tests/Makefile.am b/tests/Makefile.am
index 8e1ef8d..094b71c 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -171,6 +171,7 @@ TESTSUITE_AT = \
sparse02.at\
sparse03.at\
sparse04.at\
+ sparse05.at\
sparsemv.at\
sparsemvp.at\
spmvp00.at\
diff --git a/tests/sparse05.at b/tests/sparse05.at
new file mode 100644
index 0000000..72f3274
--- /dev/null
+++ b/tests/sparse05.at
@@ -0,0 +1,46 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+#
+# Test suite for GNU tar.
+# Copyright 2014 Free Software Foundation, Inc.
+
+# This file is part of GNU tar.
+
+# GNU tar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# GNU tar 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 General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+AT_SETUP([listing sparse files bigger than 2^33 B])
+AT_KEYWORDS([sparse sparse05])
+
+# Description: If an archive in POSIX.1-2001 archive contained a sparse file
+# member whose real size (excluding zero blocks) is bigger than 2^33 bytes,
+# tar 1.28 would incorrectly list the real member size.
+# Reported by: Pavel Raiskup <praiskup@redhat.com>
+# References: <1359119879.15037.4.camel@raiskup>,
+# http://lists.gnu.org/archive/html/bug-tar/2013-01/msg00001.html
+
+AT_TAR_CHECK([
+(echo 0 =2560
+for i in `seq 1 999`; do
+ echo 10M =2560
+done) | genfile --sparse --file BIGFILE --block-size 4K - || AT_SKIP_TEST
+tar -f - -c --sparse --posix BIGFILE | tar tvf - | awk '{ print $3, $(NF) }'
+],
+[0],
+[20961034240 BIGFILE
+],
+[],
+[],
+[],
+[pax])
+
+AT_CLEANUP
diff --git a/tests/testsuite.at b/tests/testsuite.at
index 3eb0eee..f7f00ee 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -308,6 +308,7 @@ m4_include([sparse01.at])
m4_include([sparse02.at])
m4_include([sparse03.at])
m4_include([sparse04.at])
+m4_include([sparse05.at])
m4_include([sparsemv.at])
m4_include([spmvp00.at])
m4_include([spmvp01.at])
--
2.13.5


From 8a795036f08bca508c3f3425f41c566562573e5f Mon Sep 17 00:00:00 2001
From: Sergey Poznyakoff <gray@gnu.org>
Date: Fri, 7 Nov 2014 11:37:33 +0200
Subject: [PATCH 3/4] genfile: improve sparse mode

Paxutils: 45af1632aa64a5ba1b108e248920e67c180e8485

* tests/genfile.c (generate_sparse_file): Handle '-' argument
(read from stdin);
If content strings starts with '=', treat it as fragment size and
use default pattern to fill it.
* doc/genfile.texi: Document changes to genfile.
---
doc/genfile.texi | 31 +++++++++++++++-------
tests/genfile.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++-------
2 files changed, 91 insertions(+), 19 deletions(-)

diff --git a/doc/genfile.texi b/doc/genfile.texi
index b37e26e..b993b9b 100644
--- a/doc/genfile.texi
+++ b/doc/genfile.texi
@@ -124,9 +124,8 @@ the rest of the command line specifies a so-called @dfn{file map}.
descriptors}. Each descriptor is composed of two values: a number,
specifying fragment offset from the end of the previous fragment or,
for the very first fragment, from the beginning of the file, and
-@dfn{contents string}, i.e., a string of characters, specifying the
-pattern to fill the fragment with. File offset can be suffixed with
-the following quantifiers:
+@dfn{contents string}, that specifies the pattern to fill the fragment
+with. File offset can be suffixed with the following quantifiers:

@table @samp
@item k
@@ -140,17 +139,29 @@ The number is expressed in megabytes.
The number is expressed in gigabytes.
@end table

- For each letter in contents string @command{genfile} will generate
-a @dfn{block} of data, filled with this letter and will write it to
-the fragment. The size of block is given by @option{--block-size}
-option. It defaults to 512. Thus, if the string consists of @var{n}
-characters, the resulting file fragment will contain
-@code{@var{n}*@var{block-size}} of data.
+ Contents string can be either a fragment size or a pattern.
+Fragment size is a decimal number, prefixed with an equals sign. It
+can be suffixed with a quantifier, as discussed above. If fragment
+size is given, the fragment of that size will be filled with the
+currently selected pattern (@pxref{Generate Mode, --pattern}) and
+written to the file.

- Last fragment descriptor can have only file offset part. In this
+ A pattern is a string of arbitrary ASCII characters. For each
+of them, @command{genfile} will generate a @dfn{block} of data,
+filled with that character and will write it to the fragment. The size
+of block is given by @option{--block-size} option. It defaults to 512.
+Thus, if pattern consists of @var{n} characters, the resulting file
+fragment will contain @code{@var{n}*@var{block-size}} bytes of data.
+
+ The last fragment descriptor can have only file offset part. In this
case @command{genfile} will create a hole at the end of the file up to
the given offset.

+ A dash appearing as a fragment descriptor instructs
+@command{genfile} to read file map from the standard input. Each line
+of input should consist of fragment offset and contents string,
+separated by any amount of whitespace.
+
For example, consider the following invocation:

@smallexample
diff --git a/tests/genfile.c b/tests/genfile.c
index fa480ef..d41336b 100644
--- a/tests/genfile.c
+++ b/tests/genfile.c
@@ -32,6 +32,7 @@
#include <inttostr.h>
#include <fcntl.h>
#include <sys/stat.h>
+#include <c-ctype.h>
#define obstack_chunk_alloc malloc
#define obstack_chunk_free free
#include <obstack.h>
@@ -506,6 +507,53 @@ mksparse (int fd, off_t displ, char *marks)
}
}

+static int
+make_fragment (int fd, char *offstr, char *mapstr)
+{
+ int i;
+ off_t displ = get_size (offstr, 1);
+
+ file_length += displ;
+
+ if (!mapstr || !*mapstr)
+ {
+ mkhole (fd, displ);
+ return 1;
+ }
+ else if (*mapstr == '=')
+ {
+ off_t n = get_size (mapstr + 1, 1);
+
+ switch (pattern)
+ {
+ case DEFAULT_PATTERN:
+ for (i = 0; i < block_size; i++)
+ buffer[i] = i & 255;
+ break;
+
+ case ZEROS_PATTERN:
+ memset (buffer, 0, block_size);
+ break;
+ }
+
+ if (lseek (fd, displ, SEEK_CUR) == -1)
+ error (EXIT_FAILURE, errno, "lseek");
+
+ for (; n; n--)
+ {
+ if (write (fd, buffer, block_size) != block_size)
+ error (EXIT_FAILURE, errno, "write");
+ file_length += block_size;
+ }
+ }
+ else
+ {
+ file_length += block_size * strlen (mapstr);
+ mksparse (fd, displ, mapstr);
+ }
+ return 0;
+}
+
static void
generate_sparse_file (int argc, char **argv)
{
@@ -526,20 +574,33 @@ generate_sparse_file (int argc, char **argv)

file_length = 0;

- for (i = 0; i < argc; i += 2)
+ while (argc)
{
- off_t displ = get_size (argv[i], 1);
- file_length += displ;
+ if (argv[0][0] == '-' && argv[0][1] == 0)
+ {
+ char buf[256];
+ while (fgets (buf, sizeof (buf), stdin))
+ {
+ size_t n = strlen (buf);

- if (i == argc-1)
- {
- mkhole (fd, displ);
- break;
+ while (n > 0 && c_isspace (buf[n-1]))
+ buf[--n] = 0;
+
+ n = strcspn (buf, " \t");
+ buf[n++] = 0;
+ while (buf[n] && c_isblank (buf[n]))
+ ++n;
+ make_fragment (fd, buf, buf + n);
+ }
+ ++argv;
+ --argc;
}
else
{
- file_length += block_size * strlen (argv[i+1]);
- mksparse (fd, displ, argv[i+1]);
+ if (make_fragment (fd, argv[0], argv[1]))
+ break;
+ argc -= 2;
+ argv += 2;
}
}

--
2.13.5


From 29e35df407d6c7b1e1ff57f7ef2030a253132a8a Mon Sep 17 00:00:00 2001
From: Pavel Raiskup <praiskup@redhat.com>
Date: Fri, 4 Dec 2015 19:36:14 +0100
Subject: [PATCH 4/4] genfile: remove unused variable

paxutils: 58b8ac114790e2de7992db1a387ec14238783f39

* tests/genfile.c (generate_sparse_file): Remove unused 'i'.
---
tests/genfile.c | 1 -
1 file changed, 1 deletion(-)

diff --git a/tests/genfile.c b/tests/genfile.c
index d41336b..4699d21 100644
--- a/tests/genfile.c
+++ b/tests/genfile.c
@@ -557,7 +557,6 @@ make_fragment (int fd, char *offstr, char *mapstr)
static void
generate_sparse_file (int argc, char **argv)
{
- int i;
int fd;
int flags = O_CREAT | O_RDWR | O_BINARY;

--
2.13.5

77
SOURCES/tar-1.26-non-deterministic-archive-detection.patch

@ -0,0 +1,77 @@

From 1847ec67cec36a17354115374954fea211d1f0da Mon Sep 17 00:00:00 2001
From: Sergey Poznyakoff <gray@gnu.org.ua>
Date: Thu, 19 Feb 2015 17:00:58 +0200
Subject: [PATCH] Improve compression format recognition

Some comressed archives can pass the checksum test, which makes tar
treat them as uncompressed archives.

* src/buffer.c (check_compressed_archive): Test the checksum only
if the block we read looks like a valid tar header (i.e. has
a magic string).
---
src/buffer.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/buffer.c b/src/buffer.c
index a7d8971..1a96595 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -391,7 +391,10 @@ check_compressed_archive (bool *pshort)
/* Restore global values */
read_full_records = sfr;

- if (tar_checksum (record_start, true) == HEADER_SUCCESS)
+ if ((strcmp (record_start->header.magic, TMAGIC) == 0 ||
+ strcmp (record_start->buffer + offsetof (struct posix_header, magic),
+ OLDGNU_MAGIC) == 0) &&
+ tar_checksum (record_start, true) == HEADER_SUCCESS)
/* Probably a valid header */
return ct_tar;

--
2.13.5



From 1e8b786e651d174a5fc9bf63a08d00c2d592ee3e Mon Sep 17 00:00:00 2001
From: Pavel Raiskup <praiskup@redhat.com>
Date: Thu, 30 Mar 2017 13:30:15 +0200
Subject: [PATCH] Fix non-deterministic archive type detection

Due to analysis of partly uninitialized read-ahead buffer
(short_read call), we sometimes mistakenly classified very small
compressed archives as non-compressed; which in turn caused
extraction failure.

* src/buffer.c (check_compressed_archive): Don't assume that
archives smaller than BLOCKSIZE could be non-compressed, as tar
header always has at least one block.
---
src/buffer.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/src/buffer.c b/src/buffer.c
index 57fe813..6f96c2f 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -402,10 +402,12 @@ check_compressed_archive (bool *pshort)
/* Restore global values */
read_full_records = sfr;

- if ((strcmp (record_start->header.magic, TMAGIC) == 0 ||
- strcmp (record_start->buffer + offsetof (struct posix_header, magic),
- OLDGNU_MAGIC) == 0) &&
- tar_checksum (record_start, true) == HEADER_SUCCESS)
+ if (record_start != record_end /* no files smaller than BLOCKSIZE */
+ && (strcmp (record_start->header.magic, TMAGIC) == 0
+ || strcmp (record_start->buffer + offsetof (struct posix_header,
+ magic),
+ OLDGNU_MAGIC) == 0)
+ && tar_checksum (record_start, true) == HEADER_SUCCESS)
/* Probably a valid header */
return ct_tar;

--
2.13.5

66
SOURCES/tar-1.26-pax-big-sparse-files.patch

@ -0,0 +1,66 @@
diff --git a/NEWS b/NEWS
index 8aeae33..8f3c416 100644
--- a/NEWS
+++ b/NEWS
@@ -1,10 +1,15 @@
GNU tar NEWS - User visible changes. 2012-11-19
Please send GNU tar bug reports to <bug-tar@gnu.org>

+** Sparse files with large data
+
+When creating a PAX-format archive, tar no longer arbitrarily restricts
+the size of the representation of a sparse file to be less than 8 GiB.
+
version 1.26 - Sergey Poznyakoff, 2011-03-12

-* Bugfixes
+* Bug fixes

** Fix the --verify option, which broke in version 1.24.

diff --git a/src/sparse.c b/src/sparse.c
index 4b2f982..cfd0c66 100644
--- a/src/sparse.c
+++ b/src/sparse.c
@@ -919,6 +919,18 @@ pax_sparse_member_p (struct tar_sparse_file *file)
|| file->stat_info->sparse_major > 0;
}

+/* Start a header that uses the effective (shrunken) file size. */
+static union block *
+pax_start_header (struct tar_stat_info *st)
+{
+ off_t realsize = st->stat.st_size;
+ union block *blk;
+ st->stat.st_size = st->archive_file_size;
+ blk = start_header (st);
+ st->stat.st_size = realsize;
+ return blk;
+}
+
static bool
pax_dump_header_0 (struct tar_sparse_file *file)
{
@@ -968,9 +980,7 @@ pax_dump_header_0 (struct tar_sparse_file *file)
return false;
}
}
- blk = start_header (file->stat_info);
- /* Store the effective (shrunken) file size */
- OFF_TO_CHARS (file->stat_info->archive_file_size, blk->header.size);
+ blk = pax_start_header (file->stat_info);
finish_header (file->stat_info, blk, block_ordinal);
if (save_file_name)
{
@@ -1035,9 +1045,7 @@ pax_dump_header_1 (struct tar_sparse_file *file)
if (strlen (file->stat_info->file_name) > NAME_FIELD_SIZE)
file->stat_info->file_name[NAME_FIELD_SIZE] = 0;

- blk = start_header (file->stat_info);
- /* Store the effective (shrunken) file size */
- OFF_TO_CHARS (file->stat_info->archive_file_size, blk->header.size);
+ blk = pax_start_header (file->stat_info);
finish_header (file->stat_info, blk, block_ordinal);
free (file->stat_info->file_name);
file->stat_info->file_name = save_file_name;

15
SOURCES/tar-1.26-posix-biguid.patch

@ -0,0 +1,15 @@
diff --git a/src/create.c b/src/create.c
index 25387a9..9a7a05a 100644
--- a/src/create.c
+++ b/src/create.c
@@ -514,8 +514,8 @@ start_private_header (const char *name, size_t size, time_t t)

TIME_TO_CHARS (t, header->header.mtime);
MODE_TO_CHARS (S_IFREG|S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH, header->header.mode);
- UID_TO_CHARS (getuid (), header->header.uid);
- GID_TO_CHARS (getgid (), header->header.gid);
+ UID_TO_CHARS (0, header->header.uid);
+ GID_TO_CHARS (0, header->header.gid);
MAJOR_TO_CHARS (0, header->header.devmajor);
MINOR_TO_CHARS (0, header->header.devminor);
strncpy (header->header.magic, TMAGIC, TMAGLEN);

250
SOURCES/tar-1.26-restore-incremental-backups.patch

@ -0,0 +1,250 @@
diff -urN tar-1.26/src/common.h tar-1.26new/src/common.h
--- tar-1.26/src/common.h 2017-01-24 09:43:08.638550577 +0100
+++ tar-1.26new/src/common.h 2017-01-23 10:58:19.675411746 +0100
@@ -598,6 +598,7 @@
char *normalize_filename (const char *name);
void replace_prefix (char **pname, const char *samp, size_t slen,
const char *repl, size_t rlen);
+char *tar_savedir (const char *name, int must_exist);

typedef struct namebuf *namebuf_t;
namebuf_t namebuf_create (const char *dir);
diff -urN tar-1.26/src/incremen.c tar-1.26new/src/incremen.c
--- tar-1.26/src/incremen.c 2011-02-16 23:12:16.000000000 +0100
+++ tar-1.26new/src/incremen.c 2017-01-23 10:58:19.676411754 +0100
@@ -1580,7 +1580,7 @@
if (!is_dumpdir (&current_stat_info))
return false;

- current_dir = savedir (directory_name);
+ current_dir = tar_savedir (directory_name, 0);

if (!current_dir)
/* The directory doesn't exist now. It'll be created. In any
diff -urN tar-1.26/src/misc.c tar-1.26new/src/misc.c
--- tar-1.26/src/misc.c 2011-02-16 23:12:16.000000000 +0100
+++ tar-1.26new/src/misc.c 2017-01-23 10:58:19.677411762 +0100
@@ -483,7 +483,7 @@

case RECURSIVE_REMOVE_OPTION:
{
- char *directory = savedir (file_name);
+ char *directory = tar_savedir (file_name, 0);
char const *entry;
size_t entrylen;

@@ -945,3 +945,31 @@
strcpy (buf->buffer + buf->dir_length, name);
return buf->buffer;
}
+
+/* Return the filenames in directory NAME, relative to the chdir_fd.
+ If the directory does not exist, report error if MUST_EXIST is
+ true.
+
+ Return NULL on errors.
+*/
+char *
+tar_savedir (const char *name, int must_exist)
+{
+ char *ret = NULL;
+ DIR *dir = NULL;
+ int fd = openat (chdir_fd, name, open_read_flags | O_DIRECTORY);
+ if (fd < 0)
+ {
+ if (!must_exist && errno == ENOENT)
+ return NULL;
+ open_error (name);
+ }
+ else if (! ((dir = fdopendir (fd))
+ && (ret = streamsavedir (dir))))
+ savedir_error (name);
+
+ if (dir ? closedir (dir) != 0 : 0 <= fd && close (fd) != 0)
+ savedir_error (name);
+
+ return ret;
+}
diff -urN tar-1.26/src/update.c tar-1.26new/src/update.c
--- tar-1.26/src/update.c 2017-01-24 09:43:08.620550423 +0100
+++ tar-1.26new/src/update.c 2017-01-23 12:29:20.410943374 +0100
@@ -144,16 +144,8 @@
{
if (S_ISDIR (s.st_mode))
{
- char *p, *dirp;
- DIR *stream;
- int fd = openat (chdir_fd, name->name,
- open_read_flags | O_DIRECTORY);
- if (fd < 0)
- open_error (name->name);
- else if (! ((stream = fdopendir (fd))
- && (dirp = streamsavedir (stream))))
- savedir_error (name->name);
- else
+ char *p, *dirp = tar_savedir (name->name, 1);
+ if (dirp)
{
namebuf_t nbuf = namebuf_create (name->name);

@@ -166,11 +158,6 @@

remname (name);
}
-
- if (stream
- ? closedir (stream) != 0
- : 0 <= fd && close (fd) != 0)
- savedir_error (name->name);
}
else if (tar_timespec_cmp (get_stat_mtime (&s),
current_stat_info.mtime)
diff -urN tar-1.26/tests/incr07.at tar-1.26new/tests/incr07.at
--- tar-1.26/tests/incr07.at 1970-01-01 01:00:00.000000000 +0100
+++ tar-1.26new/tests/incr07.at 2017-01-24 09:39:34.305615960 +0100
@@ -0,0 +1,112 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+# Test suite for GNU tar.
+# Copyright 2009, 2013 Free Software Foundation, Inc.
+#
+# GNU tar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# GNU tar 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+AT_SETUP([incremental restores with -C])
+AT_KEYWORDS([incremental extract incr07])
+
+# Tar 1.26 had problems extracting from incremental restores when given
+# the -C option. The code in incremen.c:try_purge_directory and
+# misc.c:remove_any_file was using savedir(), which ignored eventual changes
+# in the current working directory and caused the malfunctioning.
+#
+# The problem was reported by Piotr Rotter on 2013-03-22.
+#
+# This testcase is based on scripts provided by Piotr Rotter and Nathan
+# Stratton Treadway.
+#
+# References: <514C8F56.90900@active24.pl>,
+# http://lists.gnu.org/archive/html/bug-tar/2013-03/msg00036.html,
+# <20130326181922.GZ3732@shire.ontko.com>,
+# http://lists.gnu.org/archive/html/bug-tar/2013-03/msg00042.html,
+# <20130327051828.GA3732@shire.ontko.com>,
+# http://lists.gnu.org/archive/html/bug-tar/2013-03/msg00043.html,
+# <20130327054957.GB3732@shire.ontko.com>,
+# http://lists.gnu.org/archive/html/bug-tar/2013-03/msg00044.html
+
+AT_TAR_CHECK([
+mkdir dirA
+echo 'a' > dirA/a
+echo 'a' > dirA/b
+
+decho C0
+tar -g test.snar -vcf test.0.tar dirA
+
+echo 'a' > dirA/c
+decho C1
+tar -g test.snar -vcf test.1.tar dirA
+
+rm -f dirA/a
+decho C2
+tar -g test.snar -vcf test.2.tar dirA
+
+mkdir ext
+rm -rf dirA
+
+decho E0
+tar -g test.snar -vxf test.0.tar -C ext/
+decho E1
+tar -g test.snar -vxf test.1.tar -C ext/
+
+decho E2
+tar -g test.snar -vxf test.2.tar -C ext/
+
+mkdir ext/dirA/dirB
+touch ext/dirA/dirB/file
+
+decho E3
+tar -g test.snar -vxf test.2.tar -C ext/
+
+echo FIN
+test -d dirA && echo >&2 "toplevel dirA exists"
+exit 0
+],
+[0],
+[C0
+dirA/
+dirA/a
+dirA/b
+C1
+dirA/
+dirA/c
+C2
+dirA/
+E0
+dirA/
+dirA/a
+dirA/b
+E1
+dirA/
+dirA/c
+E2
+dirA/
+tar: Deleting `dirA/a'
+E3
+dirA/
+tar: Deleting `dirA/dirB'
+FIN
+],
+[C0
+tar: dirA: Directory is new
+C1
+C2
+E0
+E1
+E2
+E3
+],[],[],[gnu, oldgnu, posix])
+
+AT_CLEANUP
diff -urN tar-1.26/tests/Makefile.am tar-1.26new/tests/Makefile.am
--- tar-1.26/tests/Makefile.am 2017-01-24 09:43:08.656550731 +0100
+++ tar-1.26new/tests/Makefile.am 2017-01-23 10:58:19.678411770 +0100
@@ -98,6 +98,7 @@
incr04.at\
incr05.at\
incr06.at\
+ incr07.at\
indexfile.at\
ignfail.at\
label01.at\
diff -urN tar-1.26/tests/testsuite.at tar-1.26new/tests/testsuite.at
--- tar-1.26/tests/testsuite.at 2017-01-24 09:43:08.656550731 +0100
+++ tar-1.26new/tests/testsuite.at 2017-01-23 10:58:19.678411770 +0100
@@ -259,6 +259,7 @@
m4_include([incr04.at])
m4_include([incr05.at])
m4_include([incr06.at])
+m4_include([incr07.at])

m4_include([filerem01.at])
m4_include([filerem02.at])
diff -urN tar-1.26/THANKS tar-1.26new/THANKS
--- tar-1.26/THANKS 2017-01-24 09:43:08.636550560 +0100
+++ tar-1.26new/THANKS 2017-01-23 10:58:19.674411738 +0100
@@ -397,6 +397,7 @@
Philippe Defert defert@cern.ch
Piercarlo Grandi piercarl@sabi.demon.co.uk
Pierce Cantrell cantrell@ee.tamu.edu
+Piotr Rotter piotr.rotter@active24.pl
R. Kent Dybvig dyb@cadence.bloomington.in.us
R. Scott Butler butler@prism.es.dupont.com
Rainer Orth ro@TechFak.Uni-Bielefeld.DE

3602
SOURCES/tar-1.26-selinux-gnulib.patch

File diff suppressed because it is too large Load Diff

152
SOURCES/tar-1.26-silence-gcc.patch

@ -0,0 +1,152 @@
diff --git a/lib/rmt.h b/lib/rmt.h
index 2ce9dc5..4580e49 100644
--- a/lib/rmt.h
+++ b/lib/rmt.h
@@ -17,8 +17,9 @@
along with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */

-extern char *rmt_command;
-extern char *rmt_dev_name__;
+/* upstream fix 0b3d84a0ee */
+extern char const *rmt_command;
+extern char const *rmt_dev_name__;

int rmt_open__ (const char *, int, int, const char *);
int rmt_close__ (int);
diff --git a/lib/rtapelib.c b/lib/rtapelib.c
index 3aee428..1cef0fc 100644
--- a/lib/rtapelib.c
+++ b/lib/rtapelib.c
@@ -90,10 +90,10 @@ static int from_remote[MAXUNIT][2] = {{-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}};
/* The pipes for sending data to remote tape drives. */
static int to_remote[MAXUNIT][2] = {{-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}};

-char *rmt_command = DEFAULT_RMT_COMMAND;
+char const *rmt_command = DEFAULT_RMT_COMMAND; /* upstream fix 0b3d84a0ee */

/* Temporary variable used by macros in rmt.h. */
-char *rmt_dev_name__;
+char const *rmt_dev_name__; /* upstream fix 0b3d84a0ee */

/* If true, always consider file names to be local, even if they contain
colons */
@@ -490,15 +490,17 @@ rmt_open__ (const char *file_name, int open_mode, int bias,
{
/* Child. */

- close (STDIN_FILENO);
- dup (to_remote[remote_pipe_number][PREAD]);
- close (to_remote[remote_pipe_number][PREAD]);
- close (to_remote[remote_pipe_number][PWRITE]);
-
- close (STDOUT_FILENO);
- dup (from_remote[remote_pipe_number][PWRITE]);
- close (from_remote[remote_pipe_number][PREAD]);
- close (from_remote[remote_pipe_number][PWRITE]);
+ /* upstream fix 0b3d84a0ee */
+ if (dup2 (to_remote[remote_pipe_number][PREAD], STDIN_FILENO) < 0
+ || (to_remote[remote_pipe_number][PREAD] != STDIN_FILENO
+ && close (to_remote[remote_pipe_number][PREAD]) != 0)
+ || (to_remote[remote_pipe_number][PWRITE] != STDIN_FILENO
+ && close (to_remote[remote_pipe_number][PWRITE]) != 0)
+ || dup2 (from_remote[remote_pipe_number][PWRITE], STDOUT_FILENO) < 0
+ || close (from_remote[remote_pipe_number][PREAD]) != 0
+ || close (from_remote[remote_pipe_number][PWRITE]) != 0)
+ error (EXIT_ON_EXEC_ERROR, errno,
+ _("Cannot redirect files for remote shell"));

sys_reset_uid_gid ();

diff --git a/lib/system.h b/lib/system.h
index 2deb585..599d4ba 100644
--- a/lib/system.h
+++ b/lib/system.h
@@ -471,8 +471,13 @@ char *getenv ();
# define SET_BINARY_MODE(arc)
# define ERRNO_IS_EACCES 0
# define TTY_NAME "/dev/tty"
-# define sys_reset_uid_gid() \
- do { setuid (getuid ()); setgid (getgid ()); } while (0)
+
+/* upstream fix 0b3d84a0ee */
+# define sys_reset_uid_gid() \
+ do { \
+ if (! (setuid (getuid ()) == 0 && setgid (getgid ()) == 0)) \
+ abort (); \
+ } while (0)
#endif

#if XENIX
diff --git a/src/compare.c b/src/compare.c
index 273269a..796d7aa 100644
--- a/src/compare.c
+++ b/src/compare.c
@@ -362,7 +362,7 @@ static void
diff_dumpdir (void)
{
const char *dumpdir_buffer;
- dev_t dev = 0;
+ /* upstream fix 5bb04335079 */
struct stat stat_data;

if (deref_stat (current_stat_info.file_name, &stat_data) != 0)
@@ -372,8 +372,7 @@ diff_dumpdir (void)
else
stat_error (current_stat_info.file_name);
}
- else
- dev = stat_data.st_dev;
+ /* upstream fix 5bb04335079 */

dumpdir_buffer = directory_contents (scan_directory (&current_stat_info));

diff --git a/tests/genfile.c b/tests/genfile.c
index 8541be6..fa480ef 100644
--- a/tests/genfile.c
+++ b/tests/genfile.c
@@ -485,9 +485,11 @@ generate_files_from_list ()
static void
mkhole (int fd, off_t displ)
{
- if (lseek (fd, displ, SEEK_CUR) == -1)
+ off_t offset = lseek (fd, displ, SEEK_CUR);
+ if (offset < 0)
error (EXIT_FAILURE, errno, "lseek");
- ftruncate (fd, lseek (fd, 0, SEEK_CUR));
+ if (ftruncate (fd, offset) != 0)
+ error (EXIT_FAILURE, errno, "ftruncate");
}

static void
@@ -685,13 +687,18 @@ exec_checkpoint (struct action *p)
error (0, errno, _("cannot open `%s'"), p->name);
break;
}
- ftruncate (fd, p->size);
+ if (ftruncate (fd, p->size) != 0)
+ {
+ error (0, errno, _("cannot truncate `%s'"), p->name);
+ break;
+ }
close (fd);
}
break;

case OPT_EXEC:
- system (p->name);
+ if (system (p->name) != 0)
+ error (0, 0, _("command failed: %s"), p->name);
break;

case OPT_UNLINK:
@@ -761,7 +768,8 @@ exec_command (void)
signal (SIGCHLD, SIG_DFL);
#endif

- pipe (fd);
+ if (pipe (fd) != 0)
+ error (EXIT_FAILURE, errno, "pipe");

pid = fork ();
if (pid == -1)

14
SOURCES/tar-1.26-stdio.in.patch

@ -0,0 +1,14 @@
diff --git a/gnu/stdio.in.h b/gnu/stdio.in.h
index 465a9c9..b703457 100644
--- a/gnu/stdio.in.h
+++ b/gnu/stdio.in.h
@@ -164,7 +164,9 @@ _GL_WARN_ON_USE (fflush, "fflush is not always POSIX compliant - "
so any use of gets warrants an unconditional warning. Assume it is
always declared, since it is required by C89. */
#undef gets
+#if HAVE_RAW_DECL_GETS
_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
+#endif

#if @GNULIB_FOPEN@
# if @REPLACE_FOPEN@

147
SOURCES/tar-1.26-update-with-change-directory.patch

@ -0,0 +1,147 @@
From 207b445ca7018a95f2f96d9514b8d87c80e8e11e Mon Sep 17 00:00:00 2001
From: Pavel Raiskup <praiskup@redhat.com>
Date: Wed, 4 Apr 2012 18:04:53 +0200
Subject: [PATCH] Bad cooperation of -C and -u options

Previously, tar did not update archive with newly created files in archived
directory -- it failed instead with "file not found" error (because it looked
in bad directory in filesystem).
---
src/update.c | 4 +-
tests/Makefile.am | 3 +-
tests/testsuite.at | 3 +-
tests/update03.at | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 65 insertions(+), 4 deletions(-)
create mode 100644 tests/update03.at

diff --git a/src/update.c b/src/update.c
index e3228d4..4739e0d 100644
--- a/src/update.c
+++ b/src/update.c
@@ -1,7 +1,7 @@
/* Update a tar archive.

Copyright (C) 1988, 1992, 1994, 1996, 1997, 1999, 2000, 2001, 2003,
- 2004, 2005, 2007, 2010 Free Software Foundation, Inc.
+ 2004, 2005, 2007, 2010, 2011, 2012 Free Software Foundation, Inc.

This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
@@ -159,7 +159,7 @@ update_archive (void)

for (p = dirp; *p; p += strlen (p) + 1)
addname (namebuf_name (nbuf, p),
- 0, false, NULL);
+ name->change_dir, false, NULL);

namebuf_free (nbuf);
free (dirp);
diff --git a/tests/Makefile.am b/tests/Makefile.am
index ab7d104..119f1f3 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1,7 +1,7 @@
# Makefile for GNU tar regression tests.

# Copyright (C) 1996, 1997, 1999, 2000, 2001, 2003, 2004, 2005,
-# 2006, 2007, 2009 Free Software Foundation, Inc.
+# 2006, 2007, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.

# François Pinard <pinard@iro.umontreal.ca>, 1988.
# Sergey Poznyakoff <gray@mirddin.farlep.net>, 2004.
@@ -156,6 +156,7 @@ TESTSUITE_AT = \
update.at\
update01.at\
update02.at\
+ update03.at\
volsize.at\
volume.at\
verbose.at\
diff --git a/tests/testsuite.at b/tests/testsuite.at
index 8366ef0..13f7506 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -1,7 +1,7 @@
# Process this file with autom4te to create testsuite. -*- Autotest -*-

# Test suite for GNU tar.
-# Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010 Free Software
+# Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010, 2011, 2012 Free Software
# Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
@@ -241,6 +241,7 @@ m4_include([spmvp10.at])
m4_include([update.at])
m4_include([update01.at])
m4_include([update02.at])
+m4_include([update03.at])

m4_include([verify.at])

diff --git a/tests/update03.at b/tests/update03.at
new file mode 100644
index 0000000..185f9eb
--- /dev/null
+++ b/tests/update03.at
@@ -0,0 +1,59 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2012 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 3, or (at your option) any later version.
+
+# This program 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 General Public License for more
+# details.
+
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
+# Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# Description:
+# Test if the '--update' option works with the '--directory DIR' option
+# properly. In version <= 1.26 tar this combination caused problems.
+#
+# References:
+# https://bugzilla.redhat.com/show_bug.cgi?id=688567
+#
+# Last-Affected-Version: 1.26.90
+
+AT_SETUP([update & change directory (-C)])
+AT_KEYWORDS([update update03])
+
+AT_TAR_CHECK([
+AT_SORT_PREREQ
+
+# prepare filesystem
+mkdir dir
+mkdir dir/subdir
+genfile --file dir/subdir/a
+
+# crate archive of subdir
+tar -C dir -cf file.tar subdir
+
+# update filesystem
+mkdir dir/subdir/b
+genfile --file dir/subdir/b/c
+
+# sync the 'file.tar' archive
+tar -C dir -uf file.tar subdir
+
+# print contents
+tar -tf file.tar | sort || exit 1
+],
+[0],
+[subdir/
+subdir/a
+subdir/b/
+subdir/b/c
+])
+
+AT_CLEANUP
--
1.7.7.6

121
SOURCES/tar-1.26-xattrs-exclude-include-repair.patch

@ -0,0 +1,121 @@
diff -urN tar-1.26/src/xattrs.c tar-1.26new/src/xattrs.c
--- tar-1.26/src/xattrs.c 2017-01-10 10:58:11.894958586 +0100
+++ tar-1.26new/src/xattrs.c 2017-01-10 11:54:23.418221159 +0100
@@ -436,8 +436,12 @@
clear_mask_map (&xattrs_setup.excl);
}

-/* get all xattrs from file given by FILE_NAME or FD (when non-zero). This
- includes all the user.*, security.*, system.*, etc. available domains */
+static bool xattrs_masked_out (const char *kw, bool archiving);
+
+/* get xattrs from file given by FILE_NAME or FD (when non-zero)
+ xattrs are checked against the user supplied include/exclude mask
+ if no mask is given this includes all the user.*, security.*, system.*,
+ etc. available domains */
void
xattrs_xattrs_get (int parentfd, char const *file_name,
struct tar_stat_info *st, int fd)
@@ -482,8 +486,6 @@
size_t len = strlen (attr);
ssize_t aret = 0;

- /* Archive all xattrs during creation, decide at extraction time
- * which ones are of interest/use for the target filesystem. */
while (((fd == 0)
? ((aret = lgetxattrat (parentfd, file_name, attr,
val, asz)) == -1)
@@ -494,7 +496,10 @@
}

if (aret != -1)
- xheader_xattr_add (st, attr, val, aret);
+ {
+ if (!xattrs_masked_out (attr, true))
+ xheader_xattr_add (st, attr, val, aret);
+ }
else if (errno != ENOATTR)
call_arg_warn ((fd == 0) ? "lgetxattrat"
: "fgetxattr", file_name);
diff -urN tar-1.26/tests/Makefile.am tar-1.26new/tests/Makefile.am
--- tar-1.26/tests/Makefile.am 2017-01-10 10:58:11.894958586 +0100
+++ tar-1.26new/tests/Makefile.am 2017-01-10 11:53:55.046987231 +0100
@@ -177,6 +177,7 @@
xattr03.at\
xattr04.at\
xattr05.at\
+ xattr06.at\
acls01.at\
acls02.at\
acls03.at\
diff -urN tar-1.26/tests/testsuite.at tar-1.26new/tests/testsuite.at
--- tar-1.26/tests/testsuite.at 2017-01-10 10:58:11.896958604 +0100
+++ tar-1.26new/tests/testsuite.at 2017-01-10 11:53:55.047987240 +0100
@@ -338,6 +338,7 @@
m4_include([xattr03.at])
m4_include([xattr04.at])
m4_include([xattr05.at])
+m4_include([xattr06.at])

m4_include([acls01.at])
m4_include([acls02.at])
diff -urN tar-1.26/tests/xattr06.at tar-1.26new/tests/xattr06.at
--- tar-1.26/tests/xattr06.at 1970-01-01 01:00:00.000000000 +0100
+++ tar-1.26new/tests/xattr06.at 2017-01-10 11:54:23.418221159 +0100
@@ -0,0 +1,56 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+#
+# Test suite for GNU tar.
+# Copyright 2012-2014, 2016 Free Software Foundation, Inc.
+
+# This file is part of GNU tar.
+
+# GNU tar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# GNU tar 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 General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# Test description: Test for exclude of xattr during archive creation
+#
+# Relevant mailing list thread:
+#
+# http://lists.gnu.org/archive/html/bug-tar/2016-05/msg00031.html
+
+AT_SETUP([xattrs: exclude xattrs on create ])
+AT_KEYWORDS([xattrs xattr06])
+
+AT_TAR_CHECK([
+AT_XATTRS_PREREQ
+
+mkdir dir
+mkdir output
+genfile --file dir/file
+
+for attr in excluded incla inclb inclc incl_excluded
+do
+ setfattr -n user.${attr} -v value dir/file || AT_SKIP_TEST
+done
+
+tar --xattrs-include=user.incl'*' --xattrs-exclude=user.incl_excluded -cf archive.tar -C dir .
+tar -xf archive.tar --xattrs-include=user.incl[[ab]] --xattrs-exclude=user.inclb -C output
+
+getfattr -d output/file | grep -v \
+ -e excluded \
+ -e inclb \
+ -e inclc > filtered
+getfattr -d output/file > full
+# if they differ then the attribute is still present
+diff filtered full
+],
+[0],
+[])
+
+AT_CLEANUP

38
SOURCES/tar-1.26-xattrs-include-implies-xattrs.patch

@ -0,0 +1,38 @@
diff --git a/src/tar.c b/src/tar.c
index e244808..18277e4 100644
--- a/src/tar.c
+++ b/src/tar.c
@@ -162,6 +162,14 @@ set_archive_format (char const *name)
archive_format = p->fmt;
}

+static void
+set_xattr_option (int value)
+{
+ if (value == 1)
+ set_archive_format ("posix");
+ xattrs_option = value;
+}
+
const char *
archive_format_string (enum archive_format fmt)
{
@@ -2141,16 +2149,16 @@ parse_opt (int key, char *arg, struct argp_state *state)
break;

case XATTR_OPTION:
- set_archive_format ("posix");
- xattrs_option = 1;
+ set_xattr_option (1);
break;

case NO_XATTR_OPTION:
- xattrs_option = -1;
+ set_xattr_option (-1);
break;

case XATTR_INCLUDE:
case XATTR_EXCLUDE:
+ set_xattr_option (1);
xattrs_mask_add (arg, (key == XATTR_INCLUDE));
break;

35
SOURCES/tar-1.26-xattrs-printing.patch

@ -0,0 +1,35 @@
diff --git a/src/xattrs.c b/src/xattrs.c
index 5a4bf72..bdf6ba0 100644
--- a/src/xattrs.c
+++ b/src/xattrs.c
@@ -693,7 +693,7 @@ xattrs_print_char (struct tar_stat_info const *st, char *output)
if (selinux_context_option > 0 && st->cntx_name)
*output = '.';

- if (acls_option && (st->acls_a_len || st->acls_d_len))
+ if (acls_option > 0 && (st->acls_a_len || st->acls_d_len))
*output = '+';
}

@@ -704,11 +704,11 @@ xattrs_print (struct tar_stat_info const *st)
return;

/* selinux */
- if (selinux_context_option && st->cntx_name)
+ if (selinux_context_option > 0 && st->cntx_name)
fprintf (stdlis, " s: %s\n", st->cntx_name);

/* acls */
- if (acls_option && (st->acls_a_len || st->acls_d_len))
+ if (acls_option > 0 && (st->acls_a_len || st->acls_d_len))
{
fprintf (stdlis, " a: ");
acls_one_line ("", ',', st->acls_a_ptr, st->acls_a_len);
@@ -717,7 +717,7 @@ xattrs_print (struct tar_stat_info const *st)
}

/* xattrs */
- if (xattrs_option && st->xattr_map_size)
+ if (xattrs_option > 0 && st->xattr_map_size)
{
int i;

214
SOURCES/tar-1.26-xattrs-skip-old-files-hangs.patch

@ -0,0 +1,214 @@
diff --git a/THANKS b/THANKS
index e87381f..6fa0a9e 100644
--- a/THANKS
+++ b/THANKS
@@ -131,6 +131,7 @@ David Nugent davidn@blaze.net.au
David Shaw david.shaw@alcatel.com.au
David Steiner dsteiner@ispa.uni-osnabrueck.de
David Taylor taylor@think.com
+Dawid dpc@dpc.pw
Dean Gaudet dgaudet@watdragon.uwaterloo.ca
Demizu Noritoshi nori-d@is.aist-nara.ac.jp
Denis Excoffier denis.excoffier@free.fr
diff --git a/src/extract.c b/src/extract.c
index b622a2a..63e4d14 100644
--- a/src/extract.c
+++ b/src/extract.c
@@ -745,13 +745,13 @@ maybe_recoverable (char *file_name, bool regular, bool *interdir_made)
in advance dramatically improves the following performance of reading and
writing a file). If not restoring permissions, invert the INVERT_PERMISSIONS
bits from the file's current permissions. TYPEFLAG specifies the type of the
- file. FILE_CREATED indicates set_xattr has created the file */
+ file. Returns non-zero when error occurs (while un-available xattrs is not
+ an error, rather no-op). Non-zero FILE_CREATED indicates set_xattr has
+ created the file. */
static int
set_xattr (char const *file_name, struct tar_stat_info const *st,
mode_t invert_permissions, char typeflag, int *file_created)
{
- int status = 0;
-
#ifdef HAVE_XATTRS
bool interdir_made = false;

@@ -759,17 +759,32 @@ set_xattr (char const *file_name, struct tar_stat_info const *st,
{
mode_t mode = current_stat_info.stat.st_mode & MODE_RWX & ~ current_umask;

- do
- status = mknodat (chdir_fd, file_name, mode ^ invert_permissions, 0);
- while (status && maybe_recoverable ((char *)file_name, false,
- &interdir_made));
+ for (;;)
+ {
+ if (!mknodat (chdir_fd, file_name, mode ^ invert_permissions, 0))
+ {
+ /* Successfully created file */
+ xattrs_xattrs_set (st, file_name, typeflag, 0);
+ *file_created = 1;
+ return 0;
+ }

- xattrs_xattrs_set (st, file_name, typeflag, 0);
- *file_created = 1;
+ switch (maybe_recoverable ((char *)file_name, false, &interdir_made))
+ {
+ case RECOVER_OK:
+ continue;
+ case RECOVER_NO:
+ skip_member ();
+ open_error (file_name);
+ return 1;
+ case RECOVER_SKIP:
+ return 0;
+ }
+ }
}
#endif

- return(status);
+ return 0;
}

/* Fix the statuses of all directories whose statuses need fixing, and
@@ -1089,11 +1104,7 @@ extract_file (char *file_name, int typeflag)
int file_created = 0;
if (set_xattr (file_name, &current_stat_info, invert_permissions,
typeflag, &file_created))
- {
- skip_member ();
- open_error (file_name);
- return 1;
- }
+ return 1;

while ((fd = open_output_file (file_name, typeflag, mode,
file_created, &current_mode,
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 2a70314..8e1ef8d 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -200,6 +200,7 @@ TESTSUITE_AT = \
xattr04.at\
xattr05.at\
xattr06.at\
+ xattr07.at\
acls01.at\
acls02.at\
acls03.at\
diff --git a/tests/testsuite.at b/tests/testsuite.at
index ebce9cc..3eb0eee 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -361,6 +361,7 @@ m4_include([xattr03.at])
m4_include([xattr04.at])
m4_include([xattr05.at])
m4_include([xattr06.at])
+m4_include([xattr07.at])

m4_include([acls01.at])
m4_include([acls02.at])
diff --git a/tests/xattr07.at b/tests/xattr07.at
new file mode 100644
index 0000000..a834981
--- /dev/null
+++ b/tests/xattr07.at
@@ -0,0 +1,73 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+#
+# Test suite for GNU tar.
+# Copyright 2011, 2013-2014, 2016 Free Software Foundation, Inc.
+
+# This file is part of GNU tar.
+
+# GNU tar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# GNU tar 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 General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# Test description:
+# Test that --keep-old-files doesn't change xattrs of already existing file.
+# Per report:
+# https://lists.gnu.org/archive/html/bug-tar/2016-10/msg00001.html
+
+AT_SETUP([xattrs: xattrs and --skip-old-files])
+AT_KEYWORDS([xattrs xattr07])
+
+AT_TAR_CHECK([
+AT_XATTRS_PREREQ
+mkdir dir
+genfile --file dir/file
+genfile --file dir/file2
+
+setfattr -n user.test -v OurDirValue dir
+setfattr -n user.test -v OurFileValue dir/file
+setfattr -n user.test -v OurFileValue dir/file2
+
+tar --xattrs -cf archive.tar dir
+
+setfattr -n user.test -v OurDirValue2 dir
+setfattr -n user.test -v OurFileValue2 dir/file
+setfattr -n user.test -v OurFileValue2 dir/file2
+
+# Check that tar continues to file2 too!
+tar --xattrs -xvf archive.tar --skip-old-files
+tar --xattrs -xvf archive.tar --keep-old-files
+
+getfattr -h -d dir | grep -v -e '^#' -e ^$
+getfattr -h -d dir/file | grep -v -e '^#' -e ^$
+getfattr -h -d dir/file2 | grep -v -e '^#' -e ^$
+],
+[0],
+[dir/
+dir/file
+dir/file2
+dir/
+dir/file
+dir/file2
+user.test="OurDirValue2"
+user.test="OurFileValue2"
+user.test="OurFileValue2"
+], [tar: dir: skipping existing file
+tar: dir/file: skipping existing file
+tar: dir/file: skipping existing file
+tar: dir/file2: skipping existing file
+tar: dir/file2: skipping existing file
+tar: dir/file: Cannot open: File exists
+tar: dir/file2: Cannot open: File exists
+tar: Exiting with failure status due to previous errors
+])
+
+AT_CLEANUP
From f2a7560718946e0920b55419f0953953bf824077 Mon Sep 17 00:00:00 2001
From: Pavel Raiskup <praiskup@redhat.com>
Date: Mon, 28 Nov 2016 08:44:42 +0100
Subject: [PATCH] tests: more deterministic xattr07

* tests/xattr07.at: Define order of files within tested archive.
---
tests/xattr07.at | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/xattr07.at b/tests/xattr07.at
index a834981..47d54b8 100644
--- a/tests/xattr07.at
+++ b/tests/xattr07.at
@@ -36,7 +36,7 @@ setfattr -n user.test -v OurDirValue dir
setfattr -n user.test -v OurFileValue dir/file
setfattr -n user.test -v OurFileValue dir/file2

-tar --xattrs -cf archive.tar dir
+tar --xattrs --no-recursion -cf archive.tar dir dir/file dir/file2

setfattr -n user.test -v OurDirValue2 dir
setfattr -n user.test -v OurFileValue2 dir/file
--
2.13.5

3233
SOURCES/tar-1.26-xattrs.patch

File diff suppressed because it is too large Load Diff

21
SOURCES/tar-1.27-sparse-stat-detection.patch

@ -0,0 +1,21 @@
diff --git a/lib/system.h b/lib/system.h
index ef46267..e7f531c 100644
--- a/lib/system.h
+++ b/lib/system.h
@@ -389,9 +389,16 @@ extern int errno;
# define ST_NBLOCKSIZE 512
#endif

+/* Network Appliance file systems store small files directly in the
+ inode if st_size <= 64; in this case the number of blocks can be
+ zero. Perhaps other file systems have similar problems; so,
+ somewhat arbitrarily, do not consider a file to be sparse if
+ it has no blocks but st_size < ST_NBLOCKSIZE. */
#define ST_IS_SPARSE(st) \
(ST_NBLOCKS (st) \
- < ((st).st_size / ST_NBLOCKSIZE + ((st).st_size % ST_NBLOCKSIZE != 0)))
+ < ((st).st_size / ST_NBLOCKSIZE \
+ + ((st).st_size % ST_NBLOCKSIZE != 0 \
+ && (st).st_size / ST_NBLOCKSIZE != 0)))

/* Declare standard functions. */

638
SOURCES/tar.1

@ -0,0 +1,638 @@
.\" This file was originally generated by help2man
.TH TAR "1" "February 2013" "tar 1.26" "User Commands"
.SH NAME
tar \- manual page for tar 1.26
.SH SYNOPSIS
.B tar
[\fIOPTION\fR...] [\fIFILE\fR]...
.SH DESCRIPTION
GNU `tar' saves many files together into a single tape or disk archive, and can
restore individual files from the archive.

Note that this manual page contains just very brief description (or more like
a list of possible functionality) originally generated by the
.B
help2man
utility. The full documentation for
.B tar
is maintained as a Texinfo manual. If the
.B info
and
.B tar
programs are properly installed at your site, the command
.B `info tar'
should give you access to the complete manual.
.SH EXAMPLES
.TP
tar \fB\-cf\fR archive.tar foo bar
# Create archive.tar from files foo and bar.
.TP
tar \fB\-tvf\fR archive.tar
# List all files in archive.tar verbosely.
.TP
tar \fB\-xf\fR archive.tar
# Extract all files from archive.tar.
.IP
.SH DEFAULTS
*This* tar installation defaults to:

\fB\-\-format\fR=\fIgnu\fR \fB\-f\-\fR \fB\-b20\fR \fB\-\-quoting\-style\fR=\fIescape\fR \fB\-\-rmt\-command=\fR/sbin/rmt
\fB\-\-rsh\-command=\fR/usr/bin/rsh
.SH \fBMain operation mode:\fR
.TP
\fB\-A\fR, \fB\-\-catenate\fR, \fB\-\-concatenate\fR
append tar files to an archive
.TP
\fB\-c\fR, \fB\-\-create\fR
create a new archive
.TP
\fB\-d\fR, \fB\-\-diff\fR, \fB\-\-compare\fR
find differences between archive and file system
.TP
\fB\-\-delete\fR
delete from the archive (not on mag tapes!)
.TP
\fB\-r\fR, \fB\-\-append\fR
append files to the end of an archive
.TP
\fB\-t\fR, \fB\-\-list\fR
list the contents of an archive
.TP
\fB\-\-test\-label\fR
test the archive volume label and exit
.TP
\fB\-u\fR, \fB\-\-update\fR
only append files newer than copy in archive
.TP
\fB\-x\fR, \fB\-\-extract\fR, \fB\-\-get\fR
extract files from an archive
.IP
.SH \fBCommon options:\fR
.TP
\fB-C\fR, \fB--directory=DIR\fR
change to directory DIR
.TP
\fB-f\fR, \fB--file=ARCHIVE\fR
use archive file or device ARCHIVE
.TP
\fB-j\fR, \fB--bzip2\fR
filter the archive through bzip2
.TP
\fB -J\fR, \fB--xz\fR
filter the archive through xz
.TP
\fB-p\fR, \fB--preserve-permissions\fR
extract information about file permissions (default for superuser)
.TP
\fB-v\fR, \fB--verbose\fR
verbosely list files processed
.TP
\fB-z\fR, \fB--gzip\fR
filter the archive through gzip

.SH \fBOperation modifiers:\fR
.TP
\fB\-\-check\-device\fR
check device numbers when creating incremental
archives (default)
.TP
\fB\-g\fR, \fB\-\-listed\-incremental\fR=\fIFILE\fR
handle new GNU\-format incremental backup
.TP
\fB\-G\fR, \fB\-\-incremental\fR
handle old GNU\-format incremental backup
.TP
\fB\-\-ignore\-failed\-read\fR
do not exit with nonzero on unreadable files
.TP
\fB\-\-level\fR=\fINUMBER\fR
dump level for created listed\-incremental archive
.TP
\fB\-n\fR, \fB\-\-seek\fR
archive is seekable
.TP
\fB\-\-no\-check\-device\fR
do not check device numbers when creating
incremental archives
.TP
\fB\-\-no\-seek\fR
archive is not seekable
.TP
\fB\-\-occurrence\fR[=\fINUMBER\fR]
process only the NUMBERth occurrence of each file
in the archive; this option is valid only in
conjunction with one of the subcommands \fB\-\-delete\fR,
\fB\-\-diff\fR, \fB\-\-extract\fR or \fB\-\-list\fR and when a list of
files is given either on the command line or via
the \fB\-T\fR option; NUMBER defaults to 1
.TP
\fB\-\-sparse\-version\fR=\fIMAJOR[\fR.MINOR]
set version of the sparse format to use (implies
\fB\-\-sparse\fR)
.TP
\fB\-S\fR, \fB\-\-sparse\fR
handle sparse files efficiently
.IP
.SH \fBOverwrite control:\fR
.TP
\fB\-k\fR, \fB\-\-keep\-old\-files\fR
don't replace existing files when extracting,
treat them as errors
.TP
\fB\-\-keep\-newer\-files\fR
don't replace existing files that are newer than
their archive copies
.TP
\fB\-\-keep\-directory\-symlink\fR
Don't replace existing symlinks to directories when extracting.
.TP
\fB\-\-no\-overwrite\-dir\fR
preserve metadata of existing directories
.TP
\fB\-\-overwrite\fR
overwrite existing files when extracting
.TP
\fB\-\-overwrite\-dir\fR
overwrite metadata of existing directories when
extracting (default)
.TP
\fB\-\-recursive\-unlink\fR
empty hierarchies prior to extracting directory
.TP
\fB\-\-remove\-files\fR
remove files after adding them to the archive
.TP
\fB\-\-skip\-old\-files\fR
don't replace existing files when extracting,
silently skip over them
.TP
\fB\-U\fR, \fB\-\-unlink\-first\fR
remove each file prior to extracting over it
.TP
\fB\-W\fR, \fB\-\-verify\fR
attempt to verify the archive after writing it
.IP
.SH \fBSelect output stream:\fR
.HP
\fB\-\-ignore\-command\-error\fR ignore exit codes of children
.TP
\fB\-\-no\-ignore\-command\-error\fR
treat non\-zero exit codes of children as
error
.TP
\fB\-O\fR, \fB\-\-to\-stdout\fR
extract files to standard output
.TP
\fB\-\-to\-command\fR=\fICOMMAND\fR
pipe extracted files to another program
.IP
.SH \fBHandling of file attributes:\fR
.TP
\fB\-\-atime\-preserve\fR[=\fIMETHOD\fR]
preserve access times on dumped files, either
by restoring the times after reading
(METHOD='replace'; default) or by not setting the
times in the first place (METHOD='system')
.TP
\fB\-\-delay\-directory\-restore\fR
delay setting modification times and
permissions of extracted directories until the end
of extraction
.TP
\fB\-\-group\fR=\fINAME\fR
force NAME as group for added files
.TP
\fB\-\-mode\fR=\fICHANGES\fR
force (symbolic) mode CHANGES for added files
.TP
\fB\-\-mtime\fR=\fIDATE\-OR\-FILE\fR
set mtime for added files from DATE\-OR\-FILE
.TP
\fB\-m\fR, \fB\-\-touch\fR
don't extract file modified time
.TP
\fB\-\-no\-delay\-directory\-restore\fR
cancel the effect of \fB\-\-delay\-directory\-restore\fR
option
.TP
\fB\-\-no\-same\-owner\fR
extract files as yourself (default for ordinary
users)
.TP
\fB\-\-no\-same\-permissions\fR
apply the user's umask when extracting permissions
from the archive (default for ordinary users)
.TP
\fB\-\-numeric\-owner\fR
always use numbers for user/group names
.TP
\fB\-\-owner\fR=\fINAME\fR
force NAME as owner for added files
.TP
\fB\-p\fR, \fB\-\-preserve\-permissions\fR, \fB\-\-same\-permissions\fR
extract information about file permissions
(default for superuser)
.TP
\fB\-\-preserve\fR
same as both \fB\-p\fR and \fB\-s\fR
.TP
\fB\-\-same\-owner\fR
try extracting files with the same ownership as
exists in the archive (default for superuser)
.TP
\fB\-s\fR, \fB\-\-preserve\-order\fR, \fB\-\-same\-order\fR
sort names to extract to match archive
.IP
.SH \fBHandling of extended file attributes:\fR
.TP
\fB\-\-acls\fR
Enable the POSIX ACLs support
.TP
\fB\-\-no\-acls\fR
Disable the POSIX ACLs support
.TP
\fB\-\-no\-selinux\fR
Disable the SELinux context support
.TP
\fB\-\-no\-xattrs\fR
Disable extended attributes support
.TP
\fB\-\-selinux\fR
Enable the SELinux context support
.TP
\fB\-\-xattrs\fR
Enable extended attributes support
.TP
\fB\-\-xattrs\-exclude\fR=\fIMASK\fR
specify the exclude pattern for xattr keys
.TP
\fB\-\-xattrs\-include\fR=\fIMASK\fR
specify the include pattern for xattr keys
.IP
.SH \fBDevice selection and switching:\fR
.TP
\fB\-f\fR, \fB\-\-file\fR=\fIARCHIVE\fR
use archive file or device ARCHIVE
.TP
\fB\-\-force\-local\fR
archive file is local even if it has a colon
.TP
\fB\-F\fR, \fB\-\-info\-script\fR=\fINAME\fR, \fB\-\-new\-volume\-script\fR=\fINAME\fR
run script at end of each tape (implies \fB\-M\fR)
.TP
\fB\-L\fR, \fB\-\-tape\-length\fR=\fINUMBER\fR
change tape after writing NUMBER x 1024 bytes
.TP
\fB\-M\fR, \fB\-\-multi\-volume\fR
create/list/extract multi\-volume archive
.TP
\fB\-\-rmt\-command\fR=\fICOMMAND\fR
use given rmt COMMAND instead of rmt
.TP
\fB\-\-rsh\-command\fR=\fICOMMAND\fR
use remote COMMAND instead of rsh
.TP
\fB\-\-volno\-file\fR=\fIFILE\fR
use/update the volume number in FILE
.IP
.SH \fBDevice blocking:\fR
.TP
\fB\-b\fR, \fB\-\-blocking\-factor\fR=\fIBLOCKS\fR
BLOCKS x 512 bytes per record
.TP
\fB\-B\fR, \fB\-\-read\-full\-records\fR
reblock as we read (for 4.2BSD pipes)
.TP
\fB\-i\fR, \fB\-\-ignore\-zeros\fR
ignore zeroed blocks in archive (means EOF)
.TP
\fB\-\-record\-size\fR=\fINUMBER\fR
NUMBER of bytes per record, multiple of 512
.IP
.SH \fBArchive format selection:\fR
\fB\-H\fR, \fB\-\-format\fR=\fIFORMAT\fR
.RS
create archive of the given format
.sp
FORMAT is one of the following:
.RS
.TP
gnu
GNU tar 1.13.x format
.TP
oldgnu
GNU format as per tar <= 1.12
.TP
pax
POSIX 1003.1\-2001 (pax) format
.TP
posix
same as pax
.TP
ustar
POSIX 1003.1\-1988 (ustar) format
.TP
v7
old V7 tar format
.RE
.RE
.TP
\fB\-\-old\-archive\fR, \fB\-\-portability\fR
same as \fB\-\-format\fR=\fIv7\fR
.TP
\fB\-\-pax\-option\fR=\fIkeyword[[\fR:]=value][,keyword[[:]=value]]...
control pax keywords
.TP
\fB\-\-posix\fR
same as \fB\-\-format\fR=\fIposix\fR
.TP
\fB\-V\fR, \fB\-\-label\fR=\fITEXT\fR
create archive with volume name TEXT; at
list/extract time, use TEXT as a globbing pattern
for volume name
.IP
.SH \fBCompression options:\fR
.TP
\fB\-a\fR, \fB\-\-auto\-compress\fR
use archive suffix to determine the compression
program
.TP
\fB\-I\fR, \fB\-\-use\-compress\-program\fR=\fIPROG\fR
filter through PROG (must accept \fB\-d\fR)
.TP
\fB\-j\fR, \fB\-\-bzip2\fR
filter the archive through bzip2
.TP
\fB\-J\fR, \fB\-\-xz\fR
filter the archive through xz
.TP
\fB\-\-lzip\fR
filter the archive through lzip
.TP
\fB\-\-lzma\fR
filter the archive through lzma
.HP
\fB\-\-lzop\fR
.TP
\fB\-\-no\-auto\-compress\fR
do not use archive suffix to determine the
compression program
.TP
\fB\-z\fR, \fB\-\-gzip\fR, \fB\-\-gunzip\fR, \fB\-\-ungzip\fR
filter the archive through gzip
.TP
\fB\-Z\fR, \fB\-\-compress\fR, \fB\-\-uncompress\fR
filter the archive through compress
.TP
\fBNote: You might need to install external program (lzip/ncompress/lzma...) to use some of these compression options\fB
.IP
.SH \fBLocal file selection:\fR
.TP
\fB\-\-add\-file\fR=\fIFILE\fR
add given FILE to the archive (useful if its name
starts with a dash)
.TP
\fB\-\-backup\fR[=\fICONTROL\fR]
backup before removal, choose version CONTROL
.TP
\fB\-C\fR, \fB\-\-directory\fR=\fIDIR\fR
change to directory DIR
.TP
\fB\-\-exclude\fR=\fIPATTERN\fR
exclude files, given as a PATTERN
.TP
\fB\-\-exclude\-backups\fR
exclude backup and lock files
.TP
\fB\-\-exclude\-caches\fR
exclude contents of directories containing
CACHEDIR.TAG, except for the tag file itself
.TP
\fB\-\-exclude\-caches\-all\fR
exclude directories containing CACHEDIR.TAG
.TP
\fB\-\-exclude\-caches\-under\fR exclude everything under directories containing
CACHEDIR.TAG
.TP
\fB\-\-exclude\-tag\fR=\fIFILE\fR
exclude contents of directories containing FILE,
except for FILE itself
.HP
\fB\-\-exclude\-tag\-all\fR=\fIFILE\fR exclude directories containing FILE
.TP
\fB\-\-exclude\-tag\-under\fR=\fIFILE\fR
exclude everything under directories
containing FILE
.TP
\fB\-\-exclude\-vcs\fR
exclude version control system directories
.TP
\fB\-h\fR, \fB\-\-dereference\fR
follow symlinks; archive and dump the files they
point to
.TP
\fB\-\-hard\-dereference\fR
follow hard links; archive and dump the files they
refer to
.TP
\fB\-K\fR, \fB\-\-starting\-file\fR=\fIMEMBER\-NAME\fR
begin at member MEMBER\-NAME in the archive
.TP
\fB\-\-newer\-mtime\fR=\fIDATE\fR
compare date and time when data changed only
.TP
\fB\-\-no\-null\fR
disable the effect of the previous \fB\-\-null\fR option
.TP
\fB\-\-no\-recursion\fR
avoid descending automatically in directories
.TP
\fB\-\-no\-unquote\fR
do not unquote filenames read with \fB\-T\fR
.HP
\fB\-\-null\fR \fB\-T\fR reads null\-terminated names, disable \fB\-C\fR
.TP
\fB\-N\fR, \fB\-\-newer\fR=\fIDATE\-OR\-FILE\fR, \fB\-\-after\-date\fR=\fIDATE\-OR\-FILE\fR
only store files newer than DATE\-OR\-FILE
.TP
\fB\-\-one\-file\-system\fR
stay in local file system when creating archive
.TP
\fB\-P\fR, \fB\-\-absolute\-names\fR
don't strip leading `/'s from file names
.TP
\fB\-\-recursion\fR
recurse into directories (default)
.TP
\fB\-\-suffix\fR=\fISTRING\fR
backup before removal, override usual suffix ('~'
unless overridden by environment variable
SIMPLE_BACKUP_SUFFIX)
.TP
\fB\-T\fR, \fB\-\-files\-from\fR=\fIFILE\fR
get names to extract or create from FILE
.TP
\fB\-\-unquote\fR
unquote filenames read with \fB\-T\fR (default)
.TP
\fB\-X\fR, \fB\-\-exclude\-from\fR=\fIFILE\fR
exclude patterns listed in FILE
.IP
.SH \fBFile name transformations:\fR
.TP
\fB\-\-strip\-components\fR=\fINUMBER\fR
strip NUMBER leading components from file
names on extraction
.TP
\fB\-\-transform\fR=\fIEXPRESSION\fR, \fB\-\-xform\fR=\fIEXPRESSION\fR
use sed replace EXPRESSION to transform file
names
.IP
File name matching options (affect both exclude and include patterns):
.TP
\fB\-\-anchored\fR
patterns match file name start
.TP
\fB\-\-ignore\-case\fR
ignore case
.TP
\fB\-\-no\-anchored\fR
patterns match after any `/' (default for
exclusion)
.TP
\fB\-\-no\-ignore\-case\fR
case sensitive matching (default)
.TP
\fB\-\-no\-wildcards\fR
verbatim string matching
.TP
\fB\-\-no\-wildcards\-match\-slash\fR
wildcards do not match `/'
.TP
\fB\-\-wildcards\fR
use wildcards (default)
.TP
\fB\-\-wildcards\-match\-slash\fR
wildcards match `/' (default for exclusion)
.IP
.SH \fBInformative output:\fR
.TP
\fB\-\-checkpoint\fR[=\fINUMBER\fR]
display progress messages every NUMBERth record
(default 10)
.TP
\fB\-\-checkpoint\-action\fR=\fIACTION\fR
execute ACTION on each checkpoint
.TP
\fB\-\-full\-time\fR
print file time to its full resolution
.TP
\fB\-\-index\-file\fR=\fIFILE\fR
send verbose output to FILE
.TP
\fB\-l\fR, \fB\-\-check\-links\fR
print a message if not all links are dumped
.TP
\fB\-\-no\-quote\-chars\fR=\fISTRING\fR
disable quoting for characters from STRING
.TP
\fB\-\-quote\-chars\fR=\fISTRING\fR
additionally quote characters from STRING
.TP
\fB\-\-quoting\-style\fR=\fISTYLE\fR
set name quoting style; see below for valid STYLE
values
.TP
\fB\-R\fR, \fB\-\-block\-number\fR
show block number within archive with each
message
.TP
\fB\-\-show\-defaults\fR
show tar defaults
.TP
\fB\-\-show\-omitted\-dirs\fR
when listing or extracting, list each directory
that does not match search criteria
.TP
\fB\-\-show\-transformed\-names\fR, \fB\-\-show\-stored\-names\fR
show file or archive names after transformation
.TP
\fB\-\-totals\fR[=\fISIGNAL\fR]
print total bytes after processing the archive;
with an argument \- print total bytes when this
SIGNAL is delivered; Allowed signals are: SIGHUP,
SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names
without SIG prefix are also accepted
.TP
\fB\-\-utc\fR
print file modification dates in UTC
.TP
\fB\-v\fR, \fB\-\-verbose\fR
verbosely list files processed
.TP
\fB\-\-warning\fR=\fIKEYWORD\fR
warning control
.TP
\fB\-w\fR, \fB\-\-interactive\fR, \fB\-\-confirmation\fR
ask for confirmation for every action
.IP
.SH \fBCompatibility options:\fR
.TP
\fB\-o\fR
when creating, same as \fB\-\-old\-archive\fR; when
extracting, same as \fB\-\-no\-same\-owner\fR
.IP
.SH \fBOther options:\fR
.TP
\-?, \fB\-\-help\fR
give this help list
.TP
\fB\-\-restrict\fR
disable use of some potentially harmful options
.TP
\fB\-\-usage\fR
give a short usage message
.TP
\fB\-\-version\fR
print program version
.PP
.PP
Mandatory or optional arguments to long options are also mandatory or optional
for any corresponding short options.
.PP
The backup suffix is `~', unless set with \fB\-\-suffix\fR or SIMPLE_BACKUP_SUFFIX.
The version control may be set with \fB\-\-backup\fR or VERSION_CONTROL, values are:
.TP
none, off
never make backups
.TP
t, numbered
make numbered backups
.TP
nil, existing
numbered if numbered backups exist, simple otherwise
.TP
never, simple
always make simple backups
.PP
Valid arguments for the \fB\-\-quoting\-style\fR option are:
.IP
literal
shell
shell\-always
c
c\-maybe
escape
locale
clocale
.PP
.SH AUTHOR
Written by John Gilmore and Jay Fenlason.
.SH "REPORTING BUGS"
Report bugs to <bug\-tar@gnu.org>.
.SH COPYRIGHT
Copyright \(co 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
.br
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

956
SPECS/tar.spec

@ -0,0 +1,956 @@
%if %{?WITH_SELINUX:0}%{!?WITH_SELINUX:1}
%global WITH_SELINUX 1
%endif
Summary: A GNU file archiving program
Name: tar
Epoch: 2
Version: 1.26
Release: 34%{?dist}
License: GPLv3+
Group: Applications/Archiving
URL: http://www.gnu.org/software/tar/

Source0: ftp://ftp.gnu.org/pub/gnu/tar/tar-%{version}.tar.xz
Source1: ftp://ftp.gnu.org/pub/gnu/tar/tar-%{version}.tar.xz.sig
# Manpage for tar and gtar, a bit modified help2man generated manpage
Source2: tar.1

# Stop issuing lone zero block warnings.
# ~> https://bugzilla.redhat.com/show_bug.cgi?id=135601
# ~> downstream
Patch1: tar-1.14-loneZeroWarning.patch

# Fix extracting sparse files to a file system like vfat, when ftruncate may fail
# to grow the size of a file.
# ~> #179507,
# ~> http://lists.gnu.org/archive/html/bug-tar/2006-02/msg00000.html
# ~> still downtream (do we need this now? ftruncate & vfat works is now OK)
Patch2: tar-1.15.1-vfatTruncate.patch

# Change inclusion defaults of tar to
# "--wildcards --anchored --wildcards-match-slash" for compatibility reasons.
# ~> #206841
# ~> downstream (compatibility)
Patch3: tar-1.17-wildcards.patch

# Ignore errors from setting utime() for source file on read-only file-system.
# ~> #500742
# ~> http://lists.gnu.org/archive/html/bug-tar/2009-06/msg00016.html
# ~> still downstream
Patch4: tar-1.22-atime-rofs.patch

# The --old-archive option was not working.
# ~> #594044
# ~> http://lists.gnu.org/archive/html/bug-tar/2010-05/msg00015.html
# ~> upstream (2a61a37)
Patch5: tar-1.23-oldarchive.patch

# Fix for bad cooperation of -C and -u options.
# ~> #688567
# ~> http://lists.gnu.org/archive/html/bug-tar/2012-02/msg00007.html
# ~> still downstream
Patch6: tar-1.26-update-with-change-directory.patch

# Fix rawhide build failure with undefined gets.
# ~> upstream (gnulib)
Patch7: tar-1.26-stdio.in.patch

# Fix regression with --keep-old-files option.
# ~> #799252
# ~> http://lists.gnu.org/archive/html/bug-tar/2011-11/msg00043.html
# ~> upstream (7a5a3708c)
Patch8: tar-1.26-add-skip-old-files-option.patch

# Prepare included gnulib library for SELinux support.
# -> Related to the next patch.
Patch9: tar-1.26-selinux-gnulib.patch

# Add support for extended attributes, SELinux and POSIX ACLs.
# ~> Original implementation #200925
# ~> http://lists.gnu.org/archive/html/bug-tar/2012-08/msg00012.html
# ~> upstream (b997c90f9, 696338043, d36f5a3cc, 085cace18, up-to ~> 83701a590)
Patch10: tar-1.26-xattrs.patch

# Fix problem with bit UIDs/GIDs (> 2^21) and --posix format.
# ~> #913406
# ~> upstream (it is part of df7b55a8f6354e)
Patch11: tar-1.26-posix-biguid.patch

# Allow store sparse files of effective size >8GB into pax archives
# ~> #516309
# ~> http://lists.gnu.org/archive/html/bug-tar/2013-01/msg00001.html
# ~> already upstream (2f6c03cba)
Patch12: tar-1.26-pax-big-sparse-files.patch

# Fix: Allow extracting single volume in a multi-volume archive
# ~> #919897
# ~> http://lists.gnu.org/archive/html/bug-tar/2013-03/msg00002.html
# ~> upstream (beca89bc)
Patch13: tar-1.26-allow-extract-single-volume.patch

# Do not print xattrs/selinux/acls when --no-xattrs/--no-acls/--no-selinux
# options are used during -tvv output. (TODO: merge this with xattrs patch
# once becomes upstream)
# ~> downstream (yet)
# ~> proposal: http://lists.gnu.org/archive/html/bug-tar/2013-05/msg00020.html
Patch14: tar-1.26-xattrs-printing.patch

# Use a birthtime instead of ctime.
# ~> upstream (189e43 & 49bd10)
# ~> http://lists.gnu.org/archive/html/bug-tar/2011-06/msg00000.html
# ~> http://lists.gnu.org/archive/html/bug-tar/2013-05/msg00022.html
Patch15: tar-1.26-fix-symlink-eating-bug.patch

# Add documentation which was not yet pushed upstream
# ~> downstream
# ~> #996753
Patch16: tar-1.26-docu-xattrs.patch

# The --xattrs-include or --xattrs-exclude options should imply --xattrs.
# ~> still downstream
# http://lists.gnu.org/archive/html/bug-tar/2013-05/msg00020.html
# ~> #965969
Patch17: tar-1.26-xattrs-include-implies-xattrs.patch

# If the 'st_size' != 0 && count(blocks) == 0 && st_size < size(block), this
# does not necessarily must be a sparse file.
# ~> upstream (paxutils): 986382a0bb3261
# ~> #1024095, #1024268
Patch18: tar-1.27-sparse-stat-detection.patch

# Don't add "false" default acls when during extraction (#1220890)
# ~> #1220890
Patch19: tar-1.26-default-acls.patch

# Make sure getfilecon's wrapper set's freed pointer to NULL to avoid double
# free later in client code.
# ~> upstream commit (gnulib): b6b3ed1fa4c
# ~> rhbz#1347396
Patch20: tar-1.26-dont-segfault-with-disabled-selinux.patch

# Restore incremental backups correctly, files were not being removed
# ~> upstream commits: 738fb9c2f44 b6979c7278e f86e0605d0e
# ~> rhbz#1184697
Patch21: tar-1.26-restore-incremental-backups.patch

# Fix the behavior of tar when --directory option is used together with
# --remove-files.
# ~> upstream commits: e3d28d84bda b41b004638f f7077dd38b0 d3fd92c6fb2
# d28eee6b4f1 74ce228f6df 3125d311e17 3de5db2a151 fc58a8bd984
# fcde08534bd e6fcc73efa7
# ~> rhbz#1319820
Patch22: tar-1.26-directory_with_remove-files.patch

# Repair the ignorance of --xattrs-exclude/include options
# ~> upstream: bb6ddd8e04c and c81a0853bb8
# ~> rhbz#1341786
Patch23: tar-1.26-xattrs-exclude-include-repair.patch

# Intorduce new option "--keep-directory-symlink", backported from version 1.27
# ~> upstream: 2c06a809180
# ~> rhbz#1350640
Patch24: tar-1.26-keep-directory-symlink.patch

# Fix non-determinism in archive-type-heuristic
# ~> upstream: 1847ec67cec + 1e8b786e651
# ~> rhbz#1437297
Patch25: tar-1.26-non-deterministic-archive-detection.patch

# Avoid tar to hang with --extract --xatrrs and --skip-old-files options
# ~> upstream: 597b0ae509 and ca9399d4e
# -> proposed: https://www.mail-archive.com/bug-tar@gnu.org/msg05229.html
# ~> rhbz#1408168
Patch26: tar-1.26-xattrs-skip-old-files-hangs.patch

# List sparse files of 8GB+ properly, without failure.
# ~> upstream: 586a6263e9d97 ec94fbdf458ad
# ~> paxutils-upstream: 45af1632aa64a 58b8ac114790e
Patch27: tar-1.26-large-sparse-file-listing.patch

# Document (and test) --keep-directory-option
# ~> upstream: d06126f814563b01e598b85a8cc233604a2948f2
# ~> rhbz#1504146
Patch28: tar-1.26-keep-directory-symlink-doc-and-test.patch

# Silence gcc warnings
# ~> upstream tar: 17f99bc6f, 5bb0433
# ~> upstream paxutils: 0b3d84a0
Patch999: tar-1.26-silence-gcc.patch

# run "make check" by default
%bcond_without check

BuildRequires: autoconf automake texinfo gettext libacl-devel rsh

%if %{with check}
# cover needs of tar's testsuite
BuildRequires: attr acl policycoreutils
%endif

%if %{WITH_SELINUX}
BuildRequires: libselinux-devel
%endif
Provides: bundled(gnulib)
Provides: /bin/tar
Provides: /bin/gtar
Requires(post): /sbin/install-info
Requires(preun): /sbin/install-info

%description
The GNU tar program saves many files together in one archive and can
restore individual files (or all of the files) from that archive. Tar
can also be used to add supplemental files to an archive and to update
or list files in the archive. Tar includes multivolume support,
automatic archive compression/decompression, the ability to perform
remote archives, and the ability to perform incremental and full
backups.

If you want to use tar for remote backups, you also need to install
the rmt package on the remote box.

%prep
%setup -q
%patch1 -p1 -b .loneZeroWarning
%patch2 -p1 -b .vfatTruncate
%patch3 -p1 -b .wildcards
%patch4 -p1 -b .rofs
%patch5 -p1 -b .oldarchive
%patch6 -p1 -b .update_and_changedir
%patch7 -p1 -b .gets %{?_rawbuild}
%patch8 -p1 -b .skip-old-files
%patch9 -p1 -b .selinux-gnulib-prep
%patch10 -p1 -b .xattrs-selinux-acls
%patch11 -p1 -b .big_uid_gid
%patch12 -p1 -b .pax-sparse-big-files
%patch13 -p1 -b .extract-single-volume
%patch14 -p1 -b .print-xattrs-fix
%patch15 -p1 -b .birthtime
%patch16 -p1 -b .xattrs-documentation
%patch17 -p1 -b .xattrs-if-xattrs-include
%patch18 -p1 -b .sparse-stat-detection
%patch19 -p1 -b .default-acls
%patch20 -p1 -b .disabled-selinux
%patch21 -p1 -b .incremental-backups
%patch22 -p1 -b .directory
%patch23 -p1 -b .xattrs-exclude-include
%patch24 -p1 -b .keep-directory-symlink
%patch25 -p1 -b .fix-archive-detection-heuristic
%patch26 -p1 -b .extract-xattrs-hangs
%patch27 -p1 -b .large-sparse-file-listing
%patch28 -p1 -b .test-and-doc-for-keep-dir-symlink
%patch999 -p1 -b .silence-gcc

autoreconf -v

%build
%if ! %{WITH_SELINUX}
%global CONFIGURE_SELINUX --without-selinux
%endif

%configure %{?CONFIGURE_SELINUX} \
DEFAULT_RMT_DIR=%{_sysconfdir} \
RSH=/usr/bin/ssh
make

%install
make DESTDIR=$RPM_BUILD_ROOT install

ln -s tar $RPM_BUILD_ROOT%{_bindir}/gtar
rm -f $RPM_BUILD_ROOT/%{_infodir}/dir
mkdir -p $RPM_BUILD_ROOT%{_mandir}/man1
install -c -p -m 0644 %{SOURCE2} $RPM_BUILD_ROOT%{_mandir}/man1
ln -s tar.1.gz $RPM_BUILD_ROOT%{_mandir}/man1/gtar.1

# XXX Nuke unpackaged files.
rm -f $RPM_BUILD_ROOT%{_sysconfdir}/rmt

%find_lang %name

%check
%if %{with check}
rm -f $RPM_BUILD_ROOT/test/testsuite
make check || TESTSUITEFLAGS=-v make check
%endif

%clean
rm -rf $RPM_BUILD_ROOT

%post
if [ -f %{_infodir}/tar.info.gz ]; then
/sbin/install-info %{_infodir}/tar.info.gz %{_infodir}/dir || :
fi

%preun
if [ $1 = 0 ]; then
if [ -f %{_infodir}/tar.info.gz ]; then
/sbin/install-info --delete %{_infodir}/tar.info.gz %{_infodir}/dir || :
fi
fi

%files -f %{name}.lang
%doc AUTHORS ChangeLog ChangeLog.1 COPYING NEWS README THANKS TODO
%{_bindir}/tar
%{_bindir}/gtar
%{_mandir}/man1/tar.1*
%{_mandir}/man1/gtar.1*
%{_infodir}/tar.info*

%changelog
* Thu Oct 19 2017 Pavel Raiskup <praiskup@redhat.com> - 1.26-34
- document --keep-directory-symlink in manual page (rhbz#1504146)

* Thu Sep 07 2017 Pavel Raiskup <praiskup@redhat.com> - 1.26-33
- extract: deterministic archive type detection (rhbz#1437297)
- avoid hang when extracting with --xattrs --skip-old-files (rhbz#1408168)
- fix listing of large sparse members (rhbz#1347229)

* Tue Feb 28 2017 Tomas Repik <trepik@redhat.com> - 2:1.26-32
- restore incremental backups correctly, files were not being removed (rhbz#1184697)
- fix the behavior of tar when --directory option is used together with
--remove-files
- repair the ignorance of --xattrs-exclude/include options (rhbz#1341786)
- Intorduce new option '--keep-directory-symlink'

* Mon Jun 20 2016 Pavel Raiskup <praiskup@redhat.com> - 1.26-31
- avoid double free in selinux code (rhbz#1347396)

* Thu Jun 04 2015 Pavel Raiskup <praiskup@redhat.com> - 1.26-30
- don't mistakenly set default ACLs (#1220890)

* Fri Jan 24 2014 Daniel Mach <dmach@redhat.com> - 2:1.26-29
- Mass rebuild 2014-01-24

* Fri Dec 27 2013 Daniel Mach <dmach@redhat.com> - 2:1.26-28
- Mass rebuild 2013-12-27

* Mon Nov 18 2013 Pavel Raiskup <praiskup@redhat.com> - 1.26-27
- sparse file detection based on fstat() fix (#1024268)

* Mon Sep 09 2013 Pavel Raiskup <praiskup@redhat.com> - 1.26-26
- the --xattrs-include implies --xattrs now (#965969)

* Wed Aug 14 2013 Pavel Raiskup <praiskup@redhat.com> - 1.26-26
- add documenation for xattrs-like options (#996753)

* Thu Jun 20 2013 Pavel Raiskup <praiskup@redhat.com> - 1.26-25
- the /etc/rmt seems to be the best place where to look for rmt binary (see the
commit message in Fedora's cpio.git for more info)

* Tue Jun 04 2013 Pavel Raiskup <praiskup@redhat.com> - 2:1.26-24
- fix "symlink eating" bug (already fixed in upstream git)

* Thu May 30 2013 Pavel Raiskup <praiskup@redhat.com> - 2:1.26-23
- use /usr/bin/ssh as the default remote shell binary (#969015)
- do not verbose-print xattrs when --no-xattrs option is used
- do not override the config.{guess,sub} twice, this is already done by the
redhat-rpm-config package (#951442)

* Tue May 28 2013 Pavel Raiskup <praiskup@redhat.com> - 2:1.26-22
- again search for 'rmt' binary in %%{_sbindir} on target host

* Tue Mar 26 2013 Pavel Raiskup <praiskup@redhat.com> - 2:1.26-21
- enable build for arm64 (#926610)
- silence gcc warnings (lint fixes without risk from upstream) for RPMDiff

* Tue Mar 19 2013 Pavel Raiskup <praiskup@redhat.com> - 2:1.26-20
- allow extracting single volume from multi-volume archive (#919897)
- usrmove: /bin/tar ~> /usr/bin/tar, selinux handling edit

* Fri Mar 01 2013 Pavel Raiskup <praiskup@redhat.com> - 2:1.26-19
- fix creating sparse pax archives containing files of effective
size >8GB (#516309)
- silence rpmlint (fix bad dates in changelog based on git log dates)

* Wed Feb 20 2013 Pavel Raiskup <praiskup@redhat.com> - 2:1.26-18
- fix problems with big uids/gids and pax format (> 2^21) (#913406)

* Mon Feb 18 2013 Pavel Raiskup <praiskup@redhat.com> - 2:1.26-17
- add possibility to 'rpmbuild' without %%check phase
- make the autoreconf phase verbose
- re-create older patches (avoid offset warnings during patching)
- remove patches which we don't need now (xattrs - will be updated, sigpipe -
test should work now, partial revert of *at() conversion was done because of
incompatible xattr patch)
- add upstream up2date xattr patch

* Fri Feb 01 2013 Pavel Raiskup <praiskup@redhat.com> - 2:1.26-16
- make the info documentation more visible in manpage (#903666)
- sync tar.1 manpage with actual --help output (e.g. added --skip-old-files)
- add the last_help2man_run file to git repo to allow more easily find changes
in --help in future
- make the DEFAULTS section to be more visible in man page
- verbose 'make check' only when some fail happened (append to koji build.log)

* Thu Nov 29 2012 Ondrej Vasik <ovasik@redhat.com> - 2:1.26-15
- add missing --full-time option to manpage

* Thu Oct 18 2012 Pavel Raiskup <praiskup@redhat.com> - 2:1.26-14
- fix bad behaviour of --keep-old-files and add --skip-old-files option
(#799252)

* Wed Oct 10 2012 Pavel Raiskup <praiskup@redhat.com> 2:1.26-13
- fix badly written macro for building --without-selinux
- allow to build tar in difference CoverityScan by forcing the '.gets' patch to
be applied even in the run without patches

* Fri Oct 05 2012 Pavel Raiskup <praiskup@redhat.com> 2:1.26-12
- repair the xattr-gnulib-prepare patch to allow build tar without SELinux
support
- fedora-review compliance -> remove trailing white-spaces, remove macro from
comment, remove BR of gawk;coreutils;gzip that should be covered automatically
by minimum build environment, do not `rm -rf' buildroot at the beginning of
install phase (needed only in EPEL), remove BuildRoot definition, remove
defattr macro, s/define/global/
- do not use ${VAR} syntax for bash variables, use just $VAR

* Wed Aug 22 2012 Pavel Raiskup <praiskup@redhat.com> 2:1.26-11
- fix manpage to reflect #850291 related commit

* Tue Aug 21 2012 Pavel Raiskup <praiskup@redhat.com> 2:1.26-10
- prepare Gnulib for new xattrs (#850291)
- new version of RH xattrs patch (#850291)
- enable verbose mode in testsuite to allow better debugging on error

* Sat Jul 21 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 2:1.26-9
- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild

* Thu Jul 12 2012 Pavel Raiskup <praiskup@redhat.com> 2:1.26-8
- force the fchown() be called before xattrs_set() (#771927)

* Sat Jun 16 2012 Ondrej Vasik <ovasik@redhat.com> 2:1.26-7
- store&restore security.capability extended attributes category
(#771927)
- fix build failure with undefined gets

* Tue May 15 2012 Ondrej Vasik <ovasik@redhat.com> 2:1.26-6
- add virtual provides for bundled(gnulib) copylib (#821790)

* Thu Apr 05 2012 Pavel Raiskup <praiskup@redhat.com> 2:1.26-5
- fix for bad cooperation of the '-C' (change directory) and '-u' (update
package) options (#688567)

* Sat Jan 14 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 2:1.26-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild

* Sun Oct 2 2011 Ville Skyttä <ville.skytta@iki.fi> - 2:1.26-3
- Man page heading formatting fixes.

* Mon Sep 26 2011 Kamil Dudka <kdudka@redhat.com> 2:1.26-2
- restore basic functionality of --acl, --selinux, and --xattr (#717684)

* Sat Mar 12 2011 Ondrej Vasik <ovasik@redhat.com> 2:1.26-1
- new upstream release 1.26
* Wed Feb 09 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 2:1.25-6
- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild

* Thu Jan 20 2011 Ondrej Vasik <ovasik@redhat.com> 2:1.25-5
- drop unnecessary hard dependency on info package(#671157)

* Mon Jan 03 2011 Ondrej Vasik <ovasik@redhat.com> 2:1.25-4
- mention that some compression options might not work if
the external program is not available(#666755)

* Wed Dec 08 2010 Kamil Dudka <kdudka@redhat.com> 2:1.25-3
- correctly store long sparse file names in PAX archives (#656834)

* Tue Nov 23 2010 Ondrej Vasik <ovasik@redhat.com> 2:1.25-2
- fix issue with --one-file-system and --listed-incremental
(#654718)

* Mon Nov 08 2010 Ondrej Vasik <ovasik@redhat.com> 2:1.25-1
- new upstream release 1.25

* Mon Oct 25 2010 Ondrej Vasik <ovasik@redhat.com> 2:1.24-1
- new upstream release 1.24, use .xz archive

* Wed Sep 29 2010 jkeating - 2:1.23-8
- Rebuilt for gcc bug 634757

* Fri Sep 24 2010 Kamil Dudka <kdudka@redhat.com> 2:1.23-7
- match non-stripped file names (#637085)

* Mon Sep 20 2010 Kamil Dudka <kdudka@redhat.com> 2:1.23-6
- fix exclusion of long file names with --xattrs (#634866)
- do not crash with --listed-incremental (#635318)

* Mon Aug 16 2010 Ondrej Vasik <ovasik@redhat.com> 2:1.23-5
- add support for security.NTACL xattrs (#621215)

* Tue Jun 01 2010 Ondrej Vasik <ovasik@redhat.com> 2:1.23-4
- recognize old-archive/portability options(#594044)

* Wed Apr 07 2010 Ondrej Vasik <ovasik@redhat.com> 2:1.23-3
- allow storing of extended attributes for fifo and block
or character devices files(#573147)

* Mon Mar 15 2010 Ondrej Vasik <ovasik@redhat.com> 2:1.23-2
- update help2maned manpage

* Fri Mar 12 2010 Ondrej Vasik <ovasik@redhat.com> 2:1.23-1
- new upstream release 1.23, remove applied patches

* Wed Mar 10 2010 Ondrej Vasik <ovasik@redhat.com> 2:1.22-17
- CVE-2010-0624 tar, cpio: Heap-based buffer overflow
by expanding a specially-crafted archive (#572149)
- realloc within check_exclusion_tags() caused invalid write
(#570591)
- not closing file descriptors for excluded files/dirs with
exlude-tag... options could cause descriptor exhaustion
(#570591)

* Sat Feb 20 2010 Kamil Dudka <kdudka@redhat.com> 2:1.22-16
- support for "lustre.*" extended attributes (#561855)

* Thu Feb 04 2010 Ondrej Vasik <ovasik@redhat.com> 2:1.22-15
- fix segfault with corrupted metadata in code_ns_fraction
(#531441)

* Wed Feb 03 2010 Kamil Dudka <kdudka@redhat.com> 2:1.22-14
- allow also build with SELinux support

* Mon Feb 01 2010 Ondrej Vasik <ovasik@redhat.com> 2:1.22-13
- allow build without SELinux support(#556679)

* Tue Jan 05 2010 Ondrej Vasik <ovasik@redhat.com> 2:1.22-12
- do not fail with POSIX 2008 glibc futimens() (#552320)
- temporarily disable fix for #531441, causing stack smashing
with newer glibc(#551206)

* Tue Dec 08 2009 Ondrej Vasik <ovasik@redhat.com> 2:1.22-11
- fix segfault with corrupted metadata in code_ns_fraction
(#531441)
- commented patches and sources

* Fri Nov 27 2009 Ondrej Vasik <ovasik@redhat.com> 2:1.22-10
- store xattrs for symlinks (#525992) - by Kamil Dudka
- update tar(1) manpage (#539787)
- fix memory leak in xheader (#518079)

* Wed Nov 18 2009 Kamil Dudka <kdudka@redhat.com> 2:1.22-9
- store SELinux context for symlinks (#525992)

* Thu Aug 27 2009 Ondrej Vasik <ovasik@redhat.com> 2:1.22-8
- provide symlink manpage for gtar

* Thu Aug 06 2009 Ondrej Vasik <ovasik@redhat.com> 2:1.22-7
- do process install-info only without --excludedocs(#515923)

* Sun Jul 26 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 2:1.22-6
- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild

* Thu Jul 16 2009 Ondrej Vasik <ovasik@redhat.com> 2:1.22-5
- Fix restoring of directory default acls(#511145)
- Do not patch generated autotools files

* Thu Jun 25 2009 Ondrej Vasik <ovasik@redhat.com> 2:1.22-4
- Report record size only if the archive refers to a device
(#487760)
- Do not sigabrt with new gcc/glibc because of writing to
struct members of gnutar header at once via strcpy

* Fri May 15 2009 Ondrej Vasik <ovasik@redhat.com> 2:1.22-3
- ignore errors from setting utime() for source file
on read-only filesystem (#500742)

* Fri Mar 06 2009 Kamil Dudka <kdudka@redhat.com> 2:1.22-2
- improve tar-1.14-loneZeroWarning.patch (#487315)

* Mon Mar 02 2009 Ondrej Vasik <ovasik@redhat.com> 2:1.22-1
- New upstream release 1.22, removed applied patch

* Wed Feb 25 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 2:1.21-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild

* Mon Jan 05 2009 Ondrej Vasik <ovasik@redhat.com> 2:1.21-1
- New upstream release 1.21, removed applied patches
- add support for -I option, fix testsuite failure

* Thu Dec 11 2008 Ondrej Vasik <ovasik@redhat.com> 2:1.20-6
- add BuildRequires for rsh (#475950)

* Fri Nov 21 2008 Ondrej Vasik <ovasik@redhat.com> 2:1.20-5
- fix off-by-one errors in xattrs patch (#472355)

* Mon Nov 10 2008 Kamil Dudka <kdudka@redhat.com> 2:1.20-4
- fixed bug #465803: labels with --multi-volume (upstream patch)

* Fri Oct 10 2008 Ondrej Vasik <ovasik@redhat.com> 2:1.20-3
- Fixed wrong documentation for xattrs options (#466517)
- fixed bug with null file terminator and change dirs
(upstream)

* Fri Aug 29 2008 Ondrej Vasik <ovasik@redhat.com> 2:1.20-2
- patch fuzz clean up

* Mon May 26 2008 Ondrej Vasik <ovasik@redhat.com> 2:1.20-1
- new upstream release 1.20 (lzma support, few new options
and bugfixes)
- heavily modified xattrs patches(as tar-1.20 now uses automake
1.10.1)

* Tue Feb 12 2008 Radek Brich <rbrich@redhat.com> 2:1.19-3
- do not print getfilecon/setfilecon warnings when SELinux is disabled
or SELinux data are not available (bz#431879)
- fix for GCC 4.3

* Mon Jan 21 2008 Radek Brich <rbrich@redhat.com> 2:1.19-2
- fix errors in man page
* fix definition of --occurrence (bz#416661, patch by Jonathan Wakely)
* update meaning of -l: it has changed from --one-filesystem
to --check-links (bz#426717)
- update license tag, tar 1.19 is GPLv3+

* Mon Dec 17 2007 Radek Brich <rbrich@redhat.com> 2:1.19-1
- upgrade to 1.19
- updated xattrs patch, removed 3 upstream patches

* Wed Dec 12 2007 Radek Brich <rbrich@redhat.com> 2:1.17-5
- fix (non)detection of xattrs
- move configure stuff from -xattrs patch to -xattrs-conf,
so the original patch could be easily read
- fix -xattrs patch to work with zero length files and show
warnings when xattrs not available (fixes by James Antill)
- possible corruption (#408621) - add warning to man page
for now, may be actually fixed later, depending on upstream

* Tue Oct 23 2007 Radek Brich <rbrich@redhat.com> 2:1.17-4
- upstream patch for CVE-2007-4476
(tar stack crashing in safer_name_suffix)

* Tue Aug 28 2007 Radek Brich <rbrich@redhat.com> 2:1.17-3
- gawk build dependency

* Tue Aug 28 2007 Radek Brich <rbrich@redhat.com> 2:1.17-2
- updated license tag
- fixed CVE-2007-4131 tar directory traversal vulnerability (#251921)

* Thu Jun 28 2007 Radek Brich <rbrich@redhat.com> 2:1.17-1
- new upstream version
- patch for wildcards (#206841), restoring old behavior
- patch for testsuite
- update -xattrs patch
- drop 13 obsolete patches

* Tue Feb 06 2007 Peter Vrabec <pvrabec@redhat.com> 2:1.15.1-26
- fix spec file to meet Fedora standards (#226478)

* Mon Jan 22 2007 Peter Vrabec <pvrabec@redhat.com> 2:1.15.1-25
- fix non-failsafe install-info use in scriptlets (#223718)

* Wed Jan 03 2007 Peter Vrabec <pvrabec@redhat.com> 2:1.15.1-24
- supply tar man page (#219375)

* Tue Dec 12 2006 Florian La Roche <laroche@redhat.com> 2:1.15.1-23
- fix CVE-2006-6097 GNU tar directory traversal (#216937)

* Sun Dec 10 2006 Peter Vrabec <pvrabec@redhat.com> 2:1.15.1-22
- fix some rpmlint spec file issues

* Wed Oct 25 2006 Peter Vrabec <pvrabec@redhat.com> 2:1.15.1-21
- build with dist-tag

* Mon Oct 09 2006 Peter Vrabec <pvrabec@redhat.com> 2:1.15.1-20
- another fix of tar-1.15.1-xattrs.patch from James Antill

* Wed Oct 04 2006 Peter Vrabec <pvrabec@redhat.com> 2:1.15.1-19
- another fix of tar-1.15.1-xattrs.patch from James Antill

* Sun Oct 01 2006 Peter Vrabec <pvrabec@redhat.com> 2:1.15.1-18
- fix tar-1.15.1-xattrs.patch (#208701)

* Tue Sep 19 2006 Peter Vrabec <pvrabec@redhat.com> 2:1.15.1-17
- start new epoch, downgrade to solid stable 1.15.1-16 (#206979),
- all patches are backported

* Tue Sep 19 2006 Peter Vrabec <pvrabec@redhat.com> 1.15.91-2
- apply patches, which were forgotten during upgrade

* Wed Sep 13 2006 Peter Vrabec <pvrabec@redhat.com> 1.15.91-1
- upgrade, which also fix incremental backup (#206121)

* Fri Sep 08 2006 Peter Vrabec <pvrabec@redhat.com> 1.15.90-7
- fix tar-debuginfo package (#205615)

* Thu Aug 10 2006 Peter Vrabec <pvrabec@redhat.com> 1.15.90-6
- add xattr support (#200925), patch from james.antill@redhat.com

* Mon Jul 24 2006 Peter Vrabec <pvrabec@redhat.com> 1.15.90-5
- fix incompatibilities in appending files to the end
of an archive (#199515)

* Tue Jul 18 2006 Peter Vrabec <pvrabec@redhat.com> 1.15.90-4
- fix problem with unpacking archives in a directory for which
one has write permission but does not own (such as /tmp) (#149686)

* Wed Jul 12 2006 Jesse Keating <jkeating@redhat.com> - 1.15.90-3.1
- rebuild

* Thu Jun 29 2006 Peter Vrabec <pvrabec@redhat.com> 1.15.90-3
- fix typo in tar.1 man page

* Tue Apr 25 2006 Peter Vrabec <pvrabec@redhat.com> 1.15.90-2
- exclude listed02.at from testsuite again, because it
still fails on s390

* Tue Apr 25 2006 Peter Vrabec <pvrabec@redhat.com> 1.15.90-1
- upgrade

* Mon Apr 24 2006 Peter Vrabec <pvrabec@redhat.com> 1.15.1-16
- fix problem when options at the end of command line were
not recognized (#188707)

* Thu Apr 13 2006 Peter Vrabec <pvrabec@redhat.com> 1.15.1-15
- fix segmentation faul introduced with hugeSparse.patch

* Wed Mar 22 2006 Peter Vrabec <pvrabec@redhat.com> 1.15.1-14
- fix problems with extracting large sparse archive members (#185460)

* Fri Feb 17 2006 Peter Vrabec <pvrabec@redhat.com> 1.15.1-13
- fix heap overlfow bug CVE-2006-0300 (#181773)

* Fri Feb 10 2006 Jesse Keating <jkeating@redhat.com> - 1.15.1-12.2
- bump again for double-long bug on ppc(64)

* Tue Feb 07 2006 Jesse Keating <jkeating@redhat.com> - 1.15.1-12.1
- rebuilt for new gcc4.1 snapshot and glibc changes

* Mon Feb 06 2006 Peter Vrabec <pvrabec@redhat.com> 1.15.1-12
- fix extracting sparse files to a filesystem like vfat,
when ftruncate may fail to grow the size of a file.(#179507)

* Fri Dec 09 2005 Jesse Keating <jkeating@redhat.com>
- rebuilt

* Fri Nov 04 2005 Peter Vrabec <pvrabec@redhat.com> 1.15.1-11
- correctly pad archive members that shrunk during archiving (#172373)

* Tue Sep 06 2005 Peter Vrabec <pvrabec@redhat.com> 1.15.1-10
- provide man page (#163709, #54243, #56041)

* Mon Aug 15 2005 Peter Vrabec <pvrabec@redhat.com> 1.15.1-9
- silence newer option (#164902)

* Wed Jul 27 2005 Peter Vrabec <pvrabec@redhat.com> 1.15.1-8
- A file is dumpable if it is sparse and both --sparse
and --totals are specified (#154882)

* Tue Jul 26 2005 Peter Vrabec <pvrabec@redhat.com> 1.15.1-7
- exclude listed02.at from testsuite

* Fri Jul 22 2005 Peter Vrabec <pvrabec@redhat.com> 1.15.1-6
- remove tar-1.14-err.patch, not needed (158743)

* Fri Apr 15 2005 Peter Vrabec <pvrabec@redhat.com> 1.15.1-5
- extract sparse files even if the output fd is not seekable.(#154882)
- (sparse_scan_file): Bugfix. offset had incorrect type.

* Mon Mar 14 2005 Peter Vrabec <pvrabec@redhat.com>
- gcc4 fix (#150993) 1.15.1-4

* Mon Jan 31 2005 Peter Vrabec <pvrabec@redhat.com>
- rebuild 1.15.1-3

* Mon Jan 17 2005 Peter Vrabec <pvrabec@redhat.com>
- fix tests/testsuite

* Fri Jan 07 2005 Peter Vrabec <pvrabec@redhat.com>
- upgrade to 1.15.1

* Mon Oct 11 2004 Peter Vrabec <pvrabec@redhat.com>
- patch to stop issuing lone zero block warnings
- rebuilt

* Mon Oct 11 2004 Peter Vrabec <pvrabec@redhat.com>
- URL added to spec file
- spec file clean up

* Tue Jun 15 2004 Elliot Lee <sopwith@redhat.com>
- rebuilt

* Mon Jun 7 2004 Jeff Johnson <jbj@jbj.org> 1.14-1
- upgrade to 1.14.

* Fri Feb 13 2004 Elliot Lee <sopwith@redhat.com>
- rebuilt

* Tue Jun 17 2003 Jeff Johnson <jbj@redhat.com> 1.13.25-13
- rebuilt because of crt breakage on ppc64.
- dump automake15 requirement.

* Wed Jun 04 2003 Elliot Lee <sopwith@redhat.com>
- rebuilt

* Wed Jan 22 2003 Tim Powers <timp@redhat.com>
- rebuilt

* Fri Nov 29 2002 Tim Powers <timp@redhat.com> 1.13.25-10
- fix broken buildrquires on autoconf253

* Thu Nov 7 2002 Jeff Johnson <jbj@redhat.com> 1.13.25-9
- rebuild from CVS.

* Fri Aug 23 2002 Phil Knirsch <pknirsch@redhat.com> 1.13.25-8
- Included security patch from errata release.

* Mon Jul 1 2002 Bernhard Rosenkraenzer <bero@redhat.com> 1.13.25-7
- Fix argv NULL termination (#64869)

* Thu May 23 2002 Tim Powers <timp@redhat.com>
- automated rebuild

* Tue Apr 9 2002 Bernhard Rosenkraenzer <bero@redhat.com> 1.13.25-4
- Fix build with autoconf253 (LIBOBJ change; autoconf252 worked)

* Wed Jan 09 2002 Tim Powers <timp@redhat.com>
- automated rebuild

* Tue Oct 23 2001 Bernhard Rosenkraenzer <bero@redhat.com> 1.13.25-2
- Don't include hardlinks to sockets in a tar file (#54827)

* Thu Sep 27 2001 Bernhard Rosenkraenzer <bero@redhat.com> 1.13.25-1
- 1.13.25

* Tue Sep 18 2001 Bernhard Rosenkraenzer <bero@redhat.com> 1.13.22-1
- Update to 1.13.22, adapt patches

* Mon Aug 27 2001 Bernhard Rosenkraenzer <bero@redhat.com> 1.13.19-6
- Fix #52084

* Thu May 17 2001 Bernhard Rosenkraenzer <bero@redhat.com> 1.13.19-5
- Fix build with current autoconf (stricter checking on AC_DEFINE)
- Fix segfault when tarring directories without having read permissions
(#40802)

* Tue Mar 6 2001 Bernhard Rosenkraenzer <bero@redhat.com>
- Don't depend on librt.

* Fri Feb 23 2001 Trond Eivind Glomsröd <teg@redhat.com>
- langify

* Thu Feb 22 2001 Bernhard Rosenkraenzer <bero@redhat.com>
- Fix up the man page (#28915)

* Wed Feb 21 2001 Bernhard Rosenkraenzer <bero@redhat.com>
- 1.3.19, nukes -I and fixes up -N
- Add -I back in as an alias to -j with a nice loud warning

* Mon Oct 30 2000 Bernhard Rosenkraenzer <bero@redhat.com>
- 1.3.18
- Update man page to reflect changes

* Thu Oct 5 2000 Bernhard Rosenkraenzer <bero@redhat.com>
- Fix the "ignore failed read" option (Bug #8330)

* Mon Sep 25 2000 Bernhard Rosenkraenzer <bero@redhat.com>
- fix hang on tar tvzf - <something.tar.gz, introduced by
exit code fix (Bug #15448), Patch from Tim Waugh <twaugh@redhat.com>

* Fri Aug 18 2000 Bernhard Rosenkraenzer <bero@redhat.com>
- really fix exit code (Bug #15448)

* Mon Aug 7 2000 Bernhard Rosenkraenzer <bero@redhat.com>
- fix exit code (Bug #15448), patch from Tim Waugh <twaugh@redhat.com>

* Wed Jul 12 2000 Prospector <bugzilla@redhat.com>
- automatic rebuild

* Mon Jun 19 2000 Bernhard Rosenkraenzer <bero@redhat.com>
- FHSify

* Fri Apr 28 2000 Bill Nottingham <notting@redhat.com>
- fix for ia64

* Wed Feb 9 2000 Bernhard Rosenkränzer <bero@redhat.com>
- Fix the exclude bug (#9201)

* Wed Feb 02 2000 Cristian Gafton <gafton@redhat.com>
- man pages are compressed
- fix description
- fix fnmatch build problems

* Sun Jan 9 2000 Bernhard Rosenkränzer <bero@redhat.com>
- 1.13.17
- remove dotbug patch (fixed in base)
- update download URL

* Fri Jan 7 2000 Bernhard Rosenkränzer <bero@redhat.com>
- Fix a severe bug (tar xf any_package_containing_. would delete the
current directory)

* Wed Jan 5 2000 Bernhard Rosenkränzer <bero@redhat.com>
- 1.3.16
- unset LINGUAS before running configure

* Tue Nov 9 1999 Bernhard Rosenkränzer <bero@redhat.com>
- 1.13.14
- Update man page to know about -I / --bzip
- Remove dependancy on rmt - tar can be used for anything local
without it.

* Fri Aug 27 1999 Preston Brown <pbrown@redhat.com>
- upgrade to 1.13.11.

* Wed Aug 18 1999 Jeff Johnson <jbj@redhat.com>
- update to 1.13.9.

* Thu Aug 12 1999 Jeff Johnson <jbj@redhat.com>
- update to 1.13.6.
- support -y --bzip2 options for bzip2 compression (#2415).

* Fri Jul 23 1999 Jeff Johnson <jbj@redhat.com>
- update to 1.13.5.

* Tue Jul 13 1999 Bill Nottingham <notting@redhat.com>
- update to 1.13

* Sat Jun 26 1999 Jeff Johnson <jbj@redhat.com>
- update to 1.12.64014.
- pipe patch corrected for remote tars now merged in.

* Sun Jun 20 1999 Jeff Johnson <jbj@redhat.com>
- update to tar-1.12.64013.
- subtract (and reopen #2415) bzip2 support using -y.
- move gtar to /bin.

* Tue Jun 15 1999 Jeff Johnson <jbj@redhat.com>
- upgrade to tar-1.12.64011 to
- add bzip2 support (#2415)
- fix filename bug (#3479)

* Mon Mar 29 1999 Jeff Johnson <jbj@redhat.com>
- fix suspended tar with compression over pipe produces error (#390).

* Sun Mar 21 1999 Cristian Gafton <gafton@redhat.com>
- auto rebuild in the new build environment (release 8)

* Mon Mar 08 1999 Michael Maher <mike@redhat.com>
- added patch for bad name cache.
- FIXES BUG 320

* Wed Feb 24 1999 Preston Brown <pbrown@redhat.com>
- Injected new description and group.

* Fri Dec 18 1998 Preston Brown <pbrown@redhat.com>
- bumped spec number for initial rh 6.0 build

* Tue Aug 4 1998 Jeff Johnson <jbj@redhat.com>
- add /usr/bin/gtar symlink (change #421)

* Tue Jul 14 1998 Jeff Johnson <jbj@redhat.com>
- Fiddle bindir/libexecdir to get RH install correct.
- Don't include /sbin/rmt -- use the rmt from dump.
- Turn on nls.

* Mon Apr 27 1998 Prospector System <bugs@redhat.com>
- translations modified for de, fr, tr

* Thu Oct 16 1997 Donnie Barnes <djb@redhat.com>
- updated from 1.11.8 to 1.12
- various spec file cleanups
- /sbin/install-info support

* Thu Jun 19 1997 Erik Troan <ewt@redhat.com>
- built against glibc

* Thu May 29 1997 Michael Fulbright <msf@redhat.com>
- Fixed to include rmt
Loading…
Cancel
Save