Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 22 Apr 2026 13:44:17 +0000
Message-ID:  <69e8d0b1.21ffa.3c2d786f@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch stable/15 has been updated by mm:

URL: https://cgit.FreeBSD.org/src/commit/?id=e60d2d53ed838ac50d25080abc415e387b404f09

commit e60d2d53ed838ac50d25080abc415e387b404f09
Author:     Martin Matuska <mm@FreeBSD.org>
AuthorDate: 2026-04-13 13:47:17 +0000
Commit:     Martin Matuska <mm@FreeBSD.org>
CommitDate: 2026-04-22 13:43:16 +0000

    libarchive: merge from vendor branch
    
    libarchive 3.8.7
    
    Important bugfixes:
     #2871 libarchive: fix handling of option failures
     #2897 iso9660: fix undefined behavior
     #2898 RAR: fix LZSS window size mismatch after PPMd block
     #2900 CAB: fix NULL pointer dereference during skip
     #2911 libarchive: do not continue with truncated numbers
     #2919 CAB: Fix Heap OOB Write in CAB LZX decoder
     #2934 iso9660: fix posibble heap buffer overflow on 32-bit systems
     #2939 cpio: Fix -R memory leak
     #2947 libarchive: lzop and grzip filter support
    
    Important bugfixes between 3.8.5 and 3.8.6:
     #2860 bsdunzip: fix ISO week year and Gregorian year confusion
     #2864 7zip: ix SEGV in check_7zip_header_in_sfx via ELF offset validation
     #2875 7zip: fix out-of-bounds access on ELF 64-bit header
     #2877 RAR5 reader: fix infinite loop in rar5 decompression
     #2878 mtree reader: Fix file descriptor leak in mtree parser cleanup
           (CWE-775)
     #2892 RAR5 reader: fix potential memory leak
     #2893 RAR5: fix SIGSEGV when archive_read_support_format_rar5 is called
           twice
     #2895 CAB reader: fix memory leak on repeated calls to
           archive_read_support_format_cab
    
    Obtained from:  libarchive
    Vendor commit:  ded82291ab41d5e355831b96b0e1ff49e24d8939
    MFC after:      1 week
    
    (cherry picked from commit eb5165bb491138f60d9004bc4c781490016d9288)
---
 contrib/libarchive/NEWS                            |    4 +
 contrib/libarchive/README.md                       |    9 +-
 contrib/libarchive/cpio/cmdline.c                  |   15 +-
 contrib/libarchive/cpio/cpio.c                     |  123 ++-
 contrib/libarchive/cpio/cpio.h                     |    2 -
 contrib/libarchive/cpio/test/test_format_newc.c    |    7 +
 contrib/libarchive/libarchive/archive.h            |    4 +-
 contrib/libarchive/libarchive/archive_acl.c        |    6 +-
 .../libarchive/libarchive/archive_check_magic.c    |    4 +-
 .../libarchive/archive_cryptor_private.h           |    4 +
 contrib/libarchive/libarchive/archive_entry.h      |    2 +-
 contrib/libarchive/libarchive/archive_hmac.c       |    6 +
 contrib/libarchive/libarchive/archive_options.c    |    4 +-
 contrib/libarchive/libarchive/archive_pathmatch.c  |    4 +-
 contrib/libarchive/libarchive/archive_ppmd8.c      |   22 +-
 .../libarchive/libarchive/archive_ppmd8_private.h  |   25 -
 contrib/libarchive/libarchive/archive_read.c       |   12 +-
 .../libarchive/archive_read_append_filter.c        |    4 +
 .../libarchive/archive_read_disk_posix.c           |    6 +-
 .../libarchive/archive_read_open_filename.c        |    7 +-
 .../libarchive/archive_read_support_filter_grzip.c |    2 +-
 .../libarchive/archive_read_support_filter_lz4.c   |    4 +-
 .../libarchive/archive_read_support_filter_lzop.c  |    2 +-
 .../archive_read_support_filter_program.c          |    2 +
 .../libarchive/archive_read_support_format_7zip.c  |   24 +-
 .../libarchive/archive_read_support_format_cab.c   |   24 +-
 .../libarchive/archive_read_support_format_cpio.c  |    4 +-
 .../archive_read_support_format_iso9660.c          |   26 +-
 .../libarchive/archive_read_support_format_lha.c   |   11 +-
 .../libarchive/archive_read_support_format_mtree.c |    7 +-
 .../libarchive/archive_read_support_format_rar.c   |   73 +-
 .../libarchive/archive_read_support_format_rar5.c  |   45 +-
 .../libarchive/archive_read_support_format_tar.c   |    6 +-
 .../libarchive/archive_read_support_format_xar.c   |   14 +-
 .../libarchive/archive_read_support_format_zip.c   |   22 +-
 contrib/libarchive/libarchive/archive_string.c     |   16 +-
 contrib/libarchive/libarchive/archive_write.c      |    2 +-
 .../archive_write_add_filter_b64encode.c           |   22 +-
 .../libarchive/archive_write_add_filter_bzip2.c    |    7 +-
 .../libarchive/archive_write_add_filter_gzip.c     |   12 +-
 .../libarchive/archive_write_add_filter_lrzip.c    |   21 +-
 .../libarchive/archive_write_add_filter_lz4.c      |   14 +-
 .../libarchive/archive_write_add_filter_lzop.c     |    7 +-
 .../libarchive/archive_write_add_filter_uuencode.c |   22 +-
 .../libarchive/archive_write_add_filter_xz.c       |   27 +-
 .../libarchive/archive_write_add_filter_zstd.c     |   52 +-
 .../libarchive/archive_write_disk_posix.c          |   30 +-
 .../libarchive/archive_write_set_format_7zip.c     |    9 +-
 .../archive_write_set_format_cpio_binary.c         |    4 +-
 .../archive_write_set_format_cpio_newc.c           |    2 +-
 .../libarchive/archive_write_set_format_cpio_odc.c |    2 +-
 .../libarchive/archive_write_set_format_gnutar.c   |   34 +-
 .../libarchive/archive_write_set_format_iso9660.c  |   18 +-
 .../libarchive/archive_write_set_format_mtree.c    |    2 +-
 .../libarchive/archive_write_set_format_pax.c      |    6 +-
 .../libarchive/archive_write_set_format_ustar.c    |   27 +-
 .../libarchive/archive_write_set_format_v7tar.c    |   27 +-
 .../libarchive/archive_write_set_format_xar.c      |    6 +-
 .../libarchive/archive_write_set_format_zip.c      |   49 +-
 contrib/libarchive/libarchive/test/test_acl_text.c |   23 +
 .../libarchive/test/test_archive_pathmatch.c       |   18 +
 .../test/test_archive_string_conversion.c          |  135 +++
 .../test/test_gnutar_filename_encoding.c           |   40 +
 .../libarchive/test/test_read_format_7zip.c        |   26 +
 .../test/test_read_format_7zip_malformed.c         |   17 +
 .../test/test_read_format_7zip_malformed3.7z.uu    |   24 +
 .../test_read_format_7zip_sfx_elf64trunc.elf.uu    |    5 +
 .../libarchive/test/test_read_format_cab_lzx_oob.c |   45 +
 .../test/test_read_format_cab_lzx_oob.cab.uu       |   11 +
 .../test/test_read_format_cab_skip_malformed.c     |   41 +
 .../test_read_format_cab_skip_malformed.cab.uu     |   95 ++
 .../test/test_read_format_iso_zisofs_overflow.c    |  104 ++
 .../test_read_format_iso_zisofs_overflow.iso.uu    | 1096 ++++++++++++++++++++
 .../test/test_read_format_lha_oversize_header.c    |   50 +
 .../test_read_format_lha_oversize_header.lzh.uu    |   60 ++
 .../test/test_read_format_rar5_loop_bug.c          |   53 +
 .../test/test_read_format_rar5_loop_bug.rar.uu     |  189 ++++
 .../libarchive/test/test_read_set_format.c         |   34 +
 .../libarchive/test/test_ustar_filename_encoding.c |   40 +
 .../libarchive/test/test_v7tar_filename_encoding.c |   67 ++
 .../test/test_warn_missing_hardlink_target.c       |    2 +-
 .../libarchive/libarchive/test/test_write_disk.c   |   29 +
 .../libarchive/test/test_write_disk_perms.c        |   11 +-
 .../libarchive/test/test_zip_filename_encoding.c   |   40 +
 .../la_getline.c => libarchive_fe/lafe_getline.c}  |   11 +-
 .../la_getline.h => libarchive_fe/lafe_getline.h}  |   15 +-
 contrib/libarchive/tar/bsdtar.c                    |   20 +-
 contrib/libarchive/tar/read.c                      |    2 +-
 contrib/libarchive/tar/util.c                      |    8 +-
 contrib/libarchive/tar/write.c                     |   16 +-
 contrib/libarchive/test_utils/test_common.h        |    4 +
 contrib/libarchive/test_utils/test_main.c          |   85 +-
 contrib/libarchive/unzip/bsdunzip.c                |    6 +-
 lib/libarchive/tests/Makefile                      |   13 +
 usr.bin/unzip/Makefile                             |    2 +-
 95 files changed, 3019 insertions(+), 372 deletions(-)

diff --git a/contrib/libarchive/NEWS b/contrib/libarchive/NEWS
index be14de445b57..d5e9769771e2 100644
--- a/contrib/libarchive/NEWS
+++ b/contrib/libarchive/NEWS
@@ -1,3 +1,7 @@
+Apr 13, 2026: libarchive 3.8.7 released
+
+Mar 10, 2026: libarchive 3.8.6 released
+
 Jan 05, 2026: libarchive 3.8.5 released
 
 Dec 01, 2025: libarchive 3.8.4 released
diff --git a/contrib/libarchive/README.md b/contrib/libarchive/README.md
index e9691f1b710b..3009e1b54d18 100644
--- a/contrib/libarchive/README.md
+++ b/contrib/libarchive/README.md
@@ -37,10 +37,13 @@ The top-level directory contains the following information files:
 * **CMakeLists.txt** - input for "cmake" build tool, see INSTALL
 * **configure** - configuration script, see INSTALL for details.  If your copy of the source lacks a `configure` script, you can try to construct it by running the script in `build/autogen.sh` (or use `cmake`).
 
-The following files in the top-level directory are used by the 'configure' script:
+The following files in the top-level directory are related to the 'configure' script and are only needed by maintainers:
 
-* `Makefile.am`, `aclocal.m4`, `configure.ac` - used to build this distribution, only needed by maintainers
-* `Makefile.in`, `config.h.in` - templates used by configure script
+* `configure.ac` - used (by autoconf) to build the configure script and related files
+* `Makefile.am` - used (by automake) to generate Makefile.in
+* `aclocal.m4` - auto-generated file (created by aclocal) used to build the configure script
+* `Makefile.in` - auto-generated template (created by automake) used by the configure script to create Makefile
+* `config.h.in` - auto-generated template (created by autoheader) used by the configure script to create config.h
 
 ## Documentation
 
diff --git a/contrib/libarchive/cpio/cmdline.c b/contrib/libarchive/cpio/cmdline.c
index db06c03c011d..a3d029c65161 100644
--- a/contrib/libarchive/cpio/cmdline.c
+++ b/contrib/libarchive/cpio/cmdline.c
@@ -11,6 +11,9 @@
 #ifdef HAVE_ERRNO_H
 #include <errno.h>
 #endif
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
 #ifdef HAVE_GRP_H
 #include <grp.h>
 #endif
@@ -347,9 +350,10 @@ owner_parse(const char *spec, struct cpio_owner *owner, const char **errmsg)
 				owner->gid = pwent->pw_gid;
 		} else {
 			char *end;
+			unsigned long val;
 			errno = 0;
-			owner->uid = (int)strtoul(user, &end, 10);
-			if (errno || *end != '\0') {
+			val = strtoul(user, &end, 10);
+			if (errno || *end != '\0' || val > (unsigned)INT_MAX) {
 				snprintf(errbuff, sizeof(errbuff),
 				    "Couldn't lookup user ``%s''", user);
 				errbuff[sizeof(errbuff) - 1] = '\0';
@@ -357,6 +361,7 @@ owner_parse(const char *spec, struct cpio_owner *owner, const char **errmsg)
 				*errmsg = errbuff;
 				return (-1);
 			}
+			owner->uid = (int)val;
 		}
 		free(user);
 	}
@@ -373,15 +378,17 @@ owner_parse(const char *spec, struct cpio_owner *owner, const char **errmsg)
 			}
 		} else {
 			char *end;
+			unsigned long val;
 			errno = 0;
-			owner->gid = (int)strtoul(g, &end, 10);
-			if (errno || *end != '\0') {
+			val = strtoul(g, &end, 10);
+			if (errno || *end != '\0' || val > (unsigned)INT_MAX) {
 				snprintf(errbuff, sizeof(errbuff),
 				    "Couldn't lookup group ``%s''", g);
 				errbuff[sizeof(errbuff) - 1] = '\0';
 				*errmsg = errbuff;
 				return (-1);
 			}
+			owner->gid = (int)val;
 		}
 	}
 	return (0);
diff --git a/contrib/libarchive/cpio/cpio.c b/contrib/libarchive/cpio/cpio.c
index 77eefe809f37..6e6c2c3356c0 100644
--- a/contrib/libarchive/cpio/cpio.c
+++ b/contrib/libarchive/cpio/cpio.c
@@ -8,6 +8,8 @@
 
 #include "cpio_platform.h"
 
+#include "lafe_getline.h"
+
 #include <sys/types.h>
 #include <archive.h>
 #include <archive_entry.h>
@@ -33,6 +35,9 @@
 #ifdef HAVE_LOCALE_H
 #include <locale.h>
 #endif
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
 #ifdef HAVE_PWD_H
 #include <pwd.h>
 #endif
@@ -83,7 +88,7 @@ struct name_cache {
 
 static int	extract_data(struct archive *, struct archive *);
 const char *	cpio_i64toa(int64_t);
-static const char *cpio_rename(const char *name);
+static void	cpio_rename(struct archive_entry *);
 static int	entry_to_archive(struct cpio *, struct archive_entry *);
 static int	file_to_archive(struct cpio *, const char *);
 static void	free_cache(struct name_cache *cache);
@@ -110,19 +115,16 @@ static void	passphrase_free(char *);
 int
 main(int argc, char *argv[])
 {
-	static char buff[16384];
 	struct cpio _cpio; /* Allocated on stack. */
 	struct cpio *cpio;
 	struct cpio_owner owner;
 	const char *errmsg;
 	char *tptr;
-	int opt, t;
+	int opt;
+	long t;
 
 	cpio = &_cpio;
 	memset(cpio, 0, sizeof(*cpio));
-	cpio->buff = buff;
-	cpio->buff_size = sizeof(buff);
-
 
 #if defined(HAVE_SIGACTION)
 	{
@@ -204,13 +206,13 @@ main(int argc, char *argv[])
 		case 'C': /* NetBSD/OpenBSD */
 			errno = 0;
 			tptr = NULL;
-			t = (int)strtol(cpio->argument, &tptr, 10);
-			if (errno || t <= 0 || *(cpio->argument) == '\0' ||
+			t = strtol(cpio->argument, &tptr, 10);
+			if (errno || t <= 0 || t > INT_MAX || *(cpio->argument) == '\0' ||
 			    tptr == NULL || *tptr != '\0') {
 				lafe_errc(1, 0, "Invalid blocksize: %s",
 				    cpio->argument);
 			}
-			cpio->bytes_per_block = t;
+			cpio->bytes_per_block = (int)t;
 			break;
 		case 'c': /* POSIX 1997 */
 			cpio->format = "odc";
@@ -222,7 +224,7 @@ main(int argc, char *argv[])
 			if (archive_match_include_pattern_from_file(
 			    cpio->matching, cpio->argument,
 			    cpio->option_null) != ARCHIVE_OK)
-				lafe_errc(1, 0, "Error : %s",
+				lafe_errc(1, 0, "%s",
 				    archive_error_string(cpio->matching));
 			break;
 		case 'F': /* NetBSD/OpenBSD/GNU cpio */
@@ -231,7 +233,7 @@ main(int argc, char *argv[])
 		case 'f': /* POSIX 1997 */
 			if (archive_match_exclude_pattern(cpio->matching,
 			    cpio->argument) != ARCHIVE_OK)
-				lafe_errc(1, 0, "Error : %s",
+				lafe_errc(1, 0, "%s",
 				    archive_error_string(cpio->matching));
 			break;
 		case OPTION_GRZIP:
@@ -247,7 +249,7 @@ main(int argc, char *argv[])
 			cpio->filename = cpio->argument;
 			break;
 		case 'i': /* POSIX 1997 */
-			if (cpio->mode != '\0')
+			if (cpio->mode != '\0' && cpio->mode != opt)
 				lafe_errc(1, 0,
 				    "Cannot use both -i and -%c", cpio->mode);
 			cpio->mode = opt;
@@ -289,13 +291,13 @@ main(int argc, char *argv[])
 			cpio->filename = cpio->argument;
 			break;
 		case 'o': /* POSIX 1997 */
-			if (cpio->mode != '\0')
+			if (cpio->mode != '\0' && cpio->mode != opt)
 				lafe_errc(1, 0,
 				    "Cannot use both -o and -%c", cpio->mode);
 			cpio->mode = opt;
 			break;
 		case 'p': /* POSIX 1997 */
-			if (cpio->mode != '\0')
+			if (cpio->mode != '\0' && cpio->mode != opt)
 				lafe_errc(1, 0,
 				    "Cannot use both -p and -%c", cpio->mode);
 			cpio->mode = opt;
@@ -316,17 +318,21 @@ main(int argc, char *argv[])
 			if (owner_parse(cpio->argument, &owner, &errmsg) != 0) {
 				if (!errmsg)
 					errmsg = "Error parsing owner";
-				lafe_warnc(-1, "%s", errmsg);
+				lafe_warnc(0, "%s", errmsg);
 				usage();
 			}
 			if (owner.uid != -1)
 				cpio->uid_override = owner.uid;
-			if (owner.uname != NULL)
+			if (owner.uname != NULL) {
+				free(cpio->uname_override);
 				cpio->uname_override = owner.uname;
+			}
 			if (owner.gid != -1)
 				cpio->gid_override = owner.gid;
-			if (owner.gname != NULL)
+			if (owner.gname != NULL) {
+				free(cpio->gname_override);
 				cpio->gname_override = owner.gname;
+			}
 			break;
 		case 'r': /* POSIX 1997 */
 			cpio->option_rename = 1;
@@ -409,7 +415,7 @@ main(int argc, char *argv[])
 		while (*cpio->argv != NULL) {
 			if (archive_match_include_pattern(cpio->matching,
 			    *cpio->argv) != ARCHIVE_OK)
-				lafe_errc(1, 0, "Error : %s",
+				lafe_errc(1, 0, "%s",
 				    archive_error_string(cpio->matching));
 			--cpio->argc;
 			++cpio->argv;
@@ -427,7 +433,7 @@ main(int argc, char *argv[])
 		break;
 	default:
 		lafe_errc(1, 0,
-		    "Must specify at least one of -i, -o, or -p");
+		    "Must specify one of -i, -o, or -p");
 	}
 
 	archive_match_free(cpio->matching);
@@ -524,7 +530,7 @@ mode_out(struct cpio *cpio)
 	int r;
 
 	if (cpio->option_append)
-		lafe_errc(1, 0, "Append mode not yet supported.");
+		lafe_errc(1, 0, "Append mode not yet supported");
 
 	cpio->archive_read_disk = archive_read_disk_new();
 	if (cpio->archive_read_disk == NULL)
@@ -638,7 +644,7 @@ mode_out(struct cpio *cpio)
 		int64_t blocks =
 			(archive_filter_bytes(cpio->archive, 0) + 511)
 			/ 512;
-		fprintf(stderr, "%lu %s\n", (unsigned long)blocks,
+		fprintf(stderr, "%lld %s\n", (long long)blocks,
 		    blocks == 1 ? "block" : "blocks");
 	}
 	archive_write_free(cpio->archive);
@@ -696,7 +702,6 @@ remove_leading_slash(const char *p)
 static int
 file_to_archive(struct cpio *cpio, const char *srcpath)
 {
-	const char *destpath;
 	struct archive_entry *entry, *spare;
 	size_t len;
 	int r;
@@ -738,7 +743,6 @@ file_to_archive(struct cpio *cpio, const char *srcpath)
 	 * pass mode or the name that will go into the archive in
 	 * output mode.
 	 */
-	destpath = srcpath;
 	if (cpio->destdir) {
 		len = cpio->destdir_len + strlen(srcpath) + 8;
 		if (len >= cpio->pass_destpath_alloc) {
@@ -754,15 +758,17 @@ file_to_archive(struct cpio *cpio, const char *srcpath)
 		}
 		strcpy(cpio->pass_destpath, cpio->destdir);
 		strcat(cpio->pass_destpath, remove_leading_slash(srcpath));
-		destpath = cpio->pass_destpath;
+		archive_entry_set_pathname(entry, cpio->pass_destpath);
+	} else {
+		archive_entry_set_pathname(entry, srcpath);
 	}
 	if (cpio->option_rename)
-		destpath = cpio_rename(destpath);
-	if (destpath == NULL) {
+		cpio_rename(entry);
+
+	if (archive_entry_pathname(entry) == NULL) {
 		archive_entry_free(entry);
 		return (0);
 	}
-	archive_entry_copy_pathname(entry, destpath);
 
 	/*
 	 * If we're trying to preserve hardlinks, match them here.
@@ -791,7 +797,6 @@ entry_to_archive(struct cpio *cpio, struct archive_entry *entry)
 	const char *destpath = archive_entry_pathname(entry);
 	const char *srcpath = archive_entry_sourcepath(entry);
 	int fd = -1;
-	ssize_t bytes_read;
 	int r;
 
 	/* Print out the destination name to the user. */
@@ -869,21 +874,23 @@ entry_to_archive(struct cpio *cpio, struct archive_entry *entry)
 		exit(1);
 
 	if (r >= ARCHIVE_WARN && archive_entry_size(entry) > 0 && fd >= 0) {
-		bytes_read = read(fd, cpio->buff, (unsigned)cpio->buff_size);
+		static char buff[16384];
+		ssize_t bytes_read;
+
+		bytes_read = read(fd, buff, sizeof(buff));
 		while (bytes_read > 0) {
 			ssize_t bytes_write;
 			bytes_write = archive_write_data(cpio->archive,
-			    cpio->buff, bytes_read);
+			    buff, bytes_read);
 			if (bytes_write < 0)
 				lafe_errc(1, archive_errno(cpio->archive),
 				    "%s", archive_error_string(cpio->archive));
 			if (bytes_write < bytes_read) {
 				lafe_warnc(0,
 				    "Truncated write; file may have "
-				    "grown while being archived.");
+				    "grown while being archived");
 			}
-			bytes_read = read(fd, cpio->buff,
-			    (unsigned)cpio->buff_size);
+			bytes_read = read(fd, buff, sizeof(buff));
 		}
 	}
 
@@ -997,11 +1004,9 @@ mode_in(struct cpio *cpio)
 		}
 		if (archive_match_path_excluded(cpio->matching, entry))
 			continue;
-		if (cpio->option_rename) {
-			destpath = cpio_rename(archive_entry_pathname(entry));
-			archive_entry_set_pathname(entry, destpath);
-		} else
-			destpath = archive_entry_pathname(entry);
+		if (cpio->option_rename)
+			cpio_rename(entry);
+		destpath = archive_entry_pathname(entry);
 		if (destpath == NULL)
 			continue;
 		if (cpio->verbose)
@@ -1040,7 +1045,7 @@ mode_in(struct cpio *cpio)
 	if (!cpio->quiet) {
 		int64_t blocks = (archive_filter_bytes(a, 0) + 511)
 			      / 512;
-		fprintf(stderr, "%lu %s\n", (unsigned long)blocks,
+		fprintf(stderr, "%lld %s\n", (long long)blocks,
 		    blocks == 1 ? "block" : "blocks");
 	}
 	archive_read_free(a);
@@ -1125,7 +1130,7 @@ mode_list(struct cpio *cpio)
 	if (!cpio->quiet) {
 		int64_t blocks = (archive_filter_bytes(a, 0) + 511)
 			      / 512;
-		fprintf(stderr, "%lu %s\n", (unsigned long)blocks,
+		fprintf(stderr, "%lld %s\n", (long long)blocks,
 		    blocks == 1 ? "block" : "blocks");
 	}
 	archive_read_free(a);
@@ -1292,54 +1297,60 @@ mode_pass(struct cpio *cpio, const char *destdir)
  * that an input of '.' means the name should be unchanged.  GNU cpio
  * treats '.' as a literal new name.
  */
-static const char *
-cpio_rename(const char *name)
+void
+cpio_rename(struct archive_entry *entry)
 {
-	static char buff[1024];
+	char *buff = NULL, *p, *ret = NULL;
 	FILE *t;
-	char *p, *ret;
+	size_t n = 0;
+	ssize_t r;
 #if defined(_WIN32) && !defined(__CYGWIN__)
 	FILE *to;
 
 	t = fopen("CONIN$", "r");
 	if (t == NULL)
-		return (name);
+		return;
 	to = fopen("CONOUT$", "w");
 	if (to == NULL) {
 		fclose(t);
-		return (name);
+		return;
 	}
-	fprintf(to, "%s (Enter/./(new name))? ", name);
+	fprintf(to, "%s (Enter/./(new name))? ", archive_entry_pathname(entry));
 	fclose(to);
 #else
 	t = fopen("/dev/tty", "r+");
 	if (t == NULL)
-		return (name);
-	fprintf(t, "%s (Enter/./(new name))? ", name);
+		return;
+	fprintf(t, "%s (Enter/./(new name))? ", archive_entry_pathname(entry));
 	fflush(t);
 #endif
 
-	p = fgets(buff, sizeof(buff), t);
+	r = getline(&buff, &n, t);
 	fclose(t);
-	if (p == NULL)
+	if (r < 1)
 		/* End-of-file is a blank line. */
-		return (NULL);
+		goto done;
+	p = buff;
 
 	while (*p == ' ' || *p == '\t')
 		++p;
 	if (*p == '\n' || *p == '\0')
 		/* Empty line. */
-		return (NULL);
-	if (*p == '.' && p[1] == '\n')
+		goto done;
+	if (*p == '.' && p[1] == '\n') {
 		/* Single period preserves original name. */
-		return (name);
+		free(buff);
+		return;
+	}
 	ret = p;
 	/* Trim the final newline. */
 	while (*p != '\0' && *p != '\n')
 		++p;
 	/* Overwrite the final \n with a null character. */
 	*p = '\0';
-	return (ret);
+done:
+	archive_entry_set_pathname(entry, ret);
+	free(buff);
 }
 
 static void
diff --git a/contrib/libarchive/cpio/cpio.h b/contrib/libarchive/cpio/cpio.h
index 9bc631b544fe..2621a4c3dda3 100644
--- a/contrib/libarchive/cpio/cpio.h
+++ b/contrib/libarchive/cpio/cpio.h
@@ -71,8 +71,6 @@ struct cpio {
 
 	/* Work data. */
 	struct archive   *matching;
-	char		 *buff;
-	size_t		  buff_size;
 	char		 *ppbuff;
 };
 
diff --git a/contrib/libarchive/cpio/test/test_format_newc.c b/contrib/libarchive/cpio/test/test_format_newc.c
index 33aa16d07a81..9d4e4e9fb674 100644
--- a/contrib/libarchive/cpio/test/test_format_newc.c
+++ b/contrib/libarchive/cpio/test/test_format_newc.c
@@ -6,6 +6,13 @@
  */
 #include "test.h"
 
+#ifdef HAVE_GETEUID
+#define getuid() geteuid()
+#endif
+#ifdef HAVE_GETEGID
+#define getgid() getegid()
+#endif
+
 /* Number of bytes needed to pad 'n' to multiple of 'block', assuming
  * that 'block' is a power of two. This trick can be more easily
  * remembered as -n & (block - 1), but many compilers quite reasonably
diff --git a/contrib/libarchive/libarchive/archive.h b/contrib/libarchive/libarchive/archive.h
index a9d34beb4f5a..41a5440cac75 100644
--- a/contrib/libarchive/libarchive/archive.h
+++ b/contrib/libarchive/libarchive/archive.h
@@ -34,7 +34,7 @@
  * assert that ARCHIVE_VERSION_NUMBER >= 2012108.
  */
 /* Note: Compiler will complain if this does not match archive_entry.h! */
-#define	ARCHIVE_VERSION_NUMBER 3008005
+#define	ARCHIVE_VERSION_NUMBER 3008007
 
 #include <sys/stat.h>
 #include <stddef.h>  /* for wchar_t */
@@ -177,7 +177,7 @@ __LA_DECL int		archive_version_number(void);
 /*
  * Textual name/version of the library, useful for version displays.
  */
-#define	ARCHIVE_VERSION_ONLY_STRING "3.8.5"
+#define	ARCHIVE_VERSION_ONLY_STRING "3.8.7"
 #define	ARCHIVE_VERSION_STRING "libarchive " ARCHIVE_VERSION_ONLY_STRING
 __LA_DECL const char *	archive_version_string(void);
 
diff --git a/contrib/libarchive/libarchive/archive_acl.c b/contrib/libarchive/libarchive/archive_acl.c
index 362e3308f43f..ab601833def6 100644
--- a/contrib/libarchive/libarchive/archive_acl.c
+++ b/contrib/libarchive/libarchive/archive_acl.c
@@ -1256,8 +1256,12 @@ archive_acl_from_text_w(struct archive_acl *acl, const wchar_t *text,
 
 			tag = 0;
 			s = field[n].start;
-			st = field[n].start + 1;
 			len = field[n].end - field[n].start;
+			if (len == 0) {
+				ret = ARCHIVE_WARN;
+				continue;
+			}
+			st = s + 1;
 
 			switch (*s) {
 			case L'u':
diff --git a/contrib/libarchive/libarchive/archive_check_magic.c b/contrib/libarchive/libarchive/archive_check_magic.c
index 6b8e0c5595f4..b6e1257949e1 100644
--- a/contrib/libarchive/libarchive/archive_check_magic.c
+++ b/contrib/libarchive/libarchive/archive_check_magic.c
@@ -148,14 +148,14 @@ __archive_check_magic(struct archive *a, unsigned int magic,
 	if (!handle_type) {
 		errmsg("PROGRAMMER ERROR: Function ");
 		errmsg(function);
-		errmsg(" invoked with invalid archive handle.\n");
+		errmsg(" invoked with invalid archive handle\n");
 		diediedie();
 	}
 
 	if (a->magic != magic) {
 		archive_set_error(a, -1,
 		    "PROGRAMMER ERROR: Function '%s' invoked"
-		    " on '%s' archive object, which is not supported.",
+		    " on '%s' archive object, which is not supported",
 		    function,
 		    handle_type);
 		a->state = ARCHIVE_STATE_FATAL;
diff --git a/contrib/libarchive/libarchive/archive_cryptor_private.h b/contrib/libarchive/libarchive/archive_cryptor_private.h
index 272f2f84b9c9..1f9298ffdc46 100644
--- a/contrib/libarchive/libarchive/archive_cryptor_private.h
+++ b/contrib/libarchive/libarchive/archive_cryptor_private.h
@@ -109,6 +109,10 @@ typedef struct {
 #include <nettle/version.h>
 #define	ARCHIVE_CRYPTOR_USE_NETTLE 1
 
+#ifndef AES_MAX_KEY_SIZE
+#define AES_MAX_KEY_SIZE AES256_KEY_SIZE
+#endif
+
 typedef struct {
 #if NETTLE_VERSION_MAJOR < 3
 	struct aes_ctx	ctx;
diff --git a/contrib/libarchive/libarchive/archive_entry.h b/contrib/libarchive/libarchive/archive_entry.h
index b43435692c27..7122a74ed007 100644
--- a/contrib/libarchive/libarchive/archive_entry.h
+++ b/contrib/libarchive/libarchive/archive_entry.h
@@ -28,7 +28,7 @@
 #define	ARCHIVE_ENTRY_H_INCLUDED
 
 /* Note: Compiler will complain if this does not match archive.h! */
-#define	ARCHIVE_VERSION_NUMBER 3008005
+#define	ARCHIVE_VERSION_NUMBER 3008007
 
 /*
  * Note: archive_entry.h is for use outside of libarchive; the
diff --git a/contrib/libarchive/libarchive/archive_hmac.c b/contrib/libarchive/libarchive/archive_hmac.c
index 210cca70744d..458092f41b29 100644
--- a/contrib/libarchive/libarchive/archive_hmac.c
+++ b/contrib/libarchive/libarchive/archive_hmac.c
@@ -198,6 +198,7 @@ static void __hmac_sha1_cleanup(archive_hmac_sha1_ctx *ctx)
 }
 
 #elif defined(HAVE_LIBNETTLE) && defined(HAVE_NETTLE_HMAC_H)
+#include <nettle/version.h>
 
 static int
 __hmac_sha1_init(archive_hmac_sha1_ctx *ctx, const uint8_t *key, size_t key_len)
@@ -216,7 +217,12 @@ __hmac_sha1_update(archive_hmac_sha1_ctx *ctx, const uint8_t *data,
 static void
 __hmac_sha1_final(archive_hmac_sha1_ctx *ctx, uint8_t *out, size_t *out_len)
 {
+#if NETTLE_VERSION_MAJOR < 4
 	hmac_sha1_digest(ctx, (unsigned)*out_len, out);
+#else
+	hmac_sha1_digest(ctx, out);
+	*out_len = SHA1_DIGEST_SIZE;
+#endif
 }
 
 static void
diff --git a/contrib/libarchive/libarchive/archive_options.c b/contrib/libarchive/libarchive/archive_options.c
index 6e2c0d2a5971..66491bd4183b 100644
--- a/contrib/libarchive/libarchive/archive_options.c
+++ b/contrib/libarchive/libarchive/archive_options.c
@@ -90,7 +90,9 @@ _archive_set_either_option(struct archive *a, const char *m, const char *o, cons
 	if (r2 == ARCHIVE_FATAL)
 		return (ARCHIVE_FATAL);
 
-	if (r2 == ARCHIVE_WARN - 1)
+	if (r1 == ARCHIVE_WARN - 1)
+		return r2;
+	if (r2 == ARCHIVE_WARN -1)
 		return r1;
 	return r1 > r2 ? r1 : r2;
 }
diff --git a/contrib/libarchive/libarchive/archive_pathmatch.c b/contrib/libarchive/libarchive/archive_pathmatch.c
index 19e0889ffe55..db0d2b791adf 100644
--- a/contrib/libarchive/libarchive/archive_pathmatch.c
+++ b/contrib/libarchive/libarchive/archive_pathmatch.c
@@ -202,7 +202,7 @@ pm(const char *p, const char *s, int flags)
 			if (*p == '\0')
 				return (1);
 			while (*s) {
-				if (archive_pathmatch(p, s, flags))
+				if (pm(p, s, flags))
 					return (1);
 				++s;
 			}
@@ -307,7 +307,7 @@ pm_w(const wchar_t *p, const wchar_t *s, int flags)
 			if (*p == L'\0')
 				return (1);
 			while (*s) {
-				if (archive_pathmatch_w(p, s, flags))
+				if (pm_w(p, s, flags))
 					return (1);
 				++s;
 			}
diff --git a/contrib/libarchive/libarchive/archive_ppmd8.c b/contrib/libarchive/libarchive/archive_ppmd8.c
index 30196d64a9f5..04b1c0c3e165 100644
--- a/contrib/libarchive/libarchive/archive_ppmd8.c
+++ b/contrib/libarchive/libarchive/archive_ppmd8.c
@@ -61,7 +61,7 @@ typedef struct CPpmd8_Node_
 
 #define EMPTY_NODE 0xFFFFFFFF
 
-void Ppmd8_Construct(CPpmd8 *p)
+static void Ppmd8_Construct(CPpmd8 *p)
 {
   unsigned i, k, m;
 
@@ -89,14 +89,14 @@ void Ppmd8_Construct(CPpmd8 *p)
   }
 }
 
-void Ppmd8_Free(CPpmd8 *p)
+static void Ppmd8_Free(CPpmd8 *p)
 {
   free(p->Base);
   p->Size = 0;
   p->Base = 0;
 }
 
-Bool Ppmd8_Alloc(CPpmd8 *p, UInt32 size)
+static Bool Ppmd8_Alloc(CPpmd8 *p, UInt32 size)
 {
   if (p->Base == 0 || p->Size != size)
   {
@@ -407,7 +407,7 @@ static void RestartModel(CPpmd8 *p)
   }
 }
 
-void Ppmd8_Init(CPpmd8 *p, unsigned maxOrder, unsigned restoreMethod)
+static void Ppmd8_Init(CPpmd8 *p, unsigned maxOrder, unsigned restoreMethod)
 {
   p->MaxOrder = maxOrder;
   p->RestoreMethod = restoreMethod;
@@ -1042,7 +1042,7 @@ static void Rescale(CPpmd8 *p)
   p->FoundState = STATS(p->MinContext);
 }
 
-CPpmd_See *Ppmd8_MakeEscFreq(CPpmd8 *p, unsigned numMasked1, UInt32 *escFreq)
+static CPpmd_See *Ppmd8_MakeEscFreq(CPpmd8 *p, unsigned numMasked1, UInt32 *escFreq)
 {
   CPpmd_See *see;
   if (p->MinContext->NumStats != 0xFF)
@@ -1078,7 +1078,7 @@ static void NextContext(CPpmd8 *p)
   }
 }
 
-void Ppmd8_Update1(CPpmd8 *p)
+static void Ppmd8_Update1(CPpmd8 *p)
 {
   CPpmd_State *s = p->FoundState;
   s->Freq += 4;
@@ -1093,7 +1093,7 @@ void Ppmd8_Update1(CPpmd8 *p)
   NextContext(p);
 }
 
-void Ppmd8_Update1_0(CPpmd8 *p)
+static void Ppmd8_Update1_0(CPpmd8 *p)
 {
   p->PrevSuccess = (2 * p->FoundState->Freq >= p->MinContext->SummFreq);
   p->RunLength += p->PrevSuccess;
@@ -1103,7 +1103,7 @@ void Ppmd8_Update1_0(CPpmd8 *p)
   NextContext(p);
 }
 
-void Ppmd8_UpdateBin(CPpmd8 *p)
+static void Ppmd8_UpdateBin(CPpmd8 *p)
 {
   p->FoundState->Freq = (Byte)(p->FoundState->Freq + (p->FoundState->Freq < 196));
   p->PrevSuccess = 1;
@@ -1111,7 +1111,7 @@ void Ppmd8_UpdateBin(CPpmd8 *p)
   NextContext(p);
 }
 
-void Ppmd8_Update2(CPpmd8 *p)
+static void Ppmd8_Update2(CPpmd8 *p)
 {
   p->MinContext->SummFreq += 4;
   if ((p->FoundState->Freq += 4) > MAX_FREQ)
@@ -1127,7 +1127,7 @@ This code is based on:
   PPMd var.I (2002): Dmitry Shkarin : Public domain
   Carryless rangecoder (1999): Dmitry Subbotin : Public domain */
 
-Bool Ppmd8_RangeDec_Init(CPpmd8 *p)
+static Bool Ppmd8_RangeDec_Init(CPpmd8 *p)
 {
   unsigned i;
   p->Low = 0;
@@ -1161,7 +1161,7 @@ static void RangeDec_Decode(CPpmd8 *p, UInt32 start, UInt32 size)
 
 #define MASK(sym) ((signed char *)charMask)[sym]
 
-int Ppmd8_DecodeSymbol(CPpmd8 *p)
+static int Ppmd8_DecodeSymbol(CPpmd8 *p)
 {
   size_t charMask[256 / sizeof(size_t)];
   if (p->MinContext->NumStats != 0)
diff --git a/contrib/libarchive/libarchive/archive_ppmd8_private.h b/contrib/libarchive/libarchive/archive_ppmd8_private.h
index 454b75f41f25..f0493de04623 100644
--- a/contrib/libarchive/libarchive/archive_ppmd8_private.h
+++ b/contrib/libarchive/libarchive/archive_ppmd8_private.h
@@ -83,12 +83,6 @@ typedef struct
   UInt16 BinSumm[25][64];
 } CPpmd8;
 
-void Ppmd8_Construct(CPpmd8 *p);
-Bool Ppmd8_Alloc(CPpmd8 *p, UInt32 size);
-void Ppmd8_Free(CPpmd8 *p);
-void Ppmd8_Init(CPpmd8 *p, unsigned maxOrder, unsigned restoreMethod);
-#define Ppmd8_WasAllocated(p) ((p)->Base != NULL)
-
 
 /* ---------- Internal Functions ---------- */
 
@@ -104,30 +98,11 @@ extern const Byte PPMD8_kExpEscape[16];
   #define Ppmd8_GetStats(p, ctx) ((CPpmd_State *)Ppmd8_GetPtr((p), ((ctx)->Stats)))
 #endif
 
-void Ppmd8_Update1(CPpmd8 *p);
-void Ppmd8_Update1_0(CPpmd8 *p);
-void Ppmd8_Update2(CPpmd8 *p);
-void Ppmd8_UpdateBin(CPpmd8 *p);
-
 #define Ppmd8_GetBinSumm(p) \
     &p->BinSumm[p->NS2Indx[Ppmd8Context_OneState(p->MinContext)->Freq - 1]][ \
     p->NS2BSIndx[Ppmd8_GetContext(p, p->MinContext->Suffix)->NumStats] + \
     p->PrevSuccess + p->MinContext->Flags + ((p->RunLength >> 26) & 0x20)]
 
-CPpmd_See *Ppmd8_MakeEscFreq(CPpmd8 *p, unsigned numMasked, UInt32 *scale);
-
-
-/* ---------- Decode ---------- */
-
-Bool Ppmd8_RangeDec_Init(CPpmd8 *p);
-#define Ppmd8_RangeDec_IsFinishedOK(p) ((p)->Code == 0)
-int Ppmd8_DecodeSymbol(CPpmd8 *p); /* returns: -1 as EndMarker, -2 as DataError */
-
-/* ---------- Encode ---------- */
-
-#define Ppmd8_RangeEnc_Init(p) { (p)->Low = 0; (p)->Range = 0xFFFFFFFF; }
-void Ppmd8_RangeEnc_FlushData(CPpmd8 *p);
-void Ppmd8_EncodeSymbol(CPpmd8 *p, int symbol); /* symbol = -1 means EndMarker */
 
 typedef struct
 {
diff --git a/contrib/libarchive/libarchive/archive_read.c b/contrib/libarchive/libarchive/archive_read.c
index c9b9d5981516..e5f89bdc8772 100644
--- a/contrib/libarchive/libarchive/archive_read.c
+++ b/contrib/libarchive/libarchive/archive_read.c
@@ -171,7 +171,7 @@ static int64_t
 client_skip_proxy(struct archive_read_filter *self, int64_t request)
 {
 	if (request < 0)
-		__archive_errx(1, "Negative skip requested.");
+		__archive_errx(1, "Negative skip requested");
 	if (request == 0)
 		return 0;
 
@@ -379,7 +379,7 @@ archive_read_set_callback_data2(struct archive *_a, void *client_data,
 		if (a->client.dataset == NULL)
 		{
 			archive_set_error(&a->archive, ENOMEM,
-				"No memory.");
+				"No memory");
 			return ARCHIVE_FATAL;
 		}
 		a->client.nodes = 1;
@@ -388,7 +388,7 @@ archive_read_set_callback_data2(struct archive *_a, void *client_data,
 	if (iindex > a->client.nodes - 1)
 	{
 		archive_set_error(&a->archive, EINVAL,
-			"Invalid index specified.");
+			"Invalid index specified");
 		return ARCHIVE_FATAL;
 	}
 	a->client.dataset[iindex].data = client_data;
@@ -409,14 +409,14 @@ archive_read_add_callback_data(struct archive *_a, void *client_data,
 	    "archive_read_add_callback_data");
 	if (iindex > a->client.nodes) {
 		archive_set_error(&a->archive, EINVAL,
-			"Invalid index specified.");
+			"Invalid index specified");
 		return ARCHIVE_FATAL;
 	}
 	p = realloc(a->client.dataset, sizeof(*a->client.dataset)
 		* (++(a->client.nodes)));
 	if (p == NULL) {
 		archive_set_error(&a->archive, ENOMEM,
-			"No memory.");
+			"No memory");
 		return ARCHIVE_FATAL;
 	}
 	a->client.dataset = (struct archive_read_data_node *)p;
@@ -625,7 +625,7 @@ _archive_read_next_header2(struct archive *_a, struct archive_entry *entry)
 		r1 = archive_read_data_skip(&a->archive);
 		if (r1 == ARCHIVE_EOF)
 			archive_set_error(&a->archive, EIO,
-			    "Premature end-of-file.");
+			    "Premature end-of-file");
 		if (r1 == ARCHIVE_EOF || r1 == ARCHIVE_FATAL) {
 			a->archive.state = ARCHIVE_STATE_FATAL;
 			return (ARCHIVE_FATAL);
diff --git a/contrib/libarchive/libarchive/archive_read_append_filter.c b/contrib/libarchive/libarchive/archive_read_append_filter.c
index cd88df119906..d578b06fe714 100644
--- a/contrib/libarchive/libarchive/archive_read_append_filter.c
+++ b/contrib/libarchive/libarchive/archive_read_append_filter.c
@@ -104,6 +104,10 @@ archive_read_append_filter(struct archive *_a, int code)
       strcpy(str, "lrzip");
       r1 = archive_read_support_filter_lrzip(_a);
       break;
+    case ARCHIVE_FILTER_GRZIP:
*** 5263 LINES SKIPPED ***


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69e8d0b1.21ffa.3c2d786f>