Module Name:    src
Committed By:   joerg
Date:           Wed Jul 24 14:03:57 UTC 2019

Modified Files:
        src/external/bsd/libarchive/dist/libarchive: archive.h
            archive_openssl_hmac_private.h archive_pack_dev.c
            archive_pack_dev.h archive_read_disk_entry_from_file.c
            archive_read_support_format_iso9660.c archive_write.3
            archive_write_set_format_ar.c archive_write_set_format_shar.c
            archive_write_set_format_ustar.c

Log Message:
Merge changes from libarchive 3.4.0.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 \
    src/external/bsd/libarchive/dist/libarchive/archive.h \
    src/external/bsd/libarchive/dist/libarchive/archive_openssl_hmac_private.h \
    
src/external/bsd/libarchive/dist/libarchive/archive_read_support_format_iso9660.c
 \
    src/external/bsd/libarchive/dist/libarchive/archive_write_set_format_ar.c \
    src/external/bsd/libarchive/dist/libarchive/archive_write_set_format_shar.c 
\
    src/external/bsd/libarchive/dist/libarchive/archive_write_set_format_ustar.c
cvs rdiff -u -r1.2 -r1.3 \
    src/external/bsd/libarchive/dist/libarchive/archive_pack_dev.c \
    src/external/bsd/libarchive/dist/libarchive/archive_pack_dev.h
cvs rdiff -u -r1.5 -r1.6 \
    
src/external/bsd/libarchive/dist/libarchive/archive_read_disk_entry_from_file.c
cvs rdiff -u -r1.6 -r1.7 \
    src/external/bsd/libarchive/dist/libarchive/archive_write.3

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/bsd/libarchive/dist/libarchive/archive.h
diff -u src/external/bsd/libarchive/dist/libarchive/archive.h:1.3 src/external/bsd/libarchive/dist/libarchive/archive.h:1.4
--- src/external/bsd/libarchive/dist/libarchive/archive.h:1.3	Thu Apr 20 13:01:40 2017
+++ src/external/bsd/libarchive/dist/libarchive/archive.h	Wed Jul 24 14:03:57 2019
@@ -36,7 +36,7 @@
  * assert that ARCHIVE_VERSION_NUMBER >= 2012108.
  */
 /* Note: Compiler will complain if this does not match archive_entry.h! */
-#define	ARCHIVE_VERSION_NUMBER 3003002
+#define	ARCHIVE_VERSION_NUMBER 3004000
 
 #include <sys/stat.h>
 #include <stddef.h>  /* for wchar_t */
@@ -155,7 +155,7 @@ __LA_DECL int		archive_version_number(vo
 /*
  * Textual name/version of the library, useful for version displays.
  */
-#define	ARCHIVE_VERSION_ONLY_STRING "3.3.2dev"
+#define	ARCHIVE_VERSION_ONLY_STRING "3.4.0"
 #define	ARCHIVE_VERSION_STRING "libarchive " ARCHIVE_VERSION_ONLY_STRING
 __LA_DECL const char *	archive_version_string(void);
 
@@ -177,6 +177,7 @@ __LA_DECL const char *  archive_zlib_ver
 __LA_DECL const char *  archive_liblzma_version(void);
 __LA_DECL const char *  archive_bzlib_version(void);
 __LA_DECL const char *  archive_liblz4_version(void);
+__LA_DECL const char *  archive_libzstd_version(void);
 
 /* Declare our basic types. */
 struct archive;
@@ -276,6 +277,7 @@ typedef const char *archive_passphrase_c
 #define	ARCHIVE_FILTER_LZOP	11
 #define	ARCHIVE_FILTER_GRZIP	12
 #define	ARCHIVE_FILTER_LZ4	13
+#define	ARCHIVE_FILTER_ZSTD	14
 
 #if ARCHIVE_VERSION_NUMBER < 4000000
 #define	ARCHIVE_COMPRESSION_NONE	ARCHIVE_FILTER_NONE
@@ -338,6 +340,7 @@ typedef const char *archive_passphrase_c
 #define	ARCHIVE_FORMAT_RAR			0xD0000
 #define	ARCHIVE_FORMAT_7ZIP			0xE0000
 #define	ARCHIVE_FORMAT_WARC			0xF0000
+#define	ARCHIVE_FORMAT_RAR_V5			0x100000
 
 /*
  * Codes returned by archive_read_format_capabilities().
@@ -433,6 +436,7 @@ __LA_DECL int archive_read_support_filte
 __LA_DECL int archive_read_support_filter_rpm(struct archive *);
 __LA_DECL int archive_read_support_filter_uu(struct archive *);
 __LA_DECL int archive_read_support_filter_xz(struct archive *);
+__LA_DECL int archive_read_support_filter_zstd(struct archive *);
 
 __LA_DECL int archive_read_support_format_7zip(struct archive *);
 __LA_DECL int archive_read_support_format_all(struct archive *);
@@ -446,6 +450,7 @@ __LA_DECL int archive_read_support_forma
 __LA_DECL int archive_read_support_format_lha(struct archive *);
 __LA_DECL int archive_read_support_format_mtree(struct archive *);
 __LA_DECL int archive_read_support_format_rar(struct archive *);
+__LA_DECL int archive_read_support_format_rar5(struct archive *);
 __LA_DECL int archive_read_support_format_raw(struct archive *);
 __LA_DECL int archive_read_support_format_tar(struct archive *);
 __LA_DECL int archive_read_support_format_warc(struct archive *);
@@ -778,6 +783,7 @@ __LA_DECL int archive_write_add_filter_p
 		     const char *cmd);
 __LA_DECL int archive_write_add_filter_uuencode(struct archive *);
 __LA_DECL int archive_write_add_filter_xz(struct archive *);
+__LA_DECL int archive_write_add_filter_zstd(struct archive *);
 
 
 /* A convenience function to set the format based on the code or name. */
@@ -1089,6 +1095,8 @@ __LA_DECL int	archive_match_excluded(str
  */
 __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_set_inclusion_recursion(struct archive *, int);
 /* 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 *,
Index: src/external/bsd/libarchive/dist/libarchive/archive_openssl_hmac_private.h
diff -u src/external/bsd/libarchive/dist/libarchive/archive_openssl_hmac_private.h:1.3 src/external/bsd/libarchive/dist/libarchive/archive_openssl_hmac_private.h:1.4
--- src/external/bsd/libarchive/dist/libarchive/archive_openssl_hmac_private.h:1.3	Mon Feb  5 12:13:54 2018
+++ src/external/bsd/libarchive/dist/libarchive/archive_openssl_hmac_private.h	Wed Jul 24 14:03:57 2019
@@ -28,7 +28,8 @@
 #include <openssl/hmac.h>
 #include <openssl/opensslv.h>
 
-#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
+#if OPENSSL_VERSION_NUMBER < 0x10100000L || \
+	(defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x20700000L)
 #include <stdlib.h> /* malloc, free */
 #include <string.h> /* memset */
 static inline HMAC_CTX *HMAC_CTX_new(void)
Index: src/external/bsd/libarchive/dist/libarchive/archive_read_support_format_iso9660.c
diff -u src/external/bsd/libarchive/dist/libarchive/archive_read_support_format_iso9660.c:1.3 src/external/bsd/libarchive/dist/libarchive/archive_read_support_format_iso9660.c:1.4
--- src/external/bsd/libarchive/dist/libarchive/archive_read_support_format_iso9660.c:1.3	Thu Apr 20 13:01:40 2017
+++ src/external/bsd/libarchive/dist/libarchive/archive_read_support_format_iso9660.c	Wed Jul 24 14:03:57 2019
@@ -409,7 +409,8 @@ static int	next_entry_seek(struct archiv
 		    struct file_info **);
 static struct file_info *
 		parse_file_info(struct archive_read *a,
-		    struct file_info *parent, const unsigned char *isodirrec);
+		    struct file_info *parent, const unsigned char *isodirrec,
+		    size_t reclen);
 static int	parse_rockridge(struct archive_read *a,
 		    struct file_info *file, const unsigned char *start,
 		    const unsigned char *end);
@@ -1022,7 +1023,7 @@ read_children(struct archive_read *a, st
 			if (*(p + DR_name_len_offset) == 1
 			    && *(p + DR_name_offset) == '\001')
 				continue;
-			child = parse_file_info(a, parent, p);
+			child = parse_file_info(a, parent, p, b - p);
 			if (child == NULL) {
 				__archive_read_consume(a, skip_size);
 				return (ARCHIVE_FATAL);
@@ -1112,7 +1113,7 @@ choose_volume(struct archive_read *a, st
 	 */
 	seenJoliet = iso9660->seenJoliet;/* Save flag. */
 	iso9660->seenJoliet = 0;
-	file = parse_file_info(a, NULL, block);
+	file = parse_file_info(a, NULL, block, vd->size);
 	if (file == NULL)
 		return (ARCHIVE_FATAL);
 	iso9660->seenJoliet = seenJoliet;
@@ -1144,7 +1145,7 @@ choose_volume(struct archive_read *a, st
 			return (ARCHIVE_FATAL);
 		}
 		iso9660->seenJoliet = 0;
-		file = parse_file_info(a, NULL, block);
+		file = parse_file_info(a, NULL, block, vd->size);
 		if (file == NULL)
 			return (ARCHIVE_FATAL);
 		iso9660->seenJoliet = seenJoliet;
@@ -1723,8 +1724,7 @@ archive_read_format_iso9660_cleanup(stru
 	free(iso9660->read_ce_req.reqs);
 	archive_string_free(&iso9660->pathname);
 	archive_string_free(&iso9660->previous_pathname);
-	if (iso9660->pending_files.files)
-		free(iso9660->pending_files.files);
+	free(iso9660->pending_files.files);
 #ifdef HAVE_ZLIB_H
 	free(iso9660->entry_zisofs.uncompressed_buffer);
 	free(iso9660->entry_zisofs.block_pointers);
@@ -1749,7 +1749,7 @@ archive_read_format_iso9660_cleanup(stru
  */
 static struct file_info *
 parse_file_info(struct archive_read *a, struct file_info *parent,
-    const unsigned char *isodirrec)
+    const unsigned char *isodirrec, size_t reclen)
 {
 	struct iso9660 *iso9660;
 	struct file_info *file, *filep;
@@ -1763,16 +1763,20 @@ parse_file_info(struct archive_read *a, 
 
 	iso9660 = (struct iso9660 *)(a->format->data);
 
-	dr_len = (size_t)isodirrec[DR_length_offset];
-	name_len = (size_t)isodirrec[DR_name_len_offset];
-	location = archive_le32dec(isodirrec + DR_extent_offset);
-	fsize = toi(isodirrec + DR_size_offset, DR_size_size);
-	/* Sanity check that dr_len needs at least 34. */
-	if (dr_len < 34) {
+	if (reclen != 0)
+		dr_len = (size_t)isodirrec[DR_length_offset];
+	/*
+	 * Sanity check that reclen is not zero and dr_len is greater than
+	 * reclen but at least 34
+	 */
+	if (reclen == 0 || reclen < dr_len || dr_len < 34) {
 		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
-		    "Invalid length of directory record");
+			"Invalid length of directory record");
 		return (NULL);
 	}
+	name_len = (size_t)isodirrec[DR_name_len_offset];
+	location = archive_le32dec(isodirrec + DR_extent_offset);
+	fsize = toi(isodirrec + DR_size_offset, DR_size_size);
 	/* Sanity check that name_len doesn't exceed dr_len. */
 	if (dr_len - 33 < name_len || name_len == 0) {
 		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
@@ -2097,6 +2101,7 @@ parse_rockridge(struct archive_read *a, 
     const unsigned char *p, const unsigned char *end)
 {
 	struct iso9660 *iso9660;
+	int entry_seen = 0;
 
 	iso9660 = (struct iso9660 *)(a->format->data);
 
@@ -2252,8 +2257,16 @@ parse_rockridge(struct archive_read *a, 
 		}
 
 		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
@@ -3021,10 +3034,10 @@ heap_add_entry(struct archive_read *a, s
 			    ENOMEM, "Out of memory");
 			return (ARCHIVE_FATAL);
 		}
-		memcpy(new_pending_files, heap->files,
-		    heap->allocated * sizeof(new_pending_files[0]));
-		if (heap->files != NULL)
-			free(heap->files);
+		if (heap->allocated)
+			memcpy(new_pending_files, heap->files,
+			    heap->allocated * sizeof(new_pending_files[0]));
+		free(heap->files);
 		heap->files = new_pending_files;
 		heap->allocated = new_size;
 	}
Index: src/external/bsd/libarchive/dist/libarchive/archive_write_set_format_ar.c
diff -u src/external/bsd/libarchive/dist/libarchive/archive_write_set_format_ar.c:1.3 src/external/bsd/libarchive/dist/libarchive/archive_write_set_format_ar.c:1.4
--- src/external/bsd/libarchive/dist/libarchive/archive_write_set_format_ar.c:1.3	Thu Apr 20 13:01:40 2017
+++ src/external/bsd/libarchive/dist/libarchive/archive_write_set_format_ar.c	Wed Jul 24 14:03:57 2019
@@ -180,16 +180,21 @@ archive_write_ar_header(struct archive_w
 	}
 
 	memset(buff, ' ', 60);
-	strncpy(&buff[AR_fmag_offset], "`\n", 2);
+	memcpy(&buff[AR_fmag_offset], "`\n", 2);
 
 	if (strcmp(pathname, "/") == 0 ) {
 		/* Entry is archive symbol table in GNU format */
 		buff[AR_name_offset] = '/';
 		goto stat;
 	}
+	if (strcmp(pathname, "/SYM64/") == 0) {
+		/* Entry is archive symbol table in GNU 64-bit format */
+		memcpy(buff + AR_name_offset, "/SYM64/", 7);
+		goto stat;
+	}
 	if (strcmp(pathname, "__.SYMDEF") == 0) {
 		/* Entry is archive symbol table in BSD format */
-		strncpy(buff + AR_name_offset, "__.SYMDEF", 9);
+		memcpy(buff + AR_name_offset, "__.SYMDEF", 9);
 		goto stat;
 	}
 	if (strcmp(pathname, "//") == 0) {
@@ -225,7 +230,7 @@ archive_write_ar_header(struct archive_w
 		 * actually 15 bytes.
 		 */
 		if (strlen(filename) <= 15) {
-			strncpy(&buff[AR_name_offset], 
+			memcpy(&buff[AR_name_offset],
 			    filename, strlen(filename));
 			buff[AR_name_offset + strlen(filename)] = '/';
 		} else {
@@ -248,7 +253,7 @@ archive_write_ar_header(struct archive_w
 				return (ARCHIVE_FATAL);
 			}
 
-			strncpy(se, filename, strlen(filename));
+			memcpy(se, filename, strlen(filename));
 			strcpy(se + strlen(filename), "/\n");
 
 			ss = strstr(ar->strtab, se);
@@ -285,11 +290,11 @@ archive_write_ar_header(struct archive_w
 		 * archive header.
 		 */
 		if (strlen(filename) <= 16 && strchr(filename, ' ') == NULL) {
-			strncpy(&buff[AR_name_offset], filename, strlen(filename));
+			memcpy(&buff[AR_name_offset], filename, strlen(filename));
 			buff[AR_name_offset + strlen(filename)] = ' ';
 		}
 		else {
-			strncpy(buff + AR_name_offset, "#1/", 3);
+			memcpy(buff + AR_name_offset, "#1/", 3);
 			if (format_decimal(strlen(filename),
 			    buff + AR_name_offset + 3,
 			    AR_name_size - 3)) {
@@ -374,13 +379,14 @@ archive_write_ar_data(struct archive_wri
 			return (ARCHIVE_WARN);
 		}
 
-		ar->strtab = (char *)malloc(s);
+		ar->strtab = (char *)malloc(s + 1);
 		if (ar->strtab == NULL) {
 			archive_set_error(&a->archive, ENOMEM,
 			    "Can't allocate strtab buffer");
 			return (ARCHIVE_FATAL);
 		}
-		strncpy(ar->strtab, buff, s);
+		memcpy(ar->strtab, buff, s);
+		ar->strtab[s] = '\0';
 		ar->has_strtab = 1;
 	}
 
Index: src/external/bsd/libarchive/dist/libarchive/archive_write_set_format_shar.c
diff -u src/external/bsd/libarchive/dist/libarchive/archive_write_set_format_shar.c:1.3 src/external/bsd/libarchive/dist/libarchive/archive_write_set_format_shar.c:1.4
--- src/external/bsd/libarchive/dist/libarchive/archive_write_set_format_shar.c:1.3	Thu Apr 20 13:01:40 2017
+++ src/external/bsd/libarchive/dist/libarchive/archive_write_set_format_shar.c	Wed Jul 24 14:03:57 2019
@@ -169,8 +169,7 @@ archive_write_shar_header(struct archive
 	}
 
 	/* Save the entry for the closing. */
-	if (shar->entry)
-		archive_entry_free(shar->entry);
+	archive_entry_free(shar->entry);
 	shar->entry = archive_entry_clone(entry);
 	name = archive_entry_pathname(entry);
 
@@ -289,8 +288,7 @@ archive_write_shar_header(struct archive
 			    "mkdir -p %s > /dev/null 2>&1\n",
 			    shar->quoted_name.s);
 			/* Record that we just created this directory. */
-			if (shar->last_dir != NULL)
-				free(shar->last_dir);
+			free(shar->last_dir);
 
 			shar->last_dir = strdup(name);
 			/* Trim a trailing '/'. */
Index: src/external/bsd/libarchive/dist/libarchive/archive_write_set_format_ustar.c
diff -u src/external/bsd/libarchive/dist/libarchive/archive_write_set_format_ustar.c:1.3 src/external/bsd/libarchive/dist/libarchive/archive_write_set_format_ustar.c:1.4
--- src/external/bsd/libarchive/dist/libarchive/archive_write_set_format_ustar.c:1.3	Thu Apr 20 13:01:40 2017
+++ src/external/bsd/libarchive/dist/libarchive/archive_write_set_format_ustar.c	Wed Jul 24 14:03:57 2019
@@ -352,14 +352,12 @@ archive_write_ustar_header(struct archiv
 #endif
 	ret = __archive_write_format_header_ustar(a, buff, entry, -1, 1, sconv);
 	if (ret < ARCHIVE_WARN) {
-		if (entry_main)
-			archive_entry_free(entry_main);
+		archive_entry_free(entry_main);
 		return (ret);
 	}
 	ret2 = __archive_write_output(a, buff, 512);
 	if (ret2 < ARCHIVE_WARN) {
-		if (entry_main)
-			archive_entry_free(entry_main);
+		archive_entry_free(entry_main);
 		return (ret2);
 	}
 	if (ret2 < ret)
@@ -367,8 +365,7 @@ archive_write_ustar_header(struct archiv
 
 	ustar->entry_bytes_remaining = archive_entry_size(entry);
 	ustar->entry_padding = 0x1ff & (-(int64_t)ustar->entry_bytes_remaining);
-	if (entry_main)
-		archive_entry_free(entry_main);
+	archive_entry_free(entry_main);
 	return (ret);
 }
 

Index: src/external/bsd/libarchive/dist/libarchive/archive_pack_dev.c
diff -u src/external/bsd/libarchive/dist/libarchive/archive_pack_dev.c:1.2 src/external/bsd/libarchive/dist/libarchive/archive_pack_dev.c:1.3
--- src/external/bsd/libarchive/dist/libarchive/archive_pack_dev.c:1.2	Thu Apr 20 13:01:40 2017
+++ src/external/bsd/libarchive/dist/libarchive/archive_pack_dev.c	Wed Jul 24 14:03:57 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: archive_pack_dev.c,v 1.2 2017/04/20 13:01:40 joerg Exp $	*/
+/*	$NetBSD: archive_pack_dev.c,v 1.3 2019/07/24 14:03:57 joerg Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2001 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
 #include <sys/cdefs.h>
 #endif
 #if !defined(lint)
-__RCSID("$NetBSD: archive_pack_dev.c,v 1.2 2017/04/20 13:01:40 joerg Exp $");
+__RCSID("$NetBSD: archive_pack_dev.c,v 1.3 2019/07/24 14:03:57 joerg Exp $");
 #endif /* not lint */
 
 #ifdef HAVE_LIMITS_H
@@ -57,6 +57,12 @@ __RCSID("$NetBSD: archive_pack_dev.c,v 1
 #ifdef HAVE_SYS_STAT_H
 #include <sys/stat.h>
 #endif
+#ifdef HAVE_SYS_SYSMACROS_H
+#include <sys/sysmacros.h>
+#endif
+#ifdef HAVE_SYS_MKDEV_H
+#include <sys/mkdev.h>
+#endif
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
Index: src/external/bsd/libarchive/dist/libarchive/archive_pack_dev.h
diff -u src/external/bsd/libarchive/dist/libarchive/archive_pack_dev.h:1.2 src/external/bsd/libarchive/dist/libarchive/archive_pack_dev.h:1.3
--- src/external/bsd/libarchive/dist/libarchive/archive_pack_dev.h:1.2	Thu Apr 20 13:01:40 2017
+++ src/external/bsd/libarchive/dist/libarchive/archive_pack_dev.h	Wed Jul 24 14:03:57 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: archive_pack_dev.h,v 1.2 2017/04/20 13:01:40 joerg Exp $	*/
+/*	$NetBSD: archive_pack_dev.h,v 1.3 2019/07/24 14:03:57 joerg Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2001 The NetBSD Foundation, Inc.

Index: src/external/bsd/libarchive/dist/libarchive/archive_read_disk_entry_from_file.c
diff -u src/external/bsd/libarchive/dist/libarchive/archive_read_disk_entry_from_file.c:1.5 src/external/bsd/libarchive/dist/libarchive/archive_read_disk_entry_from_file.c:1.6
--- src/external/bsd/libarchive/dist/libarchive/archive_read_disk_entry_from_file.c:1.5	Thu Apr 20 13:01:40 2017
+++ src/external/bsd/libarchive/dist/libarchive/archive_read_disk_entry_from_file.c	Wed Jul 24 14:03:57 2019
@@ -127,7 +127,7 @@ archive_read_disk_entry_setup_acls(struc
 /*
  * Enter working directory and return working pathname of archive_entry.
  * If a pointer to an integer is provided and its value is below zero
- * open a file descriptor on this pahtname.
+ * open a file descriptor on this pathname.
  */
 const char *
 archive_read_disk_entry_setup_path(struct archive_read_disk *a,
@@ -163,6 +163,9 @@ archive_read_disk_entry_from_file(struct
 	int initial_fd = fd;
 	int r, r1;
 
+	archive_check_magic(_a, ARCHIVE_READ_DISK_MAGIC, ARCHIVE_STATE_ANY,
+		"archive_read_disk_entry_from_file");
+
 	archive_clear_error(_a);
 	path = archive_entry_sourcepath(entry);
 	if (path == NULL)
@@ -188,7 +191,7 @@ archive_read_disk_entry_from_file(struct
 				}
 			} else
 #endif
-			if (stat(path, &s) != 0) {
+			if (la_stat(path, &s) != 0) {
 				archive_set_error(&a->archive, errno,
 				    "Can't stat %s", path);
 				return (ARCHIVE_FAILED);
@@ -928,11 +931,10 @@ setup_sparse(struct archive_read_disk *a
 		return (ARCHIVE_OK);
 
 	/* Does filesystem support the reporting of hole ? */
-	if (*fd < 0) {
+	if (*fd < 0)
 		path = archive_read_disk_entry_setup_path(a, entry, fd);
-		if (path == NULL)
-			return (ARCHIVE_FAILED);
-	}
+	else
+		path = NULL;
 
 	if (*fd >= 0) {
 #ifdef _PC_MIN_HOLE_SIZE
@@ -943,6 +945,8 @@ setup_sparse(struct archive_read_disk *a
 		if (initial_off != 0)
 			lseek(*fd, 0, SEEK_SET);
 	} else {
+		if (path == NULL)
+			return (ARCHIVE_FAILED);
 #ifdef _PC_MIN_HOLE_SIZE
 		if (pathconf(path, _PC_MIN_HOLE_SIZE) <= 0)
 			return (ARCHIVE_OK);

Index: src/external/bsd/libarchive/dist/libarchive/archive_write.3
diff -u src/external/bsd/libarchive/dist/libarchive/archive_write.3:1.6 src/external/bsd/libarchive/dist/libarchive/archive_write.3:1.7
--- src/external/bsd/libarchive/dist/libarchive/archive_write.3:1.6	Thu Apr 20 13:01:40 2017
+++ src/external/bsd/libarchive/dist/libarchive/archive_write.3	Wed Jul 24 14:03:57 2019
@@ -71,7 +71,7 @@ support.
 .\"
 .Ss Set options
 See
-.Xr archive_read_set_options 3 .
+.Xr archive_write_set_options 3 .
 .\"
 .Ss Open archive
 See

Reply via email to