!5 update to 1.32

Merge pull request !5 from 桐小哥/master
This commit is contained in:
openeuler-ci-bot 2020-07-27 17:42:02 +08:00 committed by Gitee
commit f01de9829e
30 changed files with 12 additions and 1903 deletions

View File

@ -1,83 +0,0 @@
From 577dc345653947a31b2841167dc1a9be0e44e043 Mon Sep 17 00:00:00 2001
From: Pavel Raiskup <praiskup@redhat.com>
Date: Tue, 31 Jul 2018 12:06:09 +0300
Subject: [PATCH 20/58] Avoid some resource leaks
* src/incremen.c (store_rename): Free temp_name, leaked before for
each renamed directory with --listed-incremental.
* src/transform.c (add_literal_segment): Tighten arguments by
const.
(parse_transform_expr): Free 'str', leaked storage for each
--transform option before.
* src/utf8.c (utf8_convert): Deallocate buffer for failed iconv()
call so callers don't have to.
---
src/incremen.c | 1 +
src/transform.c | 3 ++-
src/utf8.c | 9 ++++++---
3 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/src/incremen.c b/src/incremen.c
index ca611f6..7c26eb8 100644
--- a/src/incremen.c
+++ b/src/incremen.c
@@ -915,6 +915,7 @@ store_rename (struct directory *dir, struct obstack *stk)
obstack_code_rename (stk, p->orig->name, p->name);
obstack_code_rename (stk, "", prev->name);
+ free (temp_name);
}
}
}
diff --git a/src/transform.c b/src/transform.c
index 3fae3c0..6ef0da6 100644
--- a/src/transform.c
+++ b/src/transform.c
@@ -101,7 +101,7 @@ add_segment (struct transform *tf)
}
static void
-add_literal_segment (struct transform *tf, char *str, char *end)
+add_literal_segment (struct transform *tf, const char *str, const char *end)
{
size_t len = end - str;
if (len)
@@ -403,6 +403,7 @@ parse_transform_expr (const char *expr)
cur++;
}
add_literal_segment (tf, beg, cur);
+ free(str);
return p;
}
diff --git a/src/utf8.c b/src/utf8.c
index a018ce0..168d636 100644
--- a/src/utf8.c
+++ b/src/utf8.c
@@ -68,7 +68,6 @@ utf8_convert (bool to_utf, char const *input, char **output)
char *ob;
size_t inlen;
size_t outlen;
- size_t rc;
iconv_t cd = utf8_init (to_utf);
if (cd == 0)
@@ -83,9 +82,13 @@ utf8_convert (bool to_utf, char const *input, char **output)
outlen = inlen * MB_LEN_MAX + 1;
ob = *output = xmalloc (outlen);
ib = (char ICONV_CONST *) input;
- rc = iconv (cd, &ib, &inlen, &ob, &outlen);
+ if (iconv (cd, &ib, &inlen, &ob, &outlen) == -1)
+ {
+ free (*output);
+ return false;
+ }
*ob = 0;
- return rc != -1;
+ return true;
}
--
2.19.1

View File

@ -1,29 +0,0 @@
From ea3aea06f1da077dbb4092672dc7e8768ae4f84e Mon Sep 17 00:00:00 2001
From: Sergey Poznyakoff <gray@gnu.org>
Date: Fri, 21 Dec 2018 13:42:29 +0200
Subject: [PATCH 37/58] Bugfix
Bug reported in
http://lists.gnu.org/archive/html/bug-tar/2018-12/msg00014.html
* src/names.c (collect_and_sort_names): Fix iteration over namelist.
---
src/names.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/names.c b/src/names.c
index d3728d8..025b682 100644
--- a/src/names.c
+++ b/src/names.c
@@ -1857,7 +1857,7 @@ collect_and_sort_names (void)
if (listed_incremental_option)
{
- for (name = namelist; name && name->name[0] == 0; name++)
+ for (name = namelist; name && name->name[0] == 0; name = name->next)
;
if (name)
append_incremental_renames (name->directory);
--
2.19.1

View File

@ -1,75 +0,0 @@
From 3c2a2cd94d3b062aa5bf850b82364039ec9c6029 Mon Sep 17 00:00:00 2001
From: Sergey Poznyakoff <gray@gnu.org>
Date: Fri, 21 Dec 2018 14:18:14 +0200
Subject: [PATCH 38/58] Disallow modifications to the global pax extended
header in update mode.
Updating global headers in update mode is not possible, because:
1) If the original archive was not in PAX format, writing the
global header would overwrite first member header (and eventually
data blocks) in the archive.
2) Otherwise, using the --pax-option can make the updated header
occupy more blocks than the original one, which would lead to the
same effect as in 1.
This also fixes
http://lists.gnu.org/archive/html/bug-tar/2018-12/msg00007.html
* src/xheader.c (xheader_forbid_global): New function.
* src/common.h (xheader_forbid_global): New prototype.
* src/update.c (update_archive): Use xheader_forbid_global, instead
of trying to write global extended header record.
---
src/common.h | 1 +
src/update.c | 2 +-
src/xheader.c | 8 ++++++++
3 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/src/common.h b/src/common.h
index 32e6f8b..885169f 100644
--- a/src/common.h
+++ b/src/common.h
@@ -836,6 +836,7 @@ void xheader_store (char const *keyword, struct tar_stat_info *st,
void xheader_read (struct xheader *xhdr, union block *header, off_t size);
void xheader_write (char type, char *name, time_t t, struct xheader *xhdr);
void xheader_write_global (struct xheader *xhdr);
+void xheader_forbid_global (void);
void xheader_finish (struct xheader *hdr);
void xheader_destroy (struct xheader *hdr);
char *xheader_xhdr_name (struct tar_stat_info *st);
diff --git a/src/update.c b/src/update.c
index 2f823e4..4aa4ac6 100644
--- a/src/update.c
+++ b/src/update.c
@@ -111,7 +111,7 @@ update_archive (void)
name_gather ();
open_archive (ACCESS_UPDATE);
- buffer_write_global_xheader ();
+ xheader_forbid_global ();
while (!found_end)
{
diff --git a/src/xheader.c b/src/xheader.c
index e938502..010cab7 100644
--- a/src/xheader.c
+++ b/src/xheader.c
@@ -469,6 +469,14 @@ xheader_write_global (struct xheader *xhdr)
}
}
+/* Forbid modifications of the global extended header */
+void
+xheader_forbid_global (void)
+{
+ if (keyword_global_override_list)
+ USAGE_ERROR ((0, 0, _("can't update global extended header record")));
+}
+
void
xheader_xattr_init (struct tar_stat_info *st)
{
--
2.19.1

View File

@ -1,465 +0,0 @@
From fd555fc06bfb4eae3eb48fbc150d20a4dda0d150 Mon Sep 17 00:00:00 2001
From: Sergey Poznyakoff <gray@gnu.org>
Date: Thu, 27 Dec 2018 17:48:57 +0200
Subject: [PATCH] Fixed a denial of service when the '--sparse' option
mishandles file shrinkage during read access(CVE-2018-20482)
https://github.com/praiskup/tar/commit/c15c42ccd1e2377945fd0414eca1a49294bff454
Signed-off-by: fangyufa1 <fangyufa1@huawei.com>
---
NEWS | 32 +++++++++++++++++-
src/sparse.c | 82 +++++++++++++++++++++++++++++----------------
tests/Makefile.am | 5 ++-
tests/sptrcreat.at | 62 ++++++++++++++++++++++++++++++++++
tests/sptrdiff00.at | 55 ++++++++++++++++++++++++++++++
tests/sptrdiff01.at | 55 ++++++++++++++++++++++++++++++
tests/testsuite.at | 5 ++-
7 files changed, 264 insertions(+), 32 deletions(-)
create mode 100644 tests/sptrcreat.at
create mode 100644 tests/sptrdiff00.at
create mode 100644 tests/sptrdiff01.at
diff --git a/NEWS b/NEWS
index cd15fa1..283c376 100644
--- a/NEWS
+++ b/NEWS
@@ -1,7 +1,37 @@
-GNU tar NEWS - User visible changes. 2017-12-17
+GNU tar NEWS - User visible changes. 2018-12-27
Please send GNU tar bug reports to <bug-tar@gnu.org>
+version 1.30.90 (Git)
+
+* Fix heap-buffer-overrun with --one-top-level.
+Bug introduced with the addition of that option in 1.28.
+
+* Support for zstd compression
+
+New option '--zstd' instructs tar to use zstd as compression program.
+When listing, extractng and comparing, zstd compressed archives are
+recognized automatically.
+When '-a' option is in effect, zstd compression is selected if the
+destination archive name ends in '.zst' or '.tzst'.
+
+* The -K option interacts properly with member names given in the command line
+
+Names of members to extract can be specified along with the "-K NAME"
+option. In this case, tar will extract NAME and those of named members
+that appear in the archive after it, which is consistent with the
+semantics of the option.
+
+Previous versions of tar extracted NAME, those of named members that
+appeared before it, and everything after it.
+
+* Fix CVE-2018-20482
+
+When creating archives with the --sparse option, previous versions of
+tar would loop endlessly if a sparse file had been truncated while
+being archived.
+
+
version 1.30 - Sergey Poznyakoff, 2017-12-17
* Member names containing '..' components are now skipped when extracting.
diff --git a/src/sparse.c b/src/sparse.c
index 6ec069d..726facd 100644
--- a/src/sparse.c
+++ b/src/sparse.c
@@ -1,6 +1,6 @@
/* Functions for dealing with sparse files
- Copyright 2003-2007, 2010, 2013-2017 Free Software Foundation, Inc.
+ Copyright 2003-2007, 2010, 2013-2018 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
@@ -428,16 +428,30 @@ sparse_dump_region (struct tar_sparse_file *file, size_t i)
bufsize);
return false;
}
- if (bytes_read == 0)
- {
- char buf[UINTMAX_STRSIZE_BOUND];
- FATAL_ERROR ((0, 0,
- ngettext ("%s: File shrank by %s byte",
- "%s: File shrank by %s bytes",
- bytes_left),
- quotearg_colon (file_name),
- offtostr (bytes_left, buf)));
- }
+ else if (bytes_read == 0)
+ {
+ char buf[UINTMAX_STRSIZE_BOUND];
+ struct stat st;
+ size_t n;
+ if (fstat (file->fd, &st) == 0)
+ n = file->stat_info->stat.st_size - st.st_size;
+ else
+ n = file->stat_info->stat.st_size
+ - (file->stat_info->sparse_map[i].offset
+ + file->stat_info->sparse_map[i].numbytes
+ - bytes_left);
+
+ WARNOPT (WARN_FILE_SHRANK,
+ (0, 0,
+ ngettext ("%s: File shrank by %s byte; padding with zeros",
+ "%s: File shrank by %s bytes; padding with zeros",
+ n),
+ quotearg_colon (file_name),
+ STRINGIFY_BIGINT (n, buf)));
+ if (! ignore_failed_read_option)
+ set_exit_status (TAREXIT_DIFFERS);
+ return false;
+ }
memset (blk->buffer + bytes_read, 0, BLOCKSIZE - bytes_read);
bytes_left -= bytes_read;
@@ -475,9 +489,9 @@ sparse_extract_region (struct tar_sparse_file *file, size_t i)
return false;
}
set_next_block_after (blk);
+ file->dumped_size += BLOCKSIZE;
count = blocking_write (file->fd, blk->buffer, wrbytes);
write_size -= count;
- file->dumped_size += count;
mv_size_left (file->stat_info->archive_file_size - file->dumped_size);
file->offset += count;
if (count != wrbytes)
@@ -610,20 +624,24 @@ check_sparse_region (struct tar_sparse_file *file, off_t beg, off_t end)
offset, rdsize);
return false;
}
-
- if (bytes_read == 0
- || !zero_block_p (diff_buffer, bytes_read))
- {
- char begbuf[INT_BUFSIZE_BOUND (off_t)];
- const char *msg = bytes_read ? _("File fragment at %s is not a hole")
- : _("Hole starting at %s is truncated");
-
- report_difference (file->stat_info, msg, offtostr (beg, begbuf));
- return false;
- }
+ else if (bytes_read == 0)
+ {
+ report_difference (file->stat_info, _("Size differs"));
+ return false;
+ }
+
+ if (!zero_block_p (diff_buffer, bytes_read))
+ {
+ char begbuf[INT_BUFSIZE_BOUND (off_t)];
+ report_difference (file->stat_info,
+ _("File fragment at %s is not a hole"),
+ offtostr (offset, begbuf));
+ return false;
+ }
offset += bytes_read;
}
+
return true;
}
@@ -650,6 +668,7 @@ check_data_region (struct tar_sparse_file *file, size_t i)
return false;
}
set_next_block_after (blk);
+ file->dumped_size += BLOCKSIZE;
bytes_read = safe_read (file->fd, diff_buffer, rdsize);
if (bytes_read == SAFE_READ_ERROR)
{
@@ -660,11 +679,14 @@ check_data_region (struct tar_sparse_file *file, size_t i)
rdsize);
return false;
}
- file->dumped_size += bytes_read;
+ else if (bytes_read == 0)
+ {
+ report_difference (&current_stat_info, _("Size differs"));
+ return false;
+ }
size_left -= bytes_read;
mv_size_left (file->stat_info->archive_file_size - file->dumped_size);
- if (bytes_read == 0
- || memcmp (blk->buffer, diff_buffer, bytes_read))
+ if (memcmp (blk->buffer, diff_buffer, bytes_read))
{
report_difference (file->stat_info, _("Contents differ"));
return false;
@@ -1229,7 +1251,8 @@ pax_decode_header (struct tar_sparse_file *file)
union block *blk;
char *p;
size_t i;
-
+ off_t start;
+
#define COPY_BUF(b,buf,src) do \
{ \
char *endp = b->buffer + BLOCKSIZE; \
@@ -1245,7 +1268,6 @@ pax_decode_header (struct tar_sparse_file *file)
if (src == endp) \
{ \
set_next_block_after (b); \
- file->dumped_size += BLOCKSIZE; \
b = find_next_block (); \
if (!b) \
FATAL_ERROR ((0, 0, _("Unexpected EOF in archive"))); \
@@ -1258,8 +1280,8 @@ pax_decode_header (struct tar_sparse_file *file)
dst[-1] = 0; \
} while (0)
+ start = current_block_ordinal ();
set_next_block_after (current_header);
- file->dumped_size += BLOCKSIZE;
blk = find_next_block ();
if (!blk)
FATAL_ERROR ((0, 0, _("Unexpected EOF in archive")));
@@ -1298,6 +1320,8 @@ pax_decode_header (struct tar_sparse_file *file)
sparse_add_map (file->stat_info, &sp);
}
set_next_block_after (blk);
+
+ file->dumped_size += BLOCKSIZE * (current_block_ordinal () - start);
}
return true;
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 2d7939d..ac3b6e7 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1,6 +1,6 @@
# Makefile for GNU tar regression tests.
-# Copyright 1996-1997, 1999-2001, 2003-2007, 2009, 2012-2015 Free Software
+# Copyright 1996-1997, 1999-2001, 2003-2007, 2009, 2012-2018 Free Software
# This file is part of GNU tar.
@@ -228,6 +228,9 @@ TESTSUITE_AT = \
spmvp00.at\
spmvp01.at\
spmvp10.at\
+ sptrcreat.at\
+ sptrdiff00.at\
+ sptrdiff01.at\
time01.at\
time02.at\
truncate.at\
diff --git a/tests/sptrcreat.at b/tests/sptrcreat.at
new file mode 100644
index 0000000..8e28f0e
--- /dev/null
+++ b/tests/sptrcreat.at
@@ -0,0 +1,62 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright 2018 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/>.
+
+# Tar up to 1.30 would loop endlessly if a sparse file had been truncated
+# while being archived (with --sparse flag).
+#
+# The bug has been assigned id CVE-2018-20482 (on the grounds that it is a
+# denial of service possibility).
+#
+# Reported by: Chris Siebenmann <cks.gnutar-01@cs.toronto.edu>
+# References: <20181226223948.781EB32008E@apps1.cs.toronto.edu>,
+# <http://lists.gnu.org/archive/html/bug-tar/2018-12/msg00023.html>
+# <https://utcc.utoronto.ca/~cks/space/blog/sysadmin/TarFindingTruncateBug>
+# <https://nvd.nist.gov/vuln/detail/CVE-2018-20482>
+
+AT_SETUP([sparse file truncated while archiving])
+AT_KEYWORDS([truncate filechange sparse sptr sptrcreat])
+
+AT_TAR_CHECK([
+genfile --sparse --block-size=1024 --file foo \
+ 0 ABCDEFGHIJ 1M ABCDEFGHIJ 10M ABCDEFGHIJ 200M ABCDEFGHIJ
+genfile --file baz
+genfile --run --checkpoint 3 --length 200m --truncate foo -- \
+ tar --checkpoint=1 \
+ --checkpoint-action=echo \
+ --checkpoint-action=sleep=1 \
+ --sparse -vcf bar foo baz
+echo Exit status: $?
+echo separator
+genfile --file foo --seek 200m --length 11575296 --pattern=zeros
+tar dvf bar],
+[1],
+[foo
+baz
+Exit status: 1
+separator
+foo
+foo: Mod time differs
+baz
+],
+[tar: foo: File shrank by 11575296 bytes; padding with zeros
+],
+[],[],[posix, gnu, oldgnu])
+
+AT_CLEANUP
diff --git a/tests/sptrdiff00.at b/tests/sptrdiff00.at
new file mode 100644
index 0000000..c410561
--- /dev/null
+++ b/tests/sptrdiff00.at
@@ -0,0 +1,55 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+#
+# Test suite for GNU tar.
+# Copyright 2018 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/>.
+
+# While fixing CVE-2018-20482 (see sptrcreat.at) it has been discovered
+# that similar bug exists in file checking code (tar d).
+# This test case checks if tar correctly handles a short read condition
+# appearing in check_sparse_region.
+
+AT_SETUP([file truncated in sparse region while comparing])
+AT_KEYWORDS([truncate filechange sparse sptr sptrdiff diff])
+
+# This triggers short read in check_sparse_region.
+AT_TAR_CHECK([
+genfile --sparse --block-size=1024 --file foo \
+ 0 ABCDEFGHIJ 1M ABCDEFGHIJ 10M ABCDEFGHIJ 200M ABCDEFGHIJ
+genfile --file baz
+echo creating
+tar --sparse -vcf bar foo baz
+echo comparing
+genfile --run --checkpoint 3 --length 200m --truncate foo -- \
+ tar --checkpoint=1 \
+ --checkpoint-action=echo='Write checkpoint %u' \
+ --checkpoint-action=sleep=1 \
+ --sparse -vdf bar
+],
+[1],
+[creating
+foo
+baz
+comparing
+foo
+foo: Size differs
+baz
+],
+[],
+[],[],[posix, gnu, oldgnu])
+
+AT_CLEANUP
diff --git a/tests/sptrdiff01.at b/tests/sptrdiff01.at
new file mode 100644
index 0000000..2da2267
--- /dev/null
+++ b/tests/sptrdiff01.at
@@ -0,0 +1,55 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+#
+# Test suite for GNU tar.
+# Copyright 2018 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/>.
+
+# While fixing CVE-2018-20482 (see sptrcreat.at) it has been discovered
+# that similar bug exists in file checking code (tar d).
+# This test case checks if tar correctly handles a short read condition
+# appearing in check_data_region.
+
+AT_SETUP([file truncated in data region while comparing])
+AT_KEYWORDS([truncate filechange sparse sptr sptrdiff diff])
+
+# This triggers short read in check_data_region.
+AT_TAR_CHECK([
+genfile --sparse --block-size=1024 --file foo \
+ 0 ABCDEFGHIJ 1M ABCDEFGHIJ 10M ABCDEFGHIJ 200M ABCDEFGHIJ
+genfile --file baz
+echo creating
+tar --sparse -vcf bar foo baz
+echo comparing
+genfile --run --checkpoint 5 --length 221278210 --truncate foo -- \
+ tar --checkpoint=1 \
+ --checkpoint-action=echo='Write checkpoint %u' \
+ --checkpoint-action=sleep=1 \
+ --sparse -vdf bar
+],
+[1],
+[creating
+foo
+baz
+comparing
+foo
+foo: Size differs
+baz
+],
+[],
+[],[],[posix, gnu, oldgnu])
+
+AT_CLEANUP
diff --git a/tests/testsuite.at b/tests/testsuite.at
index 2a83757..23386f7 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 2004-2008, 2010-2017 Free Software Foundation, Inc.
+# Copyright 2004-2008, 2010-2018 Free Software Foundation, Inc.
# This file is part of GNU tar.
@@ -405,6 +405,9 @@ m4_include([sparsemv.at])
m4_include([spmvp00.at])
m4_include([spmvp01.at])
m4_include([spmvp10.at])
+m4_include([sptrcreat.at])
+m4_include([sptrdiff00.at])
+m4_include([sptrdiff01.at])
AT_BANNER([Updates])
m4_include([update.at])
--
2.19.1

View File

@ -1,111 +0,0 @@
From c7c59b57faa7bd60063f38d3517a8ad50fe1c430 Mon Sep 17 00:00:00 2001
From: Sergey Poznyakoff <gray@gnu.org>
Date: Thu, 20 Dec 2018 20:30:58 +0200
Subject: [PATCH 33/58] Fix buffer overflow
Bug reported in
http://lists.gnu.org/archive/html/bug-tar/2018-12/msg00011.html
* src/xheader.c (xheader_format_name): fix length calculation
---
src/xheader.c | 70 ++++++++++++++++++++++++++++-----------------------
1 file changed, 39 insertions(+), 31 deletions(-)
diff --git a/src/xheader.c b/src/xheader.c
index 6d97131..980f050 100644
--- a/src/xheader.c
+++ b/src/xheader.c
@@ -255,7 +255,7 @@ char *
xheader_format_name (struct tar_stat_info *st, const char *fmt, size_t n)
{
char *buf;
- size_t len = strlen (fmt);
+ size_t len;
char *q;
const char *p;
char *dirp = NULL;
@@ -266,43 +266,51 @@ xheader_format_name (struct tar_stat_info *st, const char *fmt, size_t n)
char nbuf[UINTMAX_STRSIZE_BOUND];
char const *nptr = NULL;
- for (p = fmt; *p && (p = strchr (p, '%')); )
+ len = 0;
+ for (p = fmt; *p; p++)
{
- switch (p[1])
+ if (*p == '%' && p[1])
{
- case '%':
- len--;
- break;
-
- case 'd':
- if (st)
+ switch (*++p)
{
- if (!dirp)
- dirp = dir_name (st->orig_file_name);
- dir = safer_name_suffix (dirp, false, absolute_names_option);
- len += strlen (dir) - 2;
- }
- break;
+ case '%':
+ len++;
+ break;
- case 'f':
- if (st)
- {
- base = last_component (st->orig_file_name);
- len += strlen (base) - 2;
- }
- break;
+ case 'd':
+ if (st)
+ {
+ if (!dirp)
+ dirp = dir_name (st->orig_file_name);
+ dir = safer_name_suffix (dirp, false, absolute_names_option);
+ len += strlen (dir);
+ }
+ break;
- case 'p':
- pptr = umaxtostr (getpid (), pidbuf);
- len += pidbuf + sizeof pidbuf - 1 - pptr - 2;
- break;
+ case 'f':
+ if (st)
+ {
+ base = last_component (st->orig_file_name);
+ len += strlen (base);
+ }
+ break;
- case 'n':
- nptr = umaxtostr (n, nbuf);
- len += nbuf + sizeof nbuf - 1 - nptr - 2;
- break;
+ case 'p':
+ pptr = umaxtostr (getpid (), pidbuf);
+ len += pidbuf + sizeof pidbuf - 1 - pptr;
+ break;
+
+ case 'n':
+ nptr = umaxtostr (n, nbuf);
+ len += nbuf + sizeof nbuf - 1 - nptr;
+ break;
+
+ default:
+ len += 2;
+ }
}
- p++;
+ else
+ len++;
}
buf = xmalloc (len + 1);
--
2.19.1

View File

@ -1,28 +0,0 @@
From bd1b0fc97c95686175057a203c7a1cf7b79cb19b Mon Sep 17 00:00:00 2001
From: Sergey Poznyakoff <gray@gnu.org>
Date: Tue, 15 Jan 2019 15:21:03 +0200
Subject: [PATCH 55/58] Fix build on AIX
* src/unlink.c (flush_deferred_unlinks): Avoid possible duplicate case
(if ENOTEMPTY==EEXIST)
---
src/unlink.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/unlink.c b/src/unlink.c
index 8f3a8a4..5a72f70 100644
--- a/src/unlink.c
+++ b/src/unlink.c
@@ -127,7 +127,9 @@ flush_deferred_unlinks (bool force)
case EEXIST:
/* OpenSolaris >=10 sets EEXIST instead of ENOTEMPTY
if trying to remove a non-empty directory */
+#if defined ENOTEMPTY && ENOTEMPTY != EEXIST
case ENOTEMPTY:
+#endif
/* Keep the record in list, in the hope we'll
be able to remove it later */
prev = p;
--
2.19.1

View File

@ -1,32 +0,0 @@
From 2f5a57be4bcb4b6e641457ef0fc99bdbe84828ba Mon Sep 17 00:00:00 2001
From: Sergey Poznyakoff <gray@gnu.org>
Date: Mon, 14 Jan 2019 14:46:43 +0200
Subject: [PATCH 50/58] Fix compilation without iconv.
---
src/utf8.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/src/utf8.c b/src/utf8.c
index 91476aa..53a1ab2 100644
--- a/src/utf8.c
+++ b/src/utf8.c
@@ -35,11 +35,14 @@
# define iconv_open(tocode, fromcode) ((iconv_t) -1)
# undef iconv
-# define iconv(cd, inbuf, inbytesleft, outbuf, outbytesleft) ((size_t) 0)
+# define iconv(cd, inbuf, inbytesleft, outbuf, outbytesleft) (errno = ENOSYS, (size_t) -1)
# undef iconv_close
# define iconv_close(cd) 0
+# undef iconv_t
+# define iconv_t int
+
#endif
--
2.19.1

View File

@ -1,44 +0,0 @@
From 110e3bd7a6e63e0c5c734d97a0a44ed5c1b6de7c Mon Sep 17 00:00:00 2001
From: Sergey Poznyakoff <gray@gnu.org>
Date: Tue, 31 Jul 2018 15:57:11 +0300
Subject: [PATCH 22/58] Fix double-free introduced by 577dc345
* src/utf8.c (utf8_convert): Don't store freed value in *output
---
src/utf8.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/src/utf8.c b/src/utf8.c
index 168d636..abf26bc 100644
--- a/src/utf8.c
+++ b/src/utf8.c
@@ -65,7 +65,7 @@ bool
utf8_convert (bool to_utf, char const *input, char **output)
{
char ICONV_CONST *ib;
- char *ob;
+ char *ob, *ret;
size_t inlen;
size_t outlen;
iconv_t cd = utf8_init (to_utf);
@@ -80,14 +80,15 @@ utf8_convert (bool to_utf, char const *input, char **output)
inlen = strlen (input) + 1;
outlen = inlen * MB_LEN_MAX + 1;
- ob = *output = xmalloc (outlen);
+ ob = ret = xmalloc (outlen);
ib = (char ICONV_CONST *) input;
if (iconv (cd, &ib, &inlen, &ob, &outlen) == -1)
{
- free (*output);
+ free (ret);
return false;
}
*ob = 0;
+ *output = ret;
return true;
}
--
2.19.1

View File

@ -1,84 +0,0 @@
From 916fe62ae9b91a5d71cfa752f7cad89a558d7672 Mon Sep 17 00:00:00 2001
From: Sergey Poznyakoff <gray@gnu.org>
Date: Fri, 21 Dec 2018 07:59:02 +0200
Subject: [PATCH 35/58] Fix error handling when reading incremental snapshots
Bug reported in
http://lists.gnu.org/archive/html/bug-tar/2018-12/msg00008.html
* incremen.c (read_incr_db_01): Don't try to continue after errors.
---
src/incremen.c | 30 +++++++++++++++---------------
1 file changed, 15 insertions(+), 15 deletions(-)
diff --git a/src/incremen.c b/src/incremen.c
index 7c26eb8..8335a0c 100644
--- a/src/incremen.c
+++ b/src/incremen.c
@@ -998,10 +998,10 @@ read_incr_db_01 (int version, const char *initbuf)
newer_mtime_option = decode_timespec (buf, &ebuf, false);
if (! valid_timespec (newer_mtime_option))
- ERROR ((0, errno, "%s:%ld: %s",
- quotearg_colon (listed_incremental_option),
- lineno,
- _("Invalid time stamp")));
+ FATAL_ERROR ((0, errno, "%s:%ld: %s",
+ quotearg_colon (listed_incremental_option),
+ lineno,
+ _("Invalid time stamp")));
else
{
if (version == 1 && *ebuf)
@@ -1043,9 +1043,9 @@ read_incr_db_01 (int version, const char *initbuf)
mtime = decode_timespec (strp, &ebuf, false);
strp = ebuf;
if (!valid_timespec (mtime) || *strp != ' ')
- ERROR ((0, errno, "%s:%ld: %s",
- quotearg_colon (listed_incremental_option), lineno,
- _("Invalid modification time")));
+ FATAL_ERROR ((0, errno, "%s:%ld: %s",
+ quotearg_colon (listed_incremental_option), lineno,
+ _("Invalid modification time")));
errno = 0;
u = strtoumax (strp, &ebuf, 10);
@@ -1053,9 +1053,9 @@ read_incr_db_01 (int version, const char *initbuf)
errno = ERANGE;
if (errno || strp == ebuf || *ebuf != ' ')
{
- ERROR ((0, errno, "%s:%ld: %s",
- quotearg_colon (listed_incremental_option), lineno,
- _("Invalid modification time (nanoseconds)")));
+ FATAL_ERROR ((0, errno, "%s:%ld: %s",
+ quotearg_colon (listed_incremental_option), lineno,
+ _("Invalid modification time (nanoseconds)")));
mtime.tv_nsec = -1;
}
else
@@ -1069,17 +1069,17 @@ read_incr_db_01 (int version, const char *initbuf)
TYPE_MINIMUM (dev_t), TYPE_MAXIMUM (dev_t));
strp = ebuf;
if (errno || *strp != ' ')
- ERROR ((0, errno, "%s:%ld: %s",
+ FATAL_ERROR ((0, errno, "%s:%ld: %s",
quotearg_colon (listed_incremental_option), lineno,
- _("Invalid device number")));
+ _("Invalid device number")));
ino = strtosysint (strp, &ebuf,
TYPE_MINIMUM (ino_t), TYPE_MAXIMUM (ino_t));
strp = ebuf;
if (errno || *strp != ' ')
- ERROR ((0, errno, "%s:%ld: %s",
- quotearg_colon (listed_incremental_option), lineno,
- _("Invalid inode number")));
+ FATAL_ERROR ((0, errno, "%s:%ld: %s",
+ quotearg_colon (listed_incremental_option), lineno,
+ _("Invalid inode number")));
strp++;
unquote_string (strp);
--
2.19.1

View File

@ -1,39 +0,0 @@
From 3da8c2850d6589b9fa387ab2a2c87355d1224b1e Mon Sep 17 00:00:00 2001
From: Sergey Poznyakoff <gray@gnu.org>
Date: Mon, 14 Jan 2019 13:59:39 +0200
Subject: [PATCH 49/58] Fix iconv usage.
Patch by Christian Weisgerber.
* src/utf8.c (utf8_convert): non-zero return from iconv means failure.
---
src/utf8.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/src/utf8.c b/src/utf8.c
index 95a016d..91476aa 100644
--- a/src/utf8.c
+++ b/src/utf8.c
@@ -81,7 +81,18 @@ utf8_convert (bool to_utf, char const *input, char **output)
outlen = inlen * MB_LEN_MAX + 1;
ob = ret = xmalloc (outlen);
ib = (char ICONV_CONST *) input;
- if (iconv (cd, &ib, &inlen, &ob, &outlen) == -1)
+ /* According to POSIX, "if iconv() encounters a character in the input
+ buffer that is valid, but for which an identical character does not
+ exist in the target codeset, iconv() shall perform an
+ implementation-defined conversion on this character." It will "update
+ the variables pointed to by the arguments to reflect the extent of the
+ conversion and return the number of non-identical conversions performed".
+ On error, it returns -1.
+ In other words, non-zero return always indicates failure, either because
+ the input was not fully converted, or because it was converted in a
+ non-reversible way.
+ */
+ if (iconv (cd, &ib, &inlen, &ob, &outlen) != 0)
{
free (ret);
return false;
--
2.19.1

View File

@ -1,30 +0,0 @@
From eae48289c0848c5812644f20dbb1b39fb117a8f6 Mon Sep 17 00:00:00 2001
From: Sergey Poznyakoff <gray@gnu.org>
Date: Thu, 20 Dec 2018 17:53:40 +0200
Subject: [PATCH 32/58] Fix improper memory access
Bug reported in
http://lists.gnu.org/archive/html/bug-tar/2018-12/msg00009.html
* src/transform.c (parse_transform_expr): Check if re is not empty
before accessing its last byte.
---
src/transform.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/transform.c b/src/transform.c
index 6ef0da6..bbf2033 100644
--- a/src/transform.c
+++ b/src/transform.c
@@ -273,7 +273,7 @@ parse_transform_expr (const char *expr)
USAGE_ERROR ((0, 0, _("Invalid transform expression: %s"), errbuf));
}
- if (str[0] == '^' || str[strlen (str) - 1] == '$')
+ if (str[0] == '^' || (i > 2 && str[i - 3] == '$'))
tf->transform_type = transform_first;
free (str);
--
2.19.1

View File

@ -1,35 +0,0 @@
From cb07844454d8cc9fb21f53ace75975f91185a120 Mon Sep 17 00:00:00 2001
From: Sergey Poznyakoff <gray@gnu.org>
Date: Mon, 14 Jan 2019 15:22:09 +0200
Subject: [PATCH] Fix possible NULL dereference (savannah bug #55369)
* src/sparse.c (pax_decode_header): Check return from find_next_block.
---
src/sparse.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/sparse.c b/src/sparse.c
index 55c874f..6ec069d 100644
--- a/src/sparse.c
+++ b/src/sparse.c
@@ -1247,6 +1247,8 @@ pax_decode_header (struct tar_sparse_file *file)
set_next_block_after (b); \
file->dumped_size += BLOCKSIZE; \
b = find_next_block (); \
+ if (!b) \
+ FATAL_ERROR ((0, 0, _("Unexpected EOF in archive"))); \
src = b->buffer; \
endp = b->buffer + BLOCKSIZE; \
} \
@@ -1259,6 +1261,8 @@ pax_decode_header (struct tar_sparse_file *file)
set_next_block_after (current_header);
file->dumped_size += BLOCKSIZE;
blk = find_next_block ();
+ if (!blk)
+ FATAL_ERROR ((0, 0, _("Unexpected EOF in archive")));
p = blk->buffer;
COPY_BUF (blk,nbuf,p);
if (!decode_num (&u, nbuf, TYPE_MAXIMUM (size_t)))
--
1.8.3.1

View File

@ -1,130 +0,0 @@
From 983a82a3767da04cb3ca15eefe2e4b21154c335f Mon Sep 17 00:00:00 2001
From: Sergey Poznyakoff <gray@gnu.org>
Date: Fri, 21 Dec 2018 13:24:29 +0200
Subject: [PATCH 36/58] Fix semantics of -K used together with explicit member
names.
This also fixes the bug reported in
http://lists.gnu.org/archive/html/bug-tar/2018-12/msg00012.html
* src/common.h (starting_file_option): Describe the variable.
* src/names.c (add_starting_file): New function.
(name_match): Ignore everything before the member indicated by the
--starting-file option
* src/tar.c: Use add_starting_file to handle the -K option.
---
NEWS | 12 +++++++++++-
src/common.h | 5 +++++
src/names.c | 45 ++++++++++++++++++++++++++++++++++++++-------
src/tar.c | 3 +--
4 files changed, 55 insertions(+), 10 deletions(-)
diff --git a/src/common.h b/src/common.h
index 2877975..32e6f8b 100644
--- a/src/common.h
+++ b/src/common.h
@@ -302,6 +302,10 @@ enum hole_detection_method
GLOBAL enum hole_detection_method hole_detection;
+/* The first entry in names.c:namelist specifies the member name to
+ start extracting from. Set by add_starting_file() upon seeing the
+ -K option.
+*/
GLOBAL bool starting_file_option;
/* Specified maximum byte length of each tape volume (multiple of 1024). */
@@ -752,6 +756,7 @@ const char *name_next (int change_dirs);
void name_gather (void);
struct name *addname (char const *string, int change_dir,
bool cmdline, struct name *parent);
+void add_starting_file (char const *file_name);
void remname (struct name *name);
bool name_match (const char *name);
void names_notfound (void);
diff --git a/src/names.c b/src/names.c
index f4dc978..d3728d8 100644
--- a/src/names.c
+++ b/src/names.c
@@ -1227,6 +1227,34 @@ addname (char const *string, int change_dir, bool cmdline, struct name *parent)
return name;
}
+void
+add_starting_file (char const *file_name)
+{
+ struct name *name = make_name (file_name);
+
+ if (starting_file_option)
+ {
+ struct name *head = namelist;
+ remname (head);
+ free_name (head);
+ }
+
+ name->prev = NULL;
+ name->next = namelist;
+ namelist = name;
+ if (!nametail)
+ nametail = namelist;
+
+ name->found_count = 0;
+ name->matching_flags = INCLUDE_OPTIONS;
+ name->change_dir = 0;
+ name->directory = NULL;
+ name->parent = NULL;
+ name->cmdline = true;
+
+ starting_file_option = true;
+}
+
/* Find a match for FILE_NAME (whose string length is LENGTH) in the name
list. */
static struct name *
@@ -1283,19 +1311,22 @@ name_match (const char *file_name)
}
cursor = namelist_match (file_name, length);
+ if (starting_file_option)
+ {
+ /* If starting_file_option is set, the head of the list is the name
+ of the member to start extraction from. Skip the match unless it
+ is head. */
+ if (cursor == namelist)
+ starting_file_option = false;
+ else
+ cursor = NULL;
+ }
if (cursor)
{
if (!(ISSLASH (file_name[cursor->length]) && recursion_option)
|| cursor->found_count == 0)
cursor->found_count++; /* remember it matched */
- if (starting_file_option)
- {
- free (namelist);
- namelist = NULL;
- nametail = NULL;
- }
chdir_do (cursor->change_dir);
-
/* We got a match. */
return ISFOUND (cursor);
}
diff --git a/src/tar.c b/src/tar.c
index 1993887..9919e87 100644
--- a/src/tar.c
+++ b/src/tar.c
@@ -1443,8 +1443,7 @@ parse_opt (int key, char *arg, struct argp_state *state)
case 'K':
optloc_save (OC_STARTING_FILE, args->loc);
- starting_file_option = true;
- addname (arg, 0, true, NULL);
+ add_starting_file (arg);
break;
case ONE_FILE_SYSTEM_OPTION:
--
2.19.1

View File

@ -1,31 +0,0 @@
From 99d415e1902c2309a4a3da41b2f08e5719771336 Mon Sep 17 00:00:00 2001
From: Sergey Poznyakoff <gray@gnu.org>
Date: Fri, 21 Dec 2018 07:32:47 +0200
Subject: [PATCH 34/58] Reject pax options starting with equals sign
Bug reported in
http://lists.gnu.org/archive/html/bug-tar/2018-12/msg00010.html
* xheader.c (xheader_set_keyword_equal): Bail out if the keyword starts
with =
---
src/xheader.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/xheader.c b/src/xheader.c
index 980f050..e938502 100644
--- a/src/xheader.c
+++ b/src/xheader.c
@@ -185,6 +185,9 @@ xheader_set_keyword_equal (char *kw, char *eq)
bool global = true;
char *p = eq;
+ if (eq == kw)
+ USAGE_ERROR ((0, 0, _("Malformed pax option: %s"), quote (kw)));
+
if (eq[-1] == ':')
{
p--;
--
2.19.1

View File

@ -1,33 +0,0 @@
From 85c005ee1345c342f707f3c55317daf6cb050603 Mon Sep 17 00:00:00 2001
From: Sergey Poznyakoff <gray@gnu.org.ua>
Date: Thu, 10 Jan 2019 18:18:49 +0200
Subject: [PATCH 44/58] Remove erroneous abort() call
The call was introduced by commit ccef8581. It caused tar to abort
on perfectly normal operations, like untarring archives containing
./ with the -U option,
See http://lists.gnu.org/archive/html/bug-tar/2019-01/msg00019.html
for details.
* src/extract.c (maybe_recoverable): Remove misplaced call to abort().
---
src/extract.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/extract.c b/src/extract.c
index 090b866..8276f8f 100644
--- a/src/extract.c
+++ b/src/extract.c
@@ -787,7 +787,7 @@ maybe_recoverable (char *file_name, bool regular, bool *interdir_made)
case UNLINK_FIRST_OLD_FILES:
break;
}
- abort (); /* notreached */
+ FALLTHROUGH;
case ENOENT:
/* Attempt creating missing intermediate directories. */
--
2.19.1

View File

@ -1,30 +0,0 @@
From c1b569d9d61f129d2eefd1e87e6ea6cd96810788 Mon Sep 17 00:00:00 2001
From: Pavel Raiskup <praiskup@redhat.com>
Date: Tue, 31 Jul 2018 12:13:48 +0300
Subject: [PATCH 21/58] Report race on systems without O_DIRECTORY
* src/names.c (collect_and_sort_names): Report ENOTDIR after
successful fstat() but !S_ISDIR.
---
src/names.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/src/names.c b/src/names.c
index f6ad9fe..f4dc978 100644
--- a/src/names.c
+++ b/src/names.c
@@ -1767,6 +1767,11 @@ collect_and_sort_names (void)
name->found_count++;
add_hierarchy_to_namelist (&st, name);
}
+ else
+ {
+ errno = ENOTDIR;
+ open_diag (name->name);
+ }
}
}
--
2.19.1

View File

@ -1,45 +0,0 @@
From 2d00d8b32190ca7135673999b175850019746042 Mon Sep 17 00:00:00 2001
From: Sergey Poznyakoff <gray@gnu.org>
Date: Sat, 7 Apr 2018 10:33:27 +0300
Subject: [PATCH 10/58] Rewrite struct tm formatting
* src/list.c (tartime): Use strftime instead of manually formatting
fields of the struct tm. This should also suppress some gcc warnings.
---
src/list.c | 10 +++-------
1 file changed, 3 insertions(+), 7 deletions(-)
diff --git a/src/list.c b/src/list.c
index 14388a5..2cc5d40 100644
--- a/src/list.c
+++ b/src/list.c
@@ -23,7 +23,7 @@
#include <system.h>
#include <inttostr.h>
#include <quotearg.h>
-
+#include <time.h>
#include "common.h"
union block *current_header; /* points to current archive header */
@@ -1049,15 +1049,11 @@ tartime (struct timespec t, bool full_time)
{
if (full_time)
{
- sprintf (buffer, "%04ld-%02d-%02d %02d:%02d:%02d",
- tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday,
- tm->tm_hour, tm->tm_min, tm->tm_sec);
+ strftime (buffer, sizeof buffer, "%Y-%m-%d %H:%M:%S", tm);
code_ns_fraction (ns, buffer + strlen (buffer));
}
else
- sprintf (buffer, "%04ld-%02d-%02d %02d:%02d",
- tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday,
- tm->tm_hour, tm->tm_min);
+ strftime (buffer, sizeof buffer, "%Y-%m-%d %H:%M", tm);
return buffer;
}
--
2.19.1

View File

@ -1,94 +0,0 @@
From 9d1993f651d72f78b2afe416c72b1aeb0c1215ab Mon Sep 17 00:00:00 2001
From: Sergey Poznyakoff <gray@gnu.org>
Date: Fri, 28 Dec 2018 17:49:08 +0200
Subject: [PATCH 41/58] Work over a bug in gnulib error()
The error() function from glibc correctly prefixes each message it
prints with program_name as set by set_program_name. However, its
replacement from gnulib, which is linked in on systems where this
function is not available, prints the name returned by getprogname()
instead. Due to this messages output by tar subprocess (which sets its
program name to 'tar (child)') become indiscernible from those printed
by the main process. In particular, this breaks the remfiles01.at and
remfiles02.at test cases.
* configure.ac: Define ENABLE_ERROR_PRINT_PROGNAME if using
gnulib error().
* src/tar.c [ENABLE_ERROR_PRINT_PROGNAME] (tar_print_progname): New function.
(main) [ENABLE_ERROR_PRINT_PROGNAME]: Set error_print_progname.
---
configure.ac | 12 ++++++++++++
src/tar.c | 27 +++++++++++++++++++++++++--
2 files changed, 37 insertions(+), 2 deletions(-)
diff --git a/configure.ac b/configure.ac
index 66ed8ca..8e4207b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -102,6 +102,18 @@ gt_TYPE_SSIZE_T
# gnulib modules
gl_INIT
+
+if test $ac_cv_lib_error_at_line = no; then
+ # This means that the error() function is not present in libc, so
+ # the one from gnulib will be used instead. This function precedes
+ # error messages it prints with the program name as returned by getprogname()
+ # call, instead of using the name set by set_program_name.
+ # Install workaround.
+ AC_DEFINE([ENABLE_ERROR_PRINT_PROGNAME],[1],
+ [Enable the use of error_print_progname to print program name with error messages.
+ See comment to function tar_print_progname in src/tar.c])
+fi
+
# paxutils modules
tar_PAXUTILS
diff --git a/src/tar.c b/src/tar.c
index 9c939f3..721d777 100644
--- a/src/tar.c
+++ b/src/tar.c
@@ -2666,7 +2666,28 @@ decode_options (int argc, char **argv)
report_textual_dates (&args);
}
-
+
+#ifdef ENABLE_ERROR_PRINT_PROGNAME
+/* The error() function from glibc correctly prefixes each message it
+ prints with program_name as set by set_program_name. However, its
+ replacement from gnulib, which is linked in on systems where this
+ function is not available, prints the name returned by getprogname()
+ instead. Due to this messages output by tar subprocess (which sets its
+ program name to 'tar (child)') become indiscernible from those printed
+ by the main process. In particular, this breaks the remfiles01.at and
+ remfiles02.at test cases.
+
+ To avoid this, on such systems the following helper function is used
+ to print proper program name. Its address is assigned to the
+ error_print_progname variable, which error() then uses instead of
+ printing getprogname() result.
+ */
+static void
+tar_print_progname (void)
+{
+ fprintf (stderr, "%s: ", program_name);
+}
+#endif
/* Tar proper. */
@@ -2676,7 +2697,9 @@ main (int argc, char **argv)
{
set_start_time ();
set_program_name (argv[0]);
-
+#ifdef ENABLE_ERROR_PRINT_PROGNAME
+ error_print_progname = tar_print_progname;
+#endif
setlocale (LC_ALL, "");
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);
--
2.19.1

View File

@ -1,47 +0,0 @@
From 0a0242582f134c9994bbad77a57f64d388cf9e19 Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering@fb.com>
Date: Sun, 18 Mar 2018 21:32:19 -0700
Subject: [PATCH 13/58] maint: avoid -Wstringop-truncation warnings from
upcoming GCC8
* src/create.c (start_private_header, start_header): Convert
trivial uses of strncpy to memcpy, to avoid warnings like this:
In function 'strncpy',
inlined from 'start_private_header' at create.c:522:3:
/usr/include/bits/string_fortified.h:106:10: warning: \
'__builtin_strncpy' output truncated before terminating nul \
copying 2 bytes from a string of the same length \
[-Wstringop-truncation]
---
src/create.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/create.c b/src/create.c
index 35bcf5b..7737c52 100644
--- a/src/create.c
+++ b/src/create.c
@@ -518,8 +518,8 @@ start_private_header (const char *name, size_t size, time_t t)
MODE_TO_CHARS (S_IFREG|S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH, header->header.mode);
UID_TO_CHARS (0, header->header.uid);
GID_TO_CHARS (0, header->header.gid);
- strncpy (header->header.magic, TMAGIC, TMAGLEN);
- strncpy (header->header.version, TVERSION, TVERSLEN);
+ memcpy (header->header.magic, TMAGIC, TMAGLEN);
+ memcpy (header->header.version, TVERSION, TVERSLEN);
return header;
}
@@ -917,8 +917,8 @@ start_header (struct tar_stat_info *st)
case POSIX_FORMAT:
case USTAR_FORMAT:
- strncpy (header->header.magic, TMAGIC, TMAGLEN);
- strncpy (header->header.version, TVERSION, TVERSLEN);
+ memcpy (header->header.magic, TMAGIC, TMAGLEN);
+ memcpy (header->header.version, TVERSION, TVERSLEN);
break;
default:
--
2.19.1

View File

@ -1,50 +0,0 @@
From 2baa531ce53d5876d34f941a97b5041573da453a Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering@fb.com>
Date: Sun, 18 Mar 2018 21:20:28 -0700
Subject: [PATCH 12/58] maint: avoid -Wstringop-truncation warnings upcoming
GCC8
* src/buffer.c (gnu_add_multi_volume_header): Convert a use of
strncpy to memcpy, to avoid this warning:
In function 'strncpy',
inlined from 'gnu_add_multi_volume_header' at buffer.c:1782:3,
...
/usr/include/bits/string_fortified.h:106:10: error: '__builtin_strncpy'\
specified bound 100 equals destination size \
[-Werror=stringop-truncation]
---
src/buffer.c | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/src/buffer.c b/src/buffer.c
index 063e1be..b710c6a 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -1771,15 +1771,19 @@ gnu_add_multi_volume_header (struct bufmap *map)
{
int tmp;
union block *block = find_next_block ();
+ size_t len = strlen (map->file_name);
- if (strlen (map->file_name) > NAME_FIELD_SIZE)
- WARN ((0, 0,
- _("%s: file name too long to be stored in a GNU multivolume header, truncated"),
- quotearg_colon (map->file_name)));
+ if (len > NAME_FIELD_SIZE)
+ {
+ WARN ((0, 0,
+ _("%s: file name too long to be stored in a GNU multivolume header, truncated"),
+ quotearg_colon (map->file_name)));
+ len = NAME_FIELD_SIZE;
+ }
memset (block, 0, BLOCKSIZE);
- strncpy (block->header.name, map->file_name, NAME_FIELD_SIZE);
+ memcpy (block->header.name, map->file_name, len);
block->header.typeflag = GNUTYPE_MULTIVOL;
OFF_TO_CHARS (map->sizeleft, block->header.size);
--
2.19.1

View File

@ -1,43 +0,0 @@
From ccef8581b8673cadd1c084595de4efde956c3c2b Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering@fb.com>
Date: Sun, 18 Mar 2018 17:59:25 -0700
Subject: [PATCH 11/58] maint: avoid warnings from upcoming GCC8
* src/transform.c (_single_transform_name_to_obstack): Mark with
FALLTHROUGH statement rather than /* FALL THROUGH */ comment.
Only the former works with gcc-8.
* src/extract.c (maybe_recoverable): Call abort to tell gcc-8 that
this code is unreachable.
---
src/extract.c | 1 +
src/transform.c | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/extract.c b/src/extract.c
index 395db55..74987bb 100644
--- a/src/extract.c
+++ b/src/extract.c
@@ -788,6 +788,7 @@ maybe_recoverable (char *file_name, bool regular, bool *interdir_made)
case UNLINK_FIRST_OLD_FILES:
break;
}
+ abort (); /* notreached */
case ENOENT:
/* Attempt creating missing intermediate directories. */
diff --git a/src/transform.c b/src/transform.c
index e450dd2..3fae3c0 100644
--- a/src/transform.c
+++ b/src/transform.c
@@ -550,7 +550,7 @@ _single_transform_name_to_obstack (struct transform *tf, char *input)
default:
break;
}
- /*FALL THROUGH*/
+ FALLTHROUGH;
case ctl_upcase:
case ctl_locase:
--
2.19.1

View File

@ -1,73 +0,0 @@
From b531801d6f49d64a126720e6004aae7c800764b2 Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering@fb.com>
Date: Sat, 7 Apr 2018 08:41:46 -0700
Subject: [PATCH 16/58] --one-top-level: avoid a heap-buffer-overflow
* NEWS: Mention this.
* src/suffix.c (strip_compression_suffix): Fix string comparison guard.
Without this change, some ASAN-enabled test runs would fail with the
following. Also, strip an additional .tar suffix only if the just-
stripped suffix did not match /^\.t/".
==30815==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6020000002ed at pc 0x00000049d1f4 bp 0x7ffeb5906d50 sp 0x7ffeb5906500
READ of size 1 at 0x6020000002ed thread T0
SCARINESS: 12 (1-byte-read-heap-buffer-overflow)
#0 0x49d1f3 in __interceptor_strncmp /j/gcc/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:407
#1 0x5670f3 in strip_compression_suffix /j/tar/src/suffix.c:107
#2 0x575788 in decode_options /j/tar/src/tar.c:2545
#3 0x5760c0 in main /j/tar/src/tar.c:2708
#4 0x7f105090df29 in __libc_start_main ../csu/libc-start.c:308
#5 0x408629 in _start (/j/tar/src/tar+0x408629)
0x6020000002ed is located 3 bytes to the left of 6-byte region [0x6020000002f0,0x6020000002f6)
allocated by thread T0 here:
#0 0x4d0710 in __interceptor_malloc /j/gcc/libsanitizer/asan/asan_malloc_linux.cc:86
#1 0x4908ad in __interceptor_strndup /j/gcc/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:326
#2 0x5cbcbd in xstrndup /j/tar/gnu/xstrndup.c:32
#3 0x5a325b in base_name /j/tar/gnu/basename.c:57
#4 0x575772 in decode_options /j/tar/src/tar.c:2544
#5 0x5760c0 in main /j/tar/src/tar.c:2708
#6 0x7f105090df29 in __libc_start_main ../csu/libc-start.c:308
---
NEWS | 7 +++++--
src/suffix.c | 11 +++++++----
2 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/src/suffix.c b/src/suffix.c
index 66b5694..d787ea8 100644
--- a/src/suffix.c
+++ b/src/suffix.c
@@ -62,7 +62,7 @@ find_compression_suffix (const char *name, size_t *ret_len)
{
size_t len;
struct compression_suffix *p;
-
+
suf++;
len = strlen (suf);
@@ -101,10 +101,14 @@ strip_compression_suffix (const char *name)
{
char *s = NULL;
size_t len;
+ struct compression_suffix const *p = find_compression_suffix (name, &len);
- if (find_compression_suffix (name, &len))
+ if (p)
{
- if (strncmp (name + len - 4, ".tar", 4) == 0)
+ /* Strip an additional ".tar" suffix, but only if the just-stripped
+ "outer" suffix did not begin with "t". */
+ if (len > 4 && strncmp (name + len - 4, ".tar", 4) == 0
+ && p->suffix[0] != 't')
len -= 4;
if (len == 0)
return NULL;
@@ -114,4 +118,3 @@ strip_compression_suffix (const char *name)
}
return s;
}
-
--
2.19.1

View File

@ -1,129 +0,0 @@
From b451bfd224da44e93cf842f23455d755e48421dd Mon Sep 17 00:00:00 2001
From: Pavel Raiskup <praiskup@redhat.com>
Date: Mon, 28 Jul 2014 08:17:55 +0200
Subject: [PATCH 8/9] Fix for infinite loops during sparse file handling
Upstream bugreport (still downstream):
http://www.mail-archive.com/bug-tar@gnu.org/msg04432.html
Resolves: #1082608
---
THANKS | 1 +
src/sparse.c | 48 ++++++++++++++++++++++++++++++++----------------
2 files changed, 33 insertions(+), 16 deletions(-)
diff --git a/THANKS b/THANKS
index b4c5427..e74f71c 100644
--- a/THANKS
+++ b/THANKS
@@ -175,6 +175,7 @@ Fabio d'Alessi cars@civ.bio.unipd.it
Frank Heckenbach frank@g-n-u.de
Frank Koenen koenfr@lidp.com
Franz-Werner Gergen gergen@edvulx.mpi-stuttgart.mpg.de
+François Ouellet fouell@gmail.com
François Pinard pinard@iro.umontreal.ca
Fritz Elfert fritz@fsun.triltsch.de
George Chyu gschyu@ccgate.dp.beckman.com
diff --git a/src/sparse.c b/src/sparse.c
index 6a97676..53c1868 100644
--- a/src/sparse.c
+++ b/src/sparse.c
@@ -301,6 +301,7 @@ sparse_dump_region (struct tar_sparse_file *file, size_t i)
{
union block *blk;
off_t bytes_left = file->stat_info->sparse_map[i].numbytes;
+ const char *file_name = file->stat_info->orig_file_name;
if (!lseek_or_error (file, file->stat_info->sparse_map[i].offset))
return false;
@@ -314,13 +315,23 @@ sparse_dump_region (struct tar_sparse_file *file, size_t i)
bytes_read = safe_read (file->fd, blk->buffer, bufsize);
if (bytes_read == SAFE_READ_ERROR)
{
- read_diag_details (file->stat_info->orig_file_name,
+ read_diag_details (file_name,
(file->stat_info->sparse_map[i].offset
+ file->stat_info->sparse_map[i].numbytes
- bytes_left),
bufsize);
return false;
}
+ if (bytes_read == 0)
+ {
+ char buf[UINTMAX_STRSIZE_BOUND];
+ FATAL_ERROR ((0, 0,
+ ngettext ("%s: File shrank by %s byte",
+ "%s: File shrank by %s bytes",
+ bytes_left),
+ quotearg_colon (file_name),
+ offtostr (bytes_left, buf)));
+ }
memset (blk->buffer + bytes_read, 0, BLOCKSIZE - bytes_read);
bytes_left -= bytes_read;
@@ -475,33 +486,37 @@ sparse_skip_file (struct tar_stat_info *st)
static bool
check_sparse_region (struct tar_sparse_file *file, off_t beg, off_t end)
{
- if (!lseek_or_error (file, beg))
+ off_t offset = beg;
+
+ if (!lseek_or_error (file, offset))
return false;
- while (beg < end)
+ while (offset < end)
{
size_t bytes_read;
- size_t rdsize = BLOCKSIZE < end - beg ? BLOCKSIZE : end - beg;
+ size_t rdsize = BLOCKSIZE < end - offset ? BLOCKSIZE : end - offset;
char diff_buffer[BLOCKSIZE];
bytes_read = safe_read (file->fd, diff_buffer, rdsize);
if (bytes_read == SAFE_READ_ERROR)
{
read_diag_details (file->stat_info->orig_file_name,
- beg,
- rdsize);
- return false;
- }
- if (!zero_block_p (diff_buffer, bytes_read))
- {
- char begbuf[INT_BUFSIZE_BOUND (off_t)];
- report_difference (file->stat_info,
- _("File fragment at %s is not a hole"),
- offtostr (beg, begbuf));
+ offset, rdsize);
return false;
}
- beg += bytes_read;
+ if (bytes_read == 0
+ || !zero_block_p (diff_buffer, bytes_read))
+ {
+ char begbuf[INT_BUFSIZE_BOUND (off_t)];
+ const char *msg = bytes_read ? _("File fragment at %s is not a hole")
+ : _("Hole starting at %s is truncated");
+
+ report_difference (file->stat_info, msg, offtostr (beg, begbuf));
+ return false;
+ }
+
+ offset += bytes_read;
}
return true;
}
@@ -542,7 +557,8 @@ check_data_region (struct tar_sparse_file *file, size_t i)
file->dumped_size += bytes_read;
size_left -= bytes_read;
mv_size_left (file->stat_info->archive_file_size - file->dumped_size);
- if (memcmp (blk->buffer, diff_buffer, rdsize))
+ if (bytes_read == 0
+ || memcmp (blk->buffer, diff_buffer, bytes_read))
{
report_difference (file->stat_info, _("Contents differ"));
return false;
--
1.9.3

View File

@ -1,15 +0,0 @@
Per https://www.mail-archive.com/bug-tar@gnu.org/msg05440.html
diff --git a/tests/difflink.at b/tests/difflink.at
index eadfb08..4e01176 100644
--- a/tests/difflink.at
+++ b/tests/difflink.at
@@ -21,7 +21,7 @@ mkdir a
genfile -f a/x
ln -s x a/y
ln a/y a/z
-tar cf a.tar a
+tar cf a.tar a/x a/y a/z
rm a/z
ln -s x a/z
tar df a.tar

View File

@ -1,93 +0,0 @@
From 298cfc4743b9cca6cc0c685b9fce5b34827bec1b Mon Sep 17 00:00:00 2001
From: Pavel Raiskup <praiskup@redhat.com>
Date: Thu, 4 Jan 2018 18:21:27 +0100
Subject: [PATCH] tests: fix race in dirrem01 and dirrem02
Proposal:
https://www.mail-archive.com/bug-tar@gnu.org/msg05451.html
Previously the '--checkpoint-action=echo' was triggered after
'--checkpoint-action=sleep=1' - so the order of events *usually*
was (for --format='gnu'):
...
1. checkpoint handler before write of 'dir/sub' member
2. one-second delay
3. stderr write: 'tar: Write checkpoint 3'
4. write the member 'dir/sub' into the archive
5. check that the member's ctime has not been changed
6. genfile's detecting 'Write checkpoint', doing unlink
...
But sometimes, the genfile was fast enough to win the race and
unlinked the directory before the member was written into the
archive (IOW, the order was 1-2-3-6-4-5). This led to the
occasional warning 'tar: dir/sub: file changed as we read it'.
Swap the order of 'sleep=1' and 'echo' actions so the genfile
utility has (hopefully) enough time to do the unlink before
writing the file into the archive (enforce 1-2-3-6-4-5 order).
* tests/dirrem01.at: Swap 'sleep=1' and 'echo' actions.
* tests/dirrem02.at: Likewise.
---
tests/dirrem01.at | 5 +++--
tests/dirrem02.at | 7 ++++---
2 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/tests/dirrem01.at b/tests/dirrem01.at
index 40344dc..dabc206 100644
--- a/tests/dirrem01.at
+++ b/tests/dirrem01.at
@@ -47,14 +47,15 @@ gnu) CPT=3;;
esac
genfile --run --checkpoint=$CPT --unlink dir/sub/file2 --unlink dir/sub -- \
- tar --blocking-factor=1 --checkpoint=1 --checkpoint-action='sleep=1' \
- --checkpoint-action='echo' -c -f archive.tar \
+ tar --blocking-factor=1 --checkpoint=1 --checkpoint-action='echo' \
+ --checkpoint-action='sleep=1' -c -f archive.tar \
--listed-incremental db -v dir >/dev/null
],
[1],
[ignore],
[tar: dir: Directory is new
tar: dir/sub: Directory is new
+tar: dir/sub: file changed as we read it
tar: dir/sub: File removed before we read it
],[],[],[gnu,posix])
diff --git a/tests/dirrem02.at b/tests/dirrem02.at
index e1cf9ef..924454f 100644
--- a/tests/dirrem02.at
+++ b/tests/dirrem02.at
@@ -20,7 +20,7 @@
# Description:
#
-# When an explicitley named directory disappears during creation
+# When an explicitly named directory disappears during creation
# of incremental dump, tar should still exit with TAREXIT_FAILURE (2).
#
# For further details see dirrem01.at
@@ -44,14 +44,15 @@ gnu) CPT=3;;
esac
genfile --run --checkpoint=$CPT --unlink dir/sub/file2 --unlink dir/sub -- \
- tar --blocking-factor=1 --checkpoint=1 --checkpoint-action='sleep=1' \
- --checkpoint-action='echo' -c -f archive.tar \
+ tar --blocking-factor=1 --checkpoint=1 --checkpoint-action='echo' \
+ --checkpoint-action='sleep=1' -c -f archive.tar \
--listed-incremental db -v dir dir/sub >/dev/null
],
[2],
[ignore],
[tar: dir: Directory is new
tar: dir/sub: Directory is new
+tar: dir/sub: file changed as we read it
tar: dir/sub: Cannot open: No such file or directory
tar: Exiting with failure status due to previous errors
],[],[],[gnu,posix])
--
2.14.3

Binary file not shown.

View File

@ -1,7 +0,0 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.15 (GNU/Linux)
iEYEABECAAYFAlo2WDAACgkQNgKwf1XQxzLIAwCcCkJzqedt2FUq1N5ysPFomhvS
SnIAnj+0Y7vNI1E4w/ektRMB/HTQceeK
=TjVE
-----END PGP SIGNATURE-----

BIN
tar-1.32.tar.xz Normal file

Binary file not shown.

7
tar-1.32.tar.xz.sig Normal file
View File

@ -0,0 +1,7 @@
-----BEGIN PGP SIGNATURE-----
iG4EABECAC4WIQQyX2UMTCtq1YgHMno2ArB/VdDHMgUCXHFHdhAcZ3JheUBnbnUu
b3JnLnVhAAoJEDYCsH9V0Mcy61oAni2Gwnao+qzsebDfH3ePo4FWdHKEAJ9IP8h7
f96xDOstDrfKQjY/tqUrWg==
=eh8f
-----END PGP SIGNATURE-----

View File

@ -1,6 +1,6 @@
Name: tar Name: tar
Version: 1.30 Version: 1.32
Release: 11 Release: 1
Epoch: 2 Epoch: 2
Summary: An organized and systematic method of controlling a large amount of data Summary: An organized and systematic method of controlling a large amount of data
License: GPLv3+ License: GPLv3+
@ -16,32 +16,6 @@ Patch0002: tar-1.28-vfatTruncate.patch
Patch0003: tar-1.29-wildcards.patch Patch0003: tar-1.29-wildcards.patch
Patch0004: tar-1.28-atime-rofs.patch Patch0004: tar-1.28-atime-rofs.patch
Patch0005: tar-1.28-document-exclude-mistakes.patch Patch0005: tar-1.28-document-exclude-mistakes.patch
Patch0006: tar-1.28-sparse-inf-loops.patch
Patch0007: tar-1.30-tests-difflink.patch
Patch0008: tar-1.30-tests-dirrem.patch
Patch0009: Rewrite-struct-tm-formatting.patch
Patch0010: maint-avoid-warnings-from-upcoming-GCC8.patch
Patch0011: maint-avoid-Wstringop-truncation-warnings-upcoming-G.patch
Patch0012: maint-avoid-Wstringop-truncation-warnings-from-upcom.patch
Patch0013: one-top-level-avoid-a-heap-buffer-overflow.patch
Patch0014: Avoid-some-resource-leaks.patch
Patch0015: Report-race-on-systems-without-O_DIRECTORY.patch
Patch0016: Fix-double-free-introduced-by-577dc345.patch
Patch0017: Fix-improper-memory-access.patch
Patch0018: Fix-buffer-overflow.patch
Patch0019: Reject-pax-options-starting-with-equals-sign.patch
Patch0020: Fix-error-handling-when-reading-incremental-snapshot.patch
Patch0021: Fix-semantics-of-K-used-together-with-explicit-membe.patch
Patch0022: Bugfix.patch
Patch0023: Disallow-modifications-to-the-global-pax-extended-he.patch
Patch0024: Work-over-a-bug-in-gnulib-error.patch
Patch0025: Remove-erroneous-abort-call.patch
Patch0026: Fix-iconv-usage.patch
Patch0027: Fix-compilation-without-iconv.patch
Patch0028: Fix-build-on-AIX.patch
Patch0029: Fix-possible-NULL-dereference-savannah-bug-55369.patch
Patch0030: Fix-CVE-2018-20482.patch
%description %description
GNU Tar provides the ability to create tar archives, as well as various other GNU Tar provides the ability to create tar archives, as well as various other
@ -100,6 +74,9 @@ make check
%{_infodir}/tar.info* %{_infodir}/tar.info*
%changelog %changelog
* Mon Jul 27 2020 shixuantong <shixuantong> - 1.32-1
- update to 1.32-1
* Tue Feb 18 2020 openEuler Buildteam <buildteam@openeuler.org> - 2:1.30-11 * Tue Feb 18 2020 openEuler Buildteam <buildteam@openeuler.org> - 2:1.30-11
- Enable check - Enable check