mirror of
https://git.yoctoproject.org/poky
synced 2026-06-05 14:29:48 +00:00
libarchive:upgrade 3.3.3 -> 3.4.0
-libarchive/CVE-2018-1000877.patch -libarchive/CVE-2018-1000878.patch -libarchive/CVE-2018-1000879.patch -libarchive/CVE-2018-1000880.patch -libarchive/CVE-2019-1000019.patch -libarchive/CVE-2019-1000020.patch -libarchive/bug1066.patch -libarchive/non-recursive-extract-and-list.patch Removed since these are included in 3.4.0. -License-Update: Copyright year updated to 2018. (From OE-Core rev: 4f8fa80b6c57f29c68678cabcac5d114d1ff0500) Signed-off-by: Zang Ruochen <zangrc.fnst@cn.fujitsu.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
committed by
Richard Purdie
parent
deafb85ecd
commit
662c64166f
@@ -1,38 +0,0 @@
|
||||
CVE: CVE-2018-1000877
|
||||
Upstream-Status: Backport
|
||||
Signed-off-by: Ross Burton <ross.burton@intel.com>
|
||||
|
||||
From 021efa522ad729ff0f5806c4ce53e4a6cc1daa31 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Axtens <dja@axtens.net>
|
||||
Date: Tue, 20 Nov 2018 17:56:29 +1100
|
||||
Subject: [PATCH] Avoid a double-free when a window size of 0 is specified
|
||||
|
||||
new_size can be 0 with a malicious or corrupted RAR archive.
|
||||
|
||||
realloc(area, 0) is equivalent to free(area), so the region would
|
||||
be free()d here and the free()d again in the cleanup function.
|
||||
|
||||
Found with a setup running AFL, afl-rb, and qsym.
|
||||
---
|
||||
libarchive/archive_read_support_format_rar.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/libarchive/archive_read_support_format_rar.c b/libarchive/archive_read_support_format_rar.c
|
||||
index 23452222..6f419c27 100644
|
||||
--- a/libarchive/archive_read_support_format_rar.c
|
||||
+++ b/libarchive/archive_read_support_format_rar.c
|
||||
@@ -2300,6 +2300,11 @@ parse_codes(struct archive_read *a)
|
||||
new_size = DICTIONARY_MAX_SIZE;
|
||||
else
|
||||
new_size = rar_fls((unsigned int)rar->unp_size) << 1;
|
||||
+ if (new_size == 0) {
|
||||
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
|
||||
+ "Zero window size is invalid.");
|
||||
+ return (ARCHIVE_FATAL);
|
||||
+ }
|
||||
new_window = realloc(rar->lzss.window, new_size);
|
||||
if (new_window == NULL) {
|
||||
archive_set_error(&a->archive, ENOMEM,
|
||||
--
|
||||
2.20.0
|
||||
|
||||
@@ -1,79 +0,0 @@
|
||||
CVE: CVE-2018-1000878
|
||||
Upstream-Status: Backport
|
||||
Signed-off-by: Ross Burton <ross.burton@intel.com>
|
||||
|
||||
From bfcfe6f04ed20db2504db8a254d1f40a1d84eb28 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Axtens <dja@axtens.net>
|
||||
Date: Tue, 4 Dec 2018 00:55:22 +1100
|
||||
Subject: [PATCH] rar: file split across multi-part archives must match
|
||||
|
||||
Fuzzing uncovered some UAF and memory overrun bugs where a file in a
|
||||
single file archive reported that it was split across multiple
|
||||
volumes. This was caused by ppmd7 operations calling
|
||||
rar_br_fillup. This would invoke rar_read_ahead, which would in some
|
||||
situations invoke archive_read_format_rar_read_header. That would
|
||||
check the new file name against the old file name, and if they didn't
|
||||
match up it would free the ppmd7 buffer and allocate a new
|
||||
one. However, because the ppmd7 decoder wasn't actually done with the
|
||||
buffer, it would continue to used the freed buffer. Both reads and
|
||||
writes to the freed region can be observed.
|
||||
|
||||
This is quite tricky to solve: once the buffer has been freed it is
|
||||
too late, as the ppmd7 decoder functions almost universally assume
|
||||
success - there's no way for ppmd_read to signal error, nor are there
|
||||
good ways for functions like Range_Normalise to propagate them. So we
|
||||
can't detect after the fact that we're in an invalid state - e.g. by
|
||||
checking rar->cursor, we have to prevent ourselves from ever ending up
|
||||
there. So, when we are in the dangerous part or rar_read_ahead that
|
||||
assumes a valid split, we set a flag force read_header to either go
|
||||
down the path for split files or bail. This means that the ppmd7
|
||||
decoder keeps a valid buffer and just runs out of data.
|
||||
|
||||
Found with a combination of AFL, afl-rb and qsym.
|
||||
---
|
||||
libarchive/archive_read_support_format_rar.c | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/libarchive/archive_read_support_format_rar.c b/libarchive/archive_read_support_format_rar.c
|
||||
index 6f419c27..a8cc5c94 100644
|
||||
--- a/libarchive/archive_read_support_format_rar.c
|
||||
+++ b/libarchive/archive_read_support_format_rar.c
|
||||
@@ -258,6 +258,7 @@ struct rar
|
||||
struct data_block_offsets *dbo;
|
||||
unsigned int cursor;
|
||||
unsigned int nodes;
|
||||
+ char filename_must_match;
|
||||
|
||||
/* LZSS members */
|
||||
struct huffman_code maincode;
|
||||
@@ -1560,6 +1561,12 @@ read_header(struct archive_read *a, struct archive_entry *entry,
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
+ else if (rar->filename_must_match)
|
||||
+ {
|
||||
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
|
||||
+ "Mismatch of file parts split across multi-volume archive");
|
||||
+ return (ARCHIVE_FATAL);
|
||||
+ }
|
||||
|
||||
rar->filename_save = (char*)realloc(rar->filename_save,
|
||||
filename_size + 1);
|
||||
@@ -2933,12 +2940,14 @@ rar_read_ahead(struct archive_read *a, size_t min, ssize_t *avail)
|
||||
else if (*avail == 0 && rar->main_flags & MHD_VOLUME &&
|
||||
rar->file_flags & FHD_SPLIT_AFTER)
|
||||
{
|
||||
+ rar->filename_must_match = 1;
|
||||
ret = archive_read_format_rar_read_header(a, a->entry);
|
||||
if (ret == (ARCHIVE_EOF))
|
||||
{
|
||||
rar->has_endarc_header = 1;
|
||||
ret = archive_read_format_rar_read_header(a, a->entry);
|
||||
}
|
||||
+ rar->filename_must_match = 0;
|
||||
if (ret != (ARCHIVE_OK))
|
||||
return NULL;
|
||||
return rar_read_ahead(a, min, avail);
|
||||
--
|
||||
2.20.0
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
CVE: CVE-2018-1000879
|
||||
Upstream-Status: Backport
|
||||
Signed-off-by: Ross Burton <ross.burton@intel.com>
|
||||
|
||||
From 15bf44fd2c1ad0e3fd87048b3fcc90c4dcff1175 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Axtens <dja@axtens.net>
|
||||
Date: Tue, 4 Dec 2018 14:29:42 +1100
|
||||
Subject: [PATCH] Skip 0-length ACL fields
|
||||
|
||||
Currently, it is possible to create an archive that crashes bsdtar
|
||||
with a malformed ACL:
|
||||
|
||||
Program received signal SIGSEGV, Segmentation fault.
|
||||
archive_acl_from_text_l (acl=<optimised out>, text=0x7e2e92 "", want_type=<optimised out>, sc=<optimised out>) at libarchive/archive_acl.c:1726
|
||||
1726 switch (*s) {
|
||||
(gdb) p n
|
||||
$1 = 1
|
||||
(gdb) p field[n]
|
||||
$2 = {start = 0x0, end = 0x0}
|
||||
|
||||
Stop this by checking that the length is not zero before beginning
|
||||
the switch statement.
|
||||
|
||||
I am pretty sure this is the bug mentioned in the qsym paper [1],
|
||||
and I was able to replicate it with a qsym + AFL + afl-rb setup.
|
||||
|
||||
[1] https://www.usenix.org/conference/usenixsecurity18/presentation/yun
|
||||
---
|
||||
libarchive/archive_acl.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/libarchive/archive_acl.c b/libarchive/archive_acl.c
|
||||
index 512beee1..7beeee86 100644
|
||||
--- a/libarchive/archive_acl.c
|
||||
+++ b/libarchive/archive_acl.c
|
||||
@@ -1723,6 +1723,11 @@ archive_acl_from_text_l(struct archive_acl *acl, const char *text,
|
||||
st = field[n].start + 1;
|
||||
len = field[n].end - field[n].start;
|
||||
|
||||
+ if (len == 0) {
|
||||
+ ret = ARCHIVE_WARN;
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
switch (*s) {
|
||||
case 'u':
|
||||
if (len == 1 || (len == 4
|
||||
--
|
||||
2.20.0
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
CVE: CVE-2018-1000880
|
||||
Upstream-Status: Backport
|
||||
Signed-off-by: Ross Burton <ross.burton@intel.com>
|
||||
|
||||
From 9c84b7426660c09c18cc349f6d70b5f8168b5680 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Axtens <dja@axtens.net>
|
||||
Date: Tue, 4 Dec 2018 16:33:42 +1100
|
||||
Subject: [PATCH] warc: consume data once read
|
||||
|
||||
The warc decoder only used read ahead, it wouldn't actually consume
|
||||
data that had previously been printed. This means that if you specify
|
||||
an invalid content length, it will just reprint the same data over
|
||||
and over and over again until it hits the desired length.
|
||||
|
||||
This means that a WARC resource with e.g.
|
||||
Content-Length: 666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666665
|
||||
but only a few hundred bytes of data, causes a quasi-infinite loop.
|
||||
|
||||
Consume data in subsequent calls to _warc_read.
|
||||
|
||||
Found with an AFL + afl-rb + qsym setup.
|
||||
---
|
||||
libarchive/archive_read_support_format_warc.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/libarchive/archive_read_support_format_warc.c b/libarchive/archive_read_support_format_warc.c
|
||||
index e8753853..e8fc8428 100644
|
||||
--- a/libarchive/archive_read_support_format_warc.c
|
||||
+++ b/libarchive/archive_read_support_format_warc.c
|
||||
@@ -386,6 +386,11 @@ _warc_read(struct archive_read *a, const void **buf, size_t *bsz, int64_t *off)
|
||||
return (ARCHIVE_EOF);
|
||||
}
|
||||
|
||||
+ if (w->unconsumed) {
|
||||
+ __archive_read_consume(a, w->unconsumed);
|
||||
+ w->unconsumed = 0U;
|
||||
+ }
|
||||
+
|
||||
rab = __archive_read_ahead(a, 1U, &nrd);
|
||||
if (nrd < 0) {
|
||||
*bsz = 0U;
|
||||
--
|
||||
2.20.0
|
||||
|
||||
@@ -1,59 +0,0 @@
|
||||
CVE: CVE-2019-1000019
|
||||
Upstream-Status: Backport
|
||||
Signed-off-by: Ross Burton <ross.burton@intel.com>
|
||||
|
||||
From 65a23f5dbee4497064e9bb467f81138a62b0dae1 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Axtens <dja@axtens.net>
|
||||
Date: Tue, 1 Jan 2019 16:01:40 +1100
|
||||
Subject: [PATCH 2/2] 7zip: fix crash when parsing certain archives
|
||||
|
||||
Fuzzing with CRCs disabled revealed that a call to get_uncompressed_data()
|
||||
would sometimes fail to return at least 'minimum' bytes. This can cause
|
||||
the crc32() invocation in header_bytes to read off into invalid memory.
|
||||
|
||||
A specially crafted archive can use this to cause a crash.
|
||||
|
||||
An ASAN trace is below, but ASAN is not required - an uninstrumented
|
||||
binary will also crash.
|
||||
|
||||
==7719==ERROR: AddressSanitizer: SEGV on unknown address 0x631000040000 (pc 0x7fbdb3b3ec1d bp 0x7ffe77a51310 sp 0x7ffe77a51150 T0)
|
||||
==7719==The signal is caused by a READ memory access.
|
||||
#0 0x7fbdb3b3ec1c in crc32_z (/lib/x86_64-linux-gnu/libz.so.1+0x2c1c)
|
||||
#1 0x84f5eb in header_bytes (/tmp/libarchive/bsdtar+0x84f5eb)
|
||||
#2 0x856156 in read_Header (/tmp/libarchive/bsdtar+0x856156)
|
||||
#3 0x84e134 in slurp_central_directory (/tmp/libarchive/bsdtar+0x84e134)
|
||||
#4 0x849690 in archive_read_format_7zip_read_header (/tmp/libarchive/bsdtar+0x849690)
|
||||
#5 0x5713b7 in _archive_read_next_header2 (/tmp/libarchive/bsdtar+0x5713b7)
|
||||
#6 0x570e63 in _archive_read_next_header (/tmp/libarchive/bsdtar+0x570e63)
|
||||
#7 0x6f08bd in archive_read_next_header (/tmp/libarchive/bsdtar+0x6f08bd)
|
||||
#8 0x52373f in read_archive (/tmp/libarchive/bsdtar+0x52373f)
|
||||
#9 0x5257be in tar_mode_x (/tmp/libarchive/bsdtar+0x5257be)
|
||||
#10 0x51daeb in main (/tmp/libarchive/bsdtar+0x51daeb)
|
||||
#11 0x7fbdb27cab96 in __libc_start_main /build/glibc-OTsEL5/glibc-2.27/csu/../csu/libc-start.c:310
|
||||
#12 0x41dd09 in _start (/tmp/libarchive/bsdtar+0x41dd09)
|
||||
|
||||
This was primarly done with afl and FairFuzz. Some early corpus entries
|
||||
may have been generated by qsym.
|
||||
---
|
||||
libarchive/archive_read_support_format_7zip.c | 8 +-------
|
||||
1 file changed, 1 insertion(+), 7 deletions(-)
|
||||
|
||||
diff --git a/libarchive/archive_read_support_format_7zip.c b/libarchive/archive_read_support_format_7zip.c
|
||||
index bccbf8966..b6d1505d3 100644
|
||||
--- a/libarchive/archive_read_support_format_7zip.c
|
||||
+++ b/libarchive/archive_read_support_format_7zip.c
|
||||
@@ -2964,13 +2964,7 @@ get_uncompressed_data(struct archive_read *a, const void **buff, size_t size,
|
||||
if (zip->codec == _7Z_COPY && zip->codec2 == (unsigned long)-1) {
|
||||
/* Copy mode. */
|
||||
|
||||
- /*
|
||||
- * Note: '1' here is a performance optimization.
|
||||
- * Recall that the decompression layer returns a count of
|
||||
- * available bytes; asking for more than that forces the
|
||||
- * decompressor to combine reads by copying data.
|
||||
- */
|
||||
- *buff = __archive_read_ahead(a, 1, &bytes_avail);
|
||||
+ *buff = __archive_read_ahead(a, minimum, &bytes_avail);
|
||||
if (bytes_avail <= 0) {
|
||||
archive_set_error(&a->archive,
|
||||
ARCHIVE_ERRNO_FILE_FORMAT,
|
||||
@@ -1,61 +0,0 @@
|
||||
CVE: CVE-2019-1000020
|
||||
Upstream-Status: Backport
|
||||
Signed-off-by: Ross Burton <ross.burton@intel.com>
|
||||
|
||||
From 8312eaa576014cd9b965012af51bc1f967b12423 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Axtens <dja@axtens.net>
|
||||
Date: Tue, 1 Jan 2019 17:10:49 +1100
|
||||
Subject: [PATCH 1/2] iso9660: Fail when expected Rockridge extensions is
|
||||
missing
|
||||
|
||||
A corrupted or malicious ISO9660 image can cause read_CE() to loop
|
||||
forever.
|
||||
|
||||
read_CE() calls parse_rockridge(), expecting a Rockridge extension
|
||||
to be read. However, parse_rockridge() is structured as a while
|
||||
loop starting with a sanity check, and if the sanity check fails
|
||||
before the loop has run, the function returns ARCHIVE_OK without
|
||||
advancing the position in the file. This causes read_CE() to retry
|
||||
indefinitely.
|
||||
|
||||
Make parse_rockridge() return ARCHIVE_WARN if it didn't read an
|
||||
extension. As someone with no real knowledge of the format, this
|
||||
seems more apt than ARCHIVE_FATAL, but both the call-sites escalate
|
||||
it to a fatal error immediately anyway.
|
||||
|
||||
Found with a combination of AFL, afl-rb (FairFuzz) and qsym.
|
||||
---
|
||||
libarchive/archive_read_support_format_iso9660.c | 11 ++++++++++-
|
||||
1 file changed, 10 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libarchive/archive_read_support_format_iso9660.c b/libarchive/archive_read_support_format_iso9660.c
|
||||
index 28acfefbb..bad8f1dfe 100644
|
||||
--- a/libarchive/archive_read_support_format_iso9660.c
|
||||
+++ b/libarchive/archive_read_support_format_iso9660.c
|
||||
@@ -2102,6 +2102,7 @@ parse_rockridge(struct archive_read *a, struct file_info *file,
|
||||
const unsigned char *p, const unsigned char *end)
|
||||
{
|
||||
struct iso9660 *iso9660;
|
||||
+ int entry_seen = 0;
|
||||
|
||||
iso9660 = (struct iso9660 *)(a->format->data);
|
||||
|
||||
@@ -2257,8 +2258,16 @@ parse_rockridge(struct archive_read *a, struct file_info *file,
|
||||
}
|
||||
|
||||
p += p[2];
|
||||
+ entry_seen = 1;
|
||||
+ }
|
||||
+
|
||||
+ if (entry_seen)
|
||||
+ return (ARCHIVE_OK);
|
||||
+ else {
|
||||
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
|
||||
+ "Tried to parse Rockridge extensions, but none found");
|
||||
+ return (ARCHIVE_WARN);
|
||||
}
|
||||
- return (ARCHIVE_OK);
|
||||
}
|
||||
|
||||
static int
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
libarchive-3.3.3: Fix bug1066
|
||||
|
||||
[No upstream tracking] -- https://github.com/libarchive/libarchive/pull/1066
|
||||
|
||||
archive_write_set_format_*.c: fix out of bounds read on empty string () filename
|
||||
for guntar, pax and v7tar
|
||||
|
||||
There is an out of bounds read flaw in the archive_write_gnutar_header,
|
||||
archive_write_pax_header and archive_write_v7tar_header functions which
|
||||
could leds to cause a denial of service.
|
||||
|
||||
Upstream-Status: Backport [https://github.com/libarchive/libarchive/commit/c246ec5d058a3f70a2d3fb765f92fe9db77b25df]
|
||||
Bug: 1066
|
||||
Signed-off-by: Andrej Valek <andrej.valek@siemens.com>
|
||||
|
||||
diff --git a/libarchive/archive_write_set_format_gnutar.c b/libarchive/archive_write_set_format_gnutar.c
|
||||
index 2d858c9..1966c53 100644
|
||||
--- a/libarchive/archive_write_set_format_gnutar.c
|
||||
+++ b/libarchive/archive_write_set_format_gnutar.c
|
||||
@@ -339,7 +339,7 @@ archive_write_gnutar_header(struct archive_write *a,
|
||||
* case getting WCS failed. On POSIX, this is a
|
||||
* normal operation.
|
||||
*/
|
||||
- if (p != NULL && p[strlen(p) - 1] != '/') {
|
||||
+ if (p != NULL && p[0] != '\0' && p[strlen(p) - 1] != '/') {
|
||||
struct archive_string as;
|
||||
|
||||
archive_string_init(&as);
|
||||
diff --git a/libarchive/archive_write_set_format_pax.c b/libarchive/archive_write_set_format_pax.c
|
||||
index 6a301ac..4cfa8ff 100644
|
||||
--- a/libarchive/archive_write_set_format_pax.c
|
||||
+++ b/libarchive/archive_write_set_format_pax.c
|
||||
@@ -660,7 +660,7 @@ archive_write_pax_header(struct archive_write *a,
|
||||
* case getting WCS failed. On POSIX, this is a
|
||||
* normal operation.
|
||||
*/
|
||||
- if (p != NULL && p[strlen(p) - 1] != '/') {
|
||||
+ if (p != NULL && p[0] != '\0' && p[strlen(p) - 1] != '/') {
|
||||
struct archive_string as;
|
||||
|
||||
archive_string_init(&as);
|
||||
diff --git a/libarchive/archive_write_set_format_v7tar.c b/libarchive/archive_write_set_format_v7tar.c
|
||||
index 62b1522..53c0db0 100644
|
||||
--- a/libarchive/archive_write_set_format_v7tar.c
|
||||
+++ b/libarchive/archive_write_set_format_v7tar.c
|
||||
@@ -284,7 +284,7 @@ archive_write_v7tar_header(struct archive_write *a, struct archive_entry *entry)
|
||||
* case getting WCS failed. On POSIX, this is a
|
||||
* normal operation.
|
||||
*/
|
||||
- if (p != NULL && p[strlen(p) - 1] != '/') {
|
||||
+ if (p != NULL && p[0] != '\0' && p[strlen(p) - 1] != '/') {
|
||||
struct archive_string as;
|
||||
|
||||
archive_string_init(&as);
|
||||
@@ -1,153 +0,0 @@
|
||||
From 47f7566f6829c2b14e21bbbba699916de4998c72 Mon Sep 17 00:00:00 2001
|
||||
From: Patrick Ohly <patrick.ohly@intel.com>
|
||||
Date: Mon, 24 Oct 2016 12:54:48 +0200
|
||||
Subject: [PATCH 1/1] non-recursive extract and list
|
||||
|
||||
Sometimes it makes sense to extract or list a directory contained in
|
||||
an archive without also doing the same for the content of the
|
||||
directory, i.e. allowing -n (= --no-recursion) in combination with the
|
||||
x and t modes.
|
||||
|
||||
bsdtar uses the match functionality in libarchive to track include
|
||||
matches. A new libarchive API call
|
||||
archive_match_include_directories_recursively() gets introduced to
|
||||
influence the matching behavior, with the default behavior as before.
|
||||
|
||||
Non-recursive matching can be achieved by anchoring the path match at
|
||||
both start and end. Asking for a directory which itself isn't in the
|
||||
archive when in non-recursive mode is an error and handled by the
|
||||
existing mechanism for tracking unused inclusion entries.
|
||||
|
||||
Upstream-Status: Submitted [https://github.com/libarchive/libarchive/pull/812]
|
||||
|
||||
Signed-off-by: Patrick Ohly <patrick.ohly@intel.com>
|
||||
|
||||
---
|
||||
libarchive/archive.h | 2 ++
|
||||
libarchive/archive_match.c | 30 +++++++++++++++++++++++++++++-
|
||||
tar/bsdtar.1 | 3 +--
|
||||
tar/bsdtar.c | 12 ++++++++++--
|
||||
4 files changed, 42 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/libarchive/archive.h b/libarchive/archive.h
|
||||
index 32710201..59fb4aa6 100644
|
||||
--- a/libarchive/archive.h
|
||||
+++ b/libarchive/archive.h
|
||||
@@ -1093,6 +1093,8 @@ __LA_DECL int archive_match_excluded(struct archive *,
|
||||
*/
|
||||
__LA_DECL int archive_match_path_excluded(struct archive *,
|
||||
struct archive_entry *);
|
||||
+/* Control recursive inclusion of directory content when directory is included. Default on. */
|
||||
+__LA_DECL int archive_match_include_directories_recursively(struct archive *, int _enabled);
|
||||
/* Add exclusion pathname pattern. */
|
||||
__LA_DECL int archive_match_exclude_pattern(struct archive *, const char *);
|
||||
__LA_DECL int archive_match_exclude_pattern_w(struct archive *,
|
||||
diff --git a/libarchive/archive_match.c b/libarchive/archive_match.c
|
||||
index be72066e..bb6a3407 100644
|
||||
--- a/libarchive/archive_match.c
|
||||
+++ b/libarchive/archive_match.c
|
||||
@@ -93,6 +93,9 @@ struct archive_match {
|
||||
/* exclusion/inclusion set flag. */
|
||||
int setflag;
|
||||
|
||||
+ /* Recursively include directory content? */
|
||||
+ int recursive_include;
|
||||
+
|
||||
/*
|
||||
* Matching filename patterns.
|
||||
*/
|
||||
@@ -223,6 +226,7 @@ archive_match_new(void)
|
||||
return (NULL);
|
||||
a->archive.magic = ARCHIVE_MATCH_MAGIC;
|
||||
a->archive.state = ARCHIVE_STATE_NEW;
|
||||
+ a->recursive_include = 1;
|
||||
match_list_init(&(a->inclusions));
|
||||
match_list_init(&(a->exclusions));
|
||||
__archive_rb_tree_init(&(a->exclusion_tree), &rb_ops_mbs);
|
||||
@@ -471,6 +475,28 @@ archive_match_path_excluded(struct archive *_a,
|
||||
}
|
||||
|
||||
/*
|
||||
+ * When recursive inclusion of directory content is enabled,
|
||||
+ * an inclusion pattern that matches a directory will also
|
||||
+ * include everything beneath that directory. Enabled by default.
|
||||
+ *
|
||||
+ * For compatibility with GNU tar, exclusion patterns always
|
||||
+ * match if a subset of the full patch matches (i.e., they are
|
||||
+ * are not rooted at the beginning of the path) and thus there
|
||||
+ * is no corresponding non-recursive exclusion mode.
|
||||
+ */
|
||||
+int
|
||||
+archive_match_include_directories_recursively(struct archive *_a, int _enabled)
|
||||
+{
|
||||
+ struct archive_match *a;
|
||||
+
|
||||
+ archive_check_magic(_a, ARCHIVE_MATCH_MAGIC,
|
||||
+ ARCHIVE_STATE_NEW, "archive_match_include_directories_recursively");
|
||||
+ a = (struct archive_match *)_a;
|
||||
+ a->recursive_include = _enabled;
|
||||
+ return (ARCHIVE_OK);
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
* Utility functions to get statistic information for inclusion patterns.
|
||||
*/
|
||||
int
|
||||
@@ -781,7 +807,9 @@ static int
|
||||
match_path_inclusion(struct archive_match *a, struct match *m,
|
||||
int mbs, const void *pn)
|
||||
{
|
||||
- int flag = PATHMATCH_NO_ANCHOR_END;
|
||||
+ int flag = a->recursive_include ?
|
||||
+ PATHMATCH_NO_ANCHOR_END : /* Prefix match is good enough. */
|
||||
+ 0; /* Full match required. */
|
||||
int r;
|
||||
|
||||
if (mbs) {
|
||||
diff --git a/tar/bsdtar.1 b/tar/bsdtar.1
|
||||
index 132e1145..1dd2a847 100644
|
||||
--- a/tar/bsdtar.1
|
||||
+++ b/tar/bsdtar.1
|
||||
@@ -386,8 +386,7 @@ and the default behavior in c, r, and u modes or if
|
||||
.Nm
|
||||
is run in x mode as root.
|
||||
.It Fl n , Fl Fl norecurse , Fl Fl no-recursion
|
||||
-(c, r, u modes only)
|
||||
-Do not recursively archive the contents of directories.
|
||||
+Do not recursively archive (c, r, u), extract (x) or list (t) the contents of directories.
|
||||
.It Fl Fl newer Ar date
|
||||
(c, r, u modes only)
|
||||
Only include files and directories newer than the specified date.
|
||||
diff --git a/tar/bsdtar.c b/tar/bsdtar.c
|
||||
index 11dedbf9..d014cc3e 100644
|
||||
--- a/tar/bsdtar.c
|
||||
+++ b/tar/bsdtar.c
|
||||
@@ -794,8 +794,6 @@ main(int argc, char **argv)
|
||||
break;
|
||||
}
|
||||
}
|
||||
- if (bsdtar->flags & OPTFLAG_NO_SUBDIRS)
|
||||
- only_mode(bsdtar, "-n", "cru");
|
||||
if (bsdtar->flags & OPTFLAG_STDOUT)
|
||||
only_mode(bsdtar, "-O", "xt");
|
||||
if (bsdtar->flags & OPTFLAG_UNLINK_FIRST)
|
||||
@@ -845,6 +843,16 @@ main(int argc, char **argv)
|
||||
only_mode(bsdtar, buff, "cru");
|
||||
}
|
||||
|
||||
+ /*
|
||||
+ * When creating an archive from a directory tree, the directory
|
||||
+ * walking code will already avoid entering directories when
|
||||
+ * recursive inclusion of directory content is disabled, therefore
|
||||
+ * changing the matching behavior has no effect for creation modes.
|
||||
+ * It is relevant for extraction or listing.
|
||||
+ */
|
||||
+ archive_match_include_directories_recursively(bsdtar->matching,
|
||||
+ !(bsdtar->flags & OPTFLAG_NO_SUBDIRS));
|
||||
+
|
||||
/* Filename "-" implies stdio. */
|
||||
if (strcmp(bsdtar->filename, "-") == 0)
|
||||
bsdtar->filename = NULL;
|
||||
--
|
||||
2.11.0
|
||||
|
||||
+3
-11
@@ -3,7 +3,7 @@ DESCRIPTION = "C library and command-line tools for reading and writing tar, cpi
|
||||
HOMEPAGE = "http://www.libarchive.org/"
|
||||
SECTION = "devel"
|
||||
LICENSE = "BSD"
|
||||
LIC_FILES_CHKSUM = "file://COPYING;md5=ed99aca006bc346974bb745a35336425"
|
||||
LIC_FILES_CHKSUM = "file://COPYING;md5=fe01f5e02b1f0cc934d593a7b0ddceb6"
|
||||
|
||||
DEPENDS = "e2fsprogs-native"
|
||||
|
||||
@@ -32,18 +32,10 @@ PACKAGECONFIG[lz4] = "--with-lz4,--without-lz4,lz4,"
|
||||
EXTRA_OECONF += "--enable-largefile"
|
||||
|
||||
SRC_URI = "http://libarchive.org/downloads/libarchive-${PV}.tar.gz \
|
||||
file://non-recursive-extract-and-list.patch \
|
||||
file://bug1066.patch \
|
||||
file://CVE-2018-1000877.patch \
|
||||
file://CVE-2018-1000878.patch \
|
||||
file://CVE-2018-1000879.patch \
|
||||
file://CVE-2018-1000880.patch \
|
||||
file://CVE-2019-1000019.patch \
|
||||
file://CVE-2019-1000020.patch \
|
||||
"
|
||||
|
||||
SRC_URI[md5sum] = "4038e366ca5b659dae3efcc744e72120"
|
||||
SRC_URI[sha256sum] = "ba7eb1781c9fbbae178c4c6bad1c6eb08edab9a1496c64833d1715d022b30e2e"
|
||||
SRC_URI[md5sum] = "6046396255bd7cf6d0f6603a9bda39ac"
|
||||
SRC_URI[sha256sum] = "8643d50ed40c759f5412a3af4e353cffbce4fdf3b5cf321cb72cacf06b2d825e"
|
||||
|
||||
inherit autotools update-alternatives pkgconfig
|
||||
|
||||
Reference in New Issue
Block a user