Author: mm
Date: Mon May 20 12:57:39 2019
New Revision: 347990
URL: https://svnweb.freebsd.org/changeset/base/347990

Log:
  MFV r347989:
  Sync libarchive with vendor.
  
  Relevant vendor changes:
    Issue #795: XAR - do not try to add xattrs without an allocated name
    PR #812: non-recursive option for extract and list
    PR #958: support reading metadata from compressed files
    PR #999: add --exclude-vcs option to bsdtar
    Issue #1062: treat empty archives with a GNU volume header as valid
    PR #1074: Handle ZIP files with trailing 0s in the extra fields
              (Android APK archives)
    PR #1109: Ignore padding in Zip extra field data (Android APK archives)
    PR #1167: fix problems related to unreadable directories
    Issue #1168: fix handling of strtol() and strtoul()
    PR #1172: RAR5 - fix invalid window buffer read in E8E9 filter
    PR #1174: ZIP reader - fix of MSZIP signature parsing
    PR #1175: gzip filter - fix reading files larger than 4GB from memory
    PR #1177: gzip filter - fix memory leak with repeated header reads
    PR #1180: ZIP reader - add support for Info-ZIP Unicode Path Extra Field
    PR #1181: RAR5 - fix merge_block() recursion
              (OSS-Fuzz 12999, 13029, 13144, 13478, 13490)
    PR #1183: fix memory leak when decompressing ZIP files with LZMA
    PR #1184: fix RAR5 OSS-Fuzz issues 12466, 14490, 14491, 12817
      OSS-Fuzz 12466: RAR5 - fix buffer overflow when parsing huffman tables
      OSS-Fuzz 14490, 14491: RAR5 - fix bad shift-left operations
      OSS-Fuzz 12817: RAR5 - handle a case with truncated huffman tables
    PR #1186: RAR5 - fix invalid type used for dictionary size mask
              (OSS-Fuzz 14537)
    PR #1187: RAR5 - fix integer overflow (OSS-Fuzz 14555)
    PR #1190: RAR5 - RAR5 don't try to unpack entries marked as directories
              (OSS-Fuzz 14574)
    PR #1196: RAR5 - fix a potential SIGSEGV on 32-bit builds
    OSS-Fuzz 2582: RAR - fix use after free if there is an invalid entry
    OSS-Fuzz 14331: RAR5 - fix maximum owner name length
    OSS-Fuzz 13965: RAR5 - use unsigned int for volume number + range check
  
    Additional RAR5 reader changes:
      - support symlinks, hardlinks, file owner, file group, versioned files
      - change ARCHIVE_FORMAT_RAR_V5 to 0x100000
      - set correct mode for readonly directories
      - support readonly, hidden and system Windows file attributes
  
  MFC after:    2 weeks

Added:
  head/contrib/libarchive/libarchive/archive_entry_misc.3
     - copied unchanged from r347989, 
vendor/libarchive/dist/libarchive/archive_entry_misc.3
  
head/contrib/libarchive/libarchive/test/test_read_format_mtree_noprint.mtree.uu
     - copied unchanged from r347989, 
vendor/libarchive/dist/libarchive/test/test_read_format_mtree_noprint.mtree.uu
  
head/contrib/libarchive/libarchive/test/test_read_format_rar5_distance_overflow.rar.uu
     - copied unchanged from r347989, 
vendor/libarchive/dist/libarchive/test/test_read_format_rar5_distance_overflow.rar.uu
  
head/contrib/libarchive/libarchive/test/test_read_format_rar5_extra_field_version.rar.uu
     - copied unchanged from r347989, 
vendor/libarchive/dist/libarchive/test/test_read_format_rar5_extra_field_version.rar.uu
  head/contrib/libarchive/libarchive/test/test_read_format_rar5_fileattr.rar.uu
     - copied unchanged from r347989, 
vendor/libarchive/dist/libarchive/test/test_read_format_rar5_fileattr.rar.uu
  head/contrib/libarchive/libarchive/test/test_read_format_rar5_hardlink.rar.uu
     - copied unchanged from r347989, 
vendor/libarchive/dist/libarchive/test/test_read_format_rar5_hardlink.rar.uu
  
head/contrib/libarchive/libarchive/test/test_read_format_rar5_invalid_dict_reference.rar.uu
     - copied unchanged from r347989, 
vendor/libarchive/dist/libarchive/test/test_read_format_rar5_invalid_dict_reference.rar.uu
  
head/contrib/libarchive/libarchive/test/test_read_format_rar5_leftshift1.rar.uu
     - copied unchanged from r347989, 
vendor/libarchive/dist/libarchive/test/test_read_format_rar5_leftshift1.rar.uu
  
head/contrib/libarchive/libarchive/test/test_read_format_rar5_leftshift2.rar.uu
     - copied unchanged from r347989, 
vendor/libarchive/dist/libarchive/test/test_read_format_rar5_leftshift2.rar.uu
  
head/contrib/libarchive/libarchive/test/test_read_format_rar5_nonempty_dir_stream.rar.uu
     - copied unchanged from r347989, 
vendor/libarchive/dist/libarchive/test/test_read_format_rar5_nonempty_dir_stream.rar.uu
  head/contrib/libarchive/libarchive/test/test_read_format_rar5_owner.rar.uu
     - copied unchanged from r347989, 
vendor/libarchive/dist/libarchive/test/test_read_format_rar5_owner.rar.uu
  
head/contrib/libarchive/libarchive/test/test_read_format_rar5_readtables_overflow.rar.uu
     - copied unchanged from r347989, 
vendor/libarchive/dist/libarchive/test/test_read_format_rar5_readtables_overflow.rar.uu
  head/contrib/libarchive/libarchive/test/test_read_format_rar5_symlink.rar.uu
     - copied unchanged from r347989, 
vendor/libarchive/dist/libarchive/test/test_read_format_rar5_symlink.rar.uu
  
head/contrib/libarchive/libarchive/test/test_read_format_rar5_truncated_huff.rar.uu
     - copied unchanged from r347989, 
vendor/libarchive/dist/libarchive/test/test_read_format_rar5_truncated_huff.rar.uu
  
head/contrib/libarchive/libarchive/test/test_read_format_rar_ppmd_use_after_free.rar.uu
     - copied unchanged from r347989, 
vendor/libarchive/dist/libarchive/test/test_read_format_rar_ppmd_use_after_free.rar.uu
  head/contrib/libarchive/libarchive/test/test_read_format_raw.data.gz.uu
     - copied unchanged from r347989, 
vendor/libarchive/dist/libarchive/test/test_read_format_raw.data.gz.uu
  
head/contrib/libarchive/libarchive/test/test_read_format_tar_empty_with_gnulabel.c
     - copied unchanged from r347989, 
vendor/libarchive/dist/libarchive/test/test_read_format_tar_empty_with_gnulabel.c
  
head/contrib/libarchive/libarchive/test/test_read_format_tar_empty_with_gnulabel.tar.uu
     - copied unchanged from r347989, 
vendor/libarchive/dist/libarchive/test/test_read_format_tar_empty_with_gnulabel.tar.uu
  head/contrib/libarchive/libarchive/test/test_read_format_zip_7075_utf8_paths.c
     - copied unchanged from r347989, 
vendor/libarchive/dist/libarchive/test/test_read_format_zip_7075_utf8_paths.c
  
head/contrib/libarchive/libarchive/test/test_read_format_zip_7075_utf8_paths.zip.uu
     - copied unchanged from r347989, 
vendor/libarchive/dist/libarchive/test/test_read_format_zip_7075_utf8_paths.zip.uu
  head/contrib/libarchive/libarchive/test/test_read_format_zip_extra_padding.c
     - copied unchanged from r347989, 
vendor/libarchive/dist/libarchive/test/test_read_format_zip_extra_padding.c
  
head/contrib/libarchive/libarchive/test/test_read_format_zip_extra_padding.zip.uu
     - copied unchanged from r347989, 
vendor/libarchive/dist/libarchive/test/test_read_format_zip_extra_padding.zip.uu
  
head/contrib/libarchive/libarchive/test/test_read_format_zip_lzma_alone_leak.zipx.uu
     - copied unchanged from r347989, 
vendor/libarchive/dist/libarchive/test/test_read_format_zip_lzma_alone_leak.zipx.uu
  head/contrib/libarchive/tar/test/test_option_exclude_vcs.c
     - copied unchanged from r347989, 
vendor/libarchive/dist/tar/test/test_option_exclude_vcs.c
Modified:
  head/contrib/libarchive/NEWS
  head/contrib/libarchive/cpio/test/test_basic.c
  head/contrib/libarchive/cpio/test/test_format_newc.c
  head/contrib/libarchive/cpio/test/test_gcpio_compat.c
  head/contrib/libarchive/cpio/test/test_option_L_upper.c
  head/contrib/libarchive/cpio/test/test_option_a.c
  head/contrib/libarchive/cpio/test/test_option_c.c
  head/contrib/libarchive/libarchive/archive.h
  head/contrib/libarchive/libarchive/archive_entry.c
  head/contrib/libarchive/libarchive/archive_entry.h
  head/contrib/libarchive/libarchive/archive_entry_private.h
  head/contrib/libarchive/libarchive/archive_hmac.c
  head/contrib/libarchive/libarchive/archive_match.c
  head/contrib/libarchive/libarchive/archive_platform.h
  head/contrib/libarchive/libarchive/archive_read.c
  head/contrib/libarchive/libarchive/archive_read_disk_entry_from_file.c
  head/contrib/libarchive/libarchive/archive_read_disk_posix.c
  head/contrib/libarchive/libarchive/archive_read_private.h
  head/contrib/libarchive/libarchive/archive_read_set_format.c
  head/contrib/libarchive/libarchive/archive_read_support_filter_gzip.c
  head/contrib/libarchive/libarchive/archive_read_support_format_cab.c
  head/contrib/libarchive/libarchive/archive_read_support_format_mtree.c
  head/contrib/libarchive/libarchive/archive_read_support_format_rar.c
  head/contrib/libarchive/libarchive/archive_read_support_format_rar5.c
  head/contrib/libarchive/libarchive/archive_read_support_format_raw.c
  head/contrib/libarchive/libarchive/archive_read_support_format_tar.c
  head/contrib/libarchive/libarchive/archive_read_support_format_warc.c
  head/contrib/libarchive/libarchive/archive_read_support_format_xar.c
  head/contrib/libarchive/libarchive/archive_read_support_format_zip.c
  head/contrib/libarchive/libarchive/archive_util.c
  head/contrib/libarchive/libarchive/archive_write_add_filter_xz.c
  head/contrib/libarchive/libarchive/archive_write_disk_posix.c
  head/contrib/libarchive/libarchive/archive_write_set_format_pax.c
  head/contrib/libarchive/libarchive/archive_write_set_format_xar.c
  head/contrib/libarchive/libarchive/test/test_entry.c
  head/contrib/libarchive/libarchive/test/test_fuzz.c
  head/contrib/libarchive/libarchive/test/test_read_disk_directory_traversals.c
  head/contrib/libarchive/libarchive/test/test_read_extract.c
  head/contrib/libarchive/libarchive/test/test_read_format_mtree.c
  head/contrib/libarchive/libarchive/test/test_read_format_rar.c
  head/contrib/libarchive/libarchive/test/test_read_format_rar5.c
  head/contrib/libarchive/libarchive/test/test_read_format_rar5_win32.rar.uu
  head/contrib/libarchive/libarchive/test/test_read_format_raw.c
  head/contrib/libarchive/libarchive/test/test_read_format_zip.c
  head/contrib/libarchive/libarchive/test/test_sparse_basic.c
  head/contrib/libarchive/libarchive/test/test_write_disk_symlink.c
  head/contrib/libarchive/tar/bsdtar.1
  head/contrib/libarchive/tar/bsdtar.c
  head/contrib/libarchive/tar/bsdtar.h
  head/contrib/libarchive/tar/cmdline.c
  head/contrib/libarchive/tar/test/test_basic.c
  head/contrib/libarchive/tar/test/test_copy.c
  head/contrib/libarchive/tar/test/test_option_C_mtree.c
  head/contrib/libarchive/tar/test/test_option_H_upper.c
  head/contrib/libarchive/tar/test/test_option_L_upper.c
  head/contrib/libarchive/tar/test/test_option_U_upper.c
  head/contrib/libarchive/tar/test/test_option_n.c
  head/contrib/libarchive/tar/test/test_option_s.c
  head/contrib/libarchive/tar/test/test_strip_components.c
  head/contrib/libarchive/tar/test/test_symlink_dir.c
  head/contrib/libarchive/test_utils/test_common.h
  head/contrib/libarchive/test_utils/test_main.c
  head/lib/libarchive/Makefile
  head/lib/libarchive/tests/Makefile
  head/usr.bin/tar/tests/Makefile
Directory Properties:
  head/contrib/libarchive/   (props changed)

Modified: head/contrib/libarchive/NEWS
==============================================================================
--- head/contrib/libarchive/NEWS        Mon May 20 12:32:00 2019        
(r347989)
+++ head/contrib/libarchive/NEWS        Mon May 20 12:57:39 2019        
(r347990)
@@ -1,3 +1,13 @@
+Apr 16, 2019: Support for non-recursive list and extract
+
+Apr 14, 2019: New tar option: --exclude-vcs
+
+Mar 27, 2019: Support for file and directory symlinks on Windows
+
+Mar 12, 2019: Important fixes for storing file attributes and flags
+
+Jan 20, 2019: Support for xz, lzma, ppmd8 and bzip2 compression in zip archives
+
 Oct 06, 2018: RAR 5.0 reader
 
 Sep 03, 2018: libarchive 3.3.3 released

Modified: head/contrib/libarchive/cpio/test/test_basic.c
==============================================================================
--- head/contrib/libarchive/cpio/test/test_basic.c      Mon May 20 12:32:00 
2019        (r347989)
+++ head/contrib/libarchive/cpio/test/test_basic.c      Mon May 20 12:57:39 
2019        (r347990)
@@ -46,7 +46,7 @@ verify_files(const char *msg)
 
        /* Symlink */
        if (canSymlink())
-               assertIsSymlink("symlink", "file");
+               assertIsSymlink("symlink", "file", 0);
 
        /* Another file with 1 link and different permissions. */
        failure(msg);
@@ -173,7 +173,7 @@ DEFINE_TEST(test_basic)
 
        /* Symlink to above file. */
        if (canSymlink()) {
-               assertMakeSymlink("symlink", "file");
+               assertMakeSymlink("symlink", "file", 0);
                fprintf(filelist, "symlink\n");
                if (is_LargeInode("symlink")) {
                        strncat(result,

Modified: head/contrib/libarchive/cpio/test/test_format_newc.c
==============================================================================
--- head/contrib/libarchive/cpio/test/test_format_newc.c        Mon May 20 
12:32:00 2019        (r347989)
+++ head/contrib/libarchive/cpio/test/test_format_newc.c        Mon May 20 
12:57:39 2019        (r347990)
@@ -114,7 +114,7 @@ DEFINE_TEST(test_format_newc)
 
        /* "symlink" */
        if (canSymlink()) {
-               assertMakeSymlink("symlink", "file1");
+               assertMakeSymlink("symlink", "file1", 0);
                fprintf(list, "symlink\n");
        }
 
@@ -233,7 +233,12 @@ DEFINE_TEST(test_format_newc)
                assert(is_hex(e, 110));
                assertEqualMem(e + 0, "070701", 6); /* Magic */
                assert(is_hex(e + 6, 8)); /* ino */
+#if defined(_WIN32) && !defined(CYGWIN)
+               /* Mode: Group members bits and others bits do not work. */
+               assertEqualInt(0xa180, from_hex(e + 14, 8) & 0xffc0);
+#else
                assertEqualInt(0xa1ff, from_hex(e + 14, 8)); /* Mode */
+#endif
                assertEqualInt(from_hex(e + 22, 8), uid); /* uid */
                assertEqualInt(gid, from_hex(e + 30, 8)); /* gid */
                assertEqualMem(e + 38, "00000001", 8); /* nlink */

Modified: head/contrib/libarchive/cpio/test/test_gcpio_compat.c
==============================================================================
--- head/contrib/libarchive/cpio/test/test_gcpio_compat.c       Mon May 20 
12:32:00 2019        (r347989)
+++ head/contrib/libarchive/cpio/test/test_gcpio_compat.c       Mon May 20 
12:57:39 2019        (r347990)
@@ -71,7 +71,7 @@ unpack_test(const char *from, const char *options, con
 
        /* Symlink */
        if (canSymlink())
-               assertIsSymlink("symlink", "file");
+               assertIsSymlink("symlink", "file", 0);
 
        /* dir */
        assertIsDir("dir", 0775);

Modified: head/contrib/libarchive/cpio/test/test_option_L_upper.c
==============================================================================
--- head/contrib/libarchive/cpio/test/test_option_L_upper.c     Mon May 20 
12:32:00 2019        (r347989)
+++ head/contrib/libarchive/cpio/test/test_option_L_upper.c     Mon May 20 
12:57:39 2019        (r347990)
@@ -30,8 +30,10 @@ __FBSDID("$FreeBSD$");
  * tests won't run on Windows. */
 #if defined(_WIN32) && !defined(__CYGWIN__)
 #define CAT "type"
+#define SEP "\\"
 #else
 #define CAT "cat"
+#define SEP "/"
 #endif
 
 DEFINE_TEST(test_option_L_upper)
@@ -51,7 +53,7 @@ DEFINE_TEST(test_option_L_upper)
        fprintf(filelist, "file\n");
 
        /* Symlink to above file. */
-       assertMakeSymlink("symlink", "file");
+       assertMakeSymlink("symlink", "file", 0);
        fprintf(filelist, "symlink\n");
 
        fclose(filelist);
@@ -61,7 +63,7 @@ DEFINE_TEST(test_option_L_upper)
        assertTextFileContents("1 block\n", "copy.err");
 
        failure("Regular -p without -L should preserve symlinks.");
-       assertIsSymlink("copy/symlink", NULL);
+       assertIsSymlink("copy/symlink", NULL, 0);
 
        r = systemf(CAT " filelist | %s -pd -L copy-L >copy-L.out 
2>copy-L.err", testprog);
        assertEqualInt(r, 0);
@@ -77,13 +79,14 @@ DEFINE_TEST(test_option_L_upper)
 
        assertMakeDir("unpack", 0755);
        assertChdir("unpack");
-       r = systemf(CAT " ../archive.out | %s -i >unpack.out 2>unpack.err", 
testprog);
+       r = systemf(CAT " .." SEP "archive.out | %s -i >unpack.out 
2>unpack.err", testprog);
+
        failure("Error invoking %s -i", testprog);
        assertEqualInt(r, 0);
        assertTextFileContents("1 block\n", "unpack.err");
        assertChdir("..");
 
-       assertIsSymlink("unpack/symlink", NULL);
+       assertIsSymlink("unpack/symlink", NULL, 0);
 
        r = systemf(CAT " filelist | %s -oL >archive-L.out 2>archive-L.err", 
testprog);
        failure("Error invoking %s -oL", testprog);
@@ -92,7 +95,8 @@ DEFINE_TEST(test_option_L_upper)
 
        assertMakeDir("unpack-L", 0755);
        assertChdir("unpack-L");
-       r = systemf(CAT " ../archive-L.out | %s -i >unpack-L.out 
2>unpack-L.err", testprog);
+       r = systemf(CAT " .." SEP "archive-L.out | %s -i >unpack-L.out 
2>unpack-L.err", testprog);
+
        failure("Error invoking %s -i < archive-L.out", testprog);
        assertEqualInt(r, 0);
        assertTextFileContents("1 block\n", "unpack-L.err");

Modified: head/contrib/libarchive/cpio/test/test_option_a.c
==============================================================================
--- head/contrib/libarchive/cpio/test/test_option_a.c   Mon May 20 12:32:00 
2019        (r347989)
+++ head/contrib/libarchive/cpio/test/test_option_a.c   Mon May 20 12:57:39 
2019        (r347990)
@@ -71,8 +71,13 @@ test_create(void)
                 * #ifdef this section out.  Most of the test below is
                 * still valid. */
                memset(&times, 0, sizeof(times));
+#if defined(_WIN32) && !defined(CYGWIN)
+               times.actime = 86400;
+               times.modtime = 86400;
+#else
                times.actime = 1;
                times.modtime = 3;
+#endif
                assertEqualInt(0, utime(files[i].name, &times));
 
                /* Record whatever atime the file ended up with. */

Modified: head/contrib/libarchive/cpio/test/test_option_c.c
==============================================================================
--- head/contrib/libarchive/cpio/test/test_option_c.c   Mon May 20 12:32:00 
2019        (r347989)
+++ head/contrib/libarchive/cpio/test/test_option_c.c   Mon May 20 12:57:39 
2019        (r347990)
@@ -85,7 +85,7 @@ DEFINE_TEST(test_option_c)
 
        /* "symlink" */
        if (canSymlink()) {
-               assertMakeSymlink("symlink", "file");
+               assertMakeSymlink("symlink", "file", 0);
                fprintf(filelist, "symlink\n");
        }
 

Modified: head/contrib/libarchive/libarchive/archive.h
==============================================================================
--- head/contrib/libarchive/libarchive/archive.h        Mon May 20 12:32:00 
2019        (r347989)
+++ head/contrib/libarchive/libarchive/archive.h        Mon May 20 12:57:39 
2019        (r347990)
@@ -338,9 +338,9 @@ typedef const char *archive_passphrase_callback(struct
 #define        ARCHIVE_FORMAT_LHA                      0xB0000
 #define        ARCHIVE_FORMAT_CAB                      0xC0000
 #define        ARCHIVE_FORMAT_RAR                      0xD0000
-#define        ARCHIVE_FORMAT_RAR_V5                   (ARCHIVE_FORMAT_RAR | 1)
 #define        ARCHIVE_FORMAT_7ZIP                     0xE0000
 #define        ARCHIVE_FORMAT_WARC                     0xF0000
+#define        ARCHIVE_FORMAT_RAR_V5                   0x100000
 
 /*
  * Codes returned by archive_read_format_capabilities().
@@ -1095,6 +1095,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_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 *,

Modified: head/contrib/libarchive/libarchive/archive_entry.c
==============================================================================
--- head/contrib/libarchive/libarchive/archive_entry.c  Mon May 20 12:32:00 
2019        (r347989)
+++ head/contrib/libarchive/libarchive/archive_entry.c  Mon May 20 12:57:39 
2019        (r347990)
@@ -168,6 +168,7 @@ archive_entry_clear(struct archive_entry *entry)
        archive_entry_xattr_clear(entry);
        archive_entry_sparse_clear(entry);
        free(entry->stat);
+       entry->ae_symlink_type = AE_SYMLINK_TYPE_UNDEFINED;
        memset(entry, 0, sizeof(*entry));
        return entry;
 }
@@ -202,6 +203,9 @@ archive_entry_clone(struct archive_entry *entry)
        entry2->ae_set = entry->ae_set;
        archive_mstring_copy(&entry2->ae_uname, &entry->ae_uname);
 
+       /* Copy symlink type */
+       entry2->ae_symlink_type = entry->ae_symlink_type;
+
        /* Copy encryption status */
        entry2->encryption = entry->encryption;
        
@@ -253,6 +257,7 @@ archive_entry_new2(struct archive *a)
        if (entry == NULL)
                return (NULL);
        entry->archive = a;
+       entry->ae_symlink_type = AE_SYMLINK_TYPE_UNDEFINED;
        return (entry);
 }
 
@@ -675,6 +680,12 @@ archive_entry_symlink(struct archive_entry *entry)
        return (NULL);
 }
 
+int
+archive_entry_symlink_type(struct archive_entry *entry)
+{
+       return (entry->ae_symlink_type);
+}
+
 const char *
 archive_entry_symlink_utf8(struct archive_entry *entry)
 {
@@ -1246,6 +1257,12 @@ archive_entry_set_symlink(struct archive_entry *entry,
 }
 
 void
+archive_entry_set_symlink_type(struct archive_entry *entry, int type)
+{
+       entry->ae_symlink_type = type;
+}
+
+void
 archive_entry_set_symlink_utf8(struct archive_entry *entry, const char 
*linkname)
 {
        archive_mstring_copy_utf8(&entry->ae_symlink, linkname);
@@ -1749,6 +1766,10 @@ static const struct flag {
        { "nohidden",   L"nohidden",            UF_HIDDEN,      0},
        { "nouhidden",  L"nouhidden",           UF_HIDDEN,      0},
 #endif
+#ifdef FILE_ATTRIBUTE_HIDDEN
+       { "nohidden",   L"nohidden",    FILE_ATTRIBUTE_HIDDEN,  0},
+       { "nouhidden",  L"nouhidden",   FILE_ATTRIBUTE_HIDDEN,  0},
+#endif
 #ifdef UF_OFFLINE
        { "nooffline",  L"nooffline",           UF_OFFLINE,     0},
        { "nouoffline", L"nouoffline",          UF_OFFLINE,     0},
@@ -1758,6 +1779,11 @@ static const struct flag {
        { "nourdonly",  L"nourdonly",           UF_READONLY,    0},
        { "noreadonly", L"noreadonly",          UF_READONLY,    0},
 #endif
+#ifdef FILE_ATTRIBUTE_READONLY
+       { "nordonly",   L"nordonly",    FILE_ATTRIBUTE_READONLY,        0},
+       { "nourdonly",  L"nourdonly",   FILE_ATTRIBUTE_READONLY,        0},
+       { "noreadonly", L"noreadonly",  FILE_ATTRIBUTE_READONLY,        0},
+#endif
 #ifdef UF_SPARSE
        { "nosparse",   L"nosparse",            UF_SPARSE,      0},
        { "nousparse",  L"nousparse",           UF_SPARSE,      0},
@@ -1769,6 +1795,10 @@ static const struct flag {
 #ifdef UF_SYSTEM
        { "nosystem",   L"nosystem",            UF_SYSTEM,      0},
        { "nousystem",  L"nousystem",           UF_SYSTEM,      0},
+#endif
+#ifdef FILE_ATTRIBUTE_SYSTEM
+       { "nosystem",   L"nosystem",    FILE_ATTRIBUTE_SYSTEM,  0},
+       { "nousystem",  L"nousystem",   FILE_ATTRIBUTE_SYSTEM,  0},
 #endif
 #if defined(FS_UNRM_FL)                /* 'u' */
        { "noundel",    L"noundel",             FS_UNRM_FL,     0},

Modified: head/contrib/libarchive/libarchive/archive_entry.h
==============================================================================
--- head/contrib/libarchive/libarchive/archive_entry.h  Mon May 20 12:32:00 
2019        (r347989)
+++ head/contrib/libarchive/libarchive/archive_entry.h  Mon May 20 12:57:39 
2019        (r347990)
@@ -191,6 +191,13 @@ struct archive_entry;
 #define AE_IFIFO       ((__LA_MODE_T)0010000)
 
 /*
+ * Symlink types
+ */
+#define AE_SYMLINK_TYPE_UNDEFINED      0
+#define AE_SYMLINK_TYPE_FILE           1
+#define AE_SYMLINK_TYPE_DIRECTORY      2
+
+/*
  * Basic object manipulation
  */
 
@@ -275,6 +282,7 @@ __LA_DECL int                
archive_entry_size_is_set(struct archi
 __LA_DECL const char   *archive_entry_strmode(struct archive_entry *);
 __LA_DECL const char   *archive_entry_symlink(struct archive_entry *);
 __LA_DECL const char   *archive_entry_symlink_utf8(struct archive_entry *);
+__LA_DECL int           archive_entry_symlink_type(struct archive_entry *);
 __LA_DECL const wchar_t        *archive_entry_symlink_w(struct archive_entry 
*);
 __LA_DECL la_int64_t    archive_entry_uid(struct archive_entry *);
 __LA_DECL const char   *archive_entry_uname(struct archive_entry *);
@@ -350,6 +358,7 @@ __LA_DECL void      archive_entry_unset_size(struct archive
 __LA_DECL void archive_entry_copy_sourcepath(struct archive_entry *, const 
char *);
 __LA_DECL void archive_entry_copy_sourcepath_w(struct archive_entry *, const 
wchar_t *);
 __LA_DECL void archive_entry_set_symlink(struct archive_entry *, const char *);
+__LA_DECL void archive_entry_set_symlink_type(struct archive_entry *, int);
 __LA_DECL void archive_entry_set_symlink_utf8(struct archive_entry *, const 
char *);
 __LA_DECL void archive_entry_copy_symlink(struct archive_entry *, const char 
*);
 __LA_DECL void archive_entry_copy_symlink_w(struct archive_entry *, const 
wchar_t *);
@@ -692,7 +701,6 @@ __LA_DECL void archive_entry_linkify(struct archive_en
     struct archive_entry **, struct archive_entry **);
 __LA_DECL struct archive_entry *archive_entry_partial_links(
     struct archive_entry_linkresolver *res, unsigned int *links);
-
 #ifdef __cplusplus
 }
 #endif

Copied: head/contrib/libarchive/libarchive/archive_entry_misc.3 (from r347989, 
vendor/libarchive/dist/libarchive/archive_entry_misc.3)
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/contrib/libarchive/libarchive/archive_entry_misc.3     Mon May 20 
12:57:39 2019        (r347990, copy of r347989, 
vendor/libarchive/dist/libarchive/archive_entry_misc.3)
@@ -0,0 +1,62 @@
+.\" Copyright (c) 2019 Martin Matuska
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd April 15, 2019
+.Dt ARCHIVE_ENTRY_MISC 3
+.Os
+.Sh NAME
+.Nm archive_entry_symlink_type ,
+.Nm archive_entry_set_symlink_type
+.Nd miscellaneous functions for manipulating properties of archive_entry.
+.Sh LIBRARY
+Streaming Archive Library (libarchive, -larchive)
+.Sh SYNOPSIS
+.In archive_entry.h
+.Ft int
+.Fn archive_entry_symlink_type "struct archive_entry *a"
+.Ft void
+.Fn archive_entry_set_symlink_type "struct archive_entry *a" "int"
+.Sh DESCRIPTION
+The function
+.Fn archive_entry_symlink_type
+returns and the function
+.Fn archive_entry_set_symlink_type
+sets the type of the symbolic link stored in an archive entry. These functions
+have special meaning on operating systems that support multiple symbolic link
+types (e.g. Microsoft Windows).
+.Pp
+Supported values are:
+.Bl -tag -width "AE_SYMLINK_TYPE_DIRECTORY" -compact
+.It AE_SYMLINK_TYPE_UNDEFINED
+Symbolic link target type is not defined (default on unix systems)
+.It AE_SYMLINK_TYPE_FILE
+Symbolic link points to a file
+.It AE_SYMLINK_TYPE_DIRECTORY
+Symbolic link points to a directory
+.El
+.Sh SEE ALSO
+.Xr archive_entry 3 ,
+.Xr archive_entry_paths 3 ,
+.Xr archive_entry_stat 3 ,
+.Xr libarchive 3

Modified: head/contrib/libarchive/libarchive/archive_entry_private.h
==============================================================================
--- head/contrib/libarchive/libarchive/archive_entry_private.h  Mon May 20 
12:32:00 2019        (r347989)
+++ head/contrib/libarchive/libarchive/archive_entry_private.h  Mon May 20 
12:57:39 2019        (r347990)
@@ -176,6 +176,9 @@ struct archive_entry {
 
        /* Miscellaneous. */
        char             strmode[12];
+
+       /* Symlink type support */
+       int ae_symlink_type;
 };
 
 #endif /* ARCHIVE_ENTRY_PRIVATE_H_INCLUDED */

Modified: head/contrib/libarchive/libarchive/archive_hmac.c
==============================================================================
--- head/contrib/libarchive/libarchive/archive_hmac.c   Mon May 20 12:32:00 
2019        (r347989)
+++ head/contrib/libarchive/libarchive/archive_hmac.c   Mon May 20 12:57:39 
2019        (r347990)
@@ -83,6 +83,7 @@ __hmac_sha1_cleanup(archive_hmac_sha1_ctx *ctx)
 static int
 __hmac_sha1_init(archive_hmac_sha1_ctx *ctx, const uint8_t *key, size_t 
key_len)
 {
+#pragma GCC diagnostic ignored "-Wcast-qual"
        BCRYPT_ALG_HANDLE hAlg;
        BCRYPT_HASH_HANDLE hHash;
        DWORD hash_len;

Modified: head/contrib/libarchive/libarchive/archive_match.c
==============================================================================
--- head/contrib/libarchive/libarchive/archive_match.c  Mon May 20 12:32:00 
2019        (r347989)
+++ head/contrib/libarchive/libarchive/archive_match.c  Mon May 20 12:57:39 
2019        (r347990)
@@ -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_set_inclusion_recursion(struct archive *_a, int enabled)
+{
+       struct archive_match *a;
+
+       archive_check_magic(_a, ARCHIVE_MATCH_MAGIC,
+           ARCHIVE_STATE_NEW, "archive_match_set_inclusion_recursion");
+       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,10 @@ static int
 match_path_inclusion(struct archive_match *a, struct match *m,
     int mbs, const void *pn)
 {
-       int flag = PATHMATCH_NO_ANCHOR_END;
+       /* Recursive operation requires only a prefix match. */
+       int flag = a->recursive_include ?
+               PATHMATCH_NO_ANCHOR_END :
+               0;
        int r;
 
        if (mbs) {
@@ -1232,7 +1261,7 @@ set_timefilter_pathname_mbs(struct archive_match *a, i
                archive_set_error(&(a->archive), EINVAL, "pathname is empty");
                return (ARCHIVE_FAILED);
        }
-       if (stat(path, &st) != 0) {
+       if (la_stat(path, &st) != 0) {
                archive_set_error(&(a->archive), errno, "Failed to stat()");
                return (ARCHIVE_FAILED);
        }

Modified: head/contrib/libarchive/libarchive/archive_platform.h
==============================================================================
--- head/contrib/libarchive/libarchive/archive_platform.h       Mon May 20 
12:32:00 2019        (r347989)
+++ head/contrib/libarchive/libarchive/archive_platform.h       Mon May 20 
12:57:39 2019        (r347990)
@@ -69,6 +69,8 @@
  * either Windows or Posix APIs. */
 #if (defined(__WIN32__) || defined(_WIN32) || defined(__WIN32)) && 
!defined(__CYGWIN__)
 #include "archive_windows.h"
+#else
+#define la_stat(path,stref)            stat(path,stref)
 #endif
 
 /*

Modified: head/contrib/libarchive/libarchive/archive_read.c
==============================================================================
--- head/contrib/libarchive/libarchive/archive_read.c   Mon May 20 12:32:00 
2019        (r347989)
+++ head/contrib/libarchive/libarchive/archive_read.c   Mon May 20 12:57:39 
2019        (r347990)
@@ -611,6 +611,15 @@ choose_filters(struct archive_read *a)
        return (ARCHIVE_FATAL);
 }
 
+int
+__archive_read_header(struct archive_read *a, struct archive_entry *entry)
+{
+       if (a->filter->read_header)
+               return a->filter->read_header(a->filter, entry);
+       else
+               return (ARCHIVE_OK);
+}
+
 /*
  * Read header of next entry.
  */

Modified: head/contrib/libarchive/libarchive/archive_read_disk_entry_from_file.c
==============================================================================
--- head/contrib/libarchive/libarchive/archive_read_disk_entry_from_file.c      
Mon May 20 12:32:00 2019        (r347989)
+++ head/contrib/libarchive/libarchive/archive_read_disk_entry_from_file.c      
Mon May 20 12:57:39 2019        (r347990)
@@ -191,7 +191,7 @@ archive_read_disk_entry_from_file(struct archive *_a,
                                }
                        } 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);

Modified: head/contrib/libarchive/libarchive/archive_read_disk_posix.c
==============================================================================
--- head/contrib/libarchive/libarchive/archive_read_disk_posix.c        Mon May 
20 12:32:00 2019        (r347989)
+++ head/contrib/libarchive/libarchive/archive_read_disk_posix.c        Mon May 
20 12:57:39 2019        (r347990)
@@ -909,7 +909,7 @@ next_entry(struct archive_read_disk *a, struct tree *t
                            }
                        }
                        break;
-               }       
+               }
        } while (lst == NULL);
 
 #ifdef __APPLE__
@@ -1295,10 +1295,23 @@ archive_read_disk_descend(struct archive *_a)
        if (t->visit_type != TREE_REGULAR || !t->descend)
                return (ARCHIVE_OK);
 
+       /*
+        * We must not treat the initial specified path as a physical dir,
+        * because if we do then we will try and ascend out of it by opening
+        * ".." which is (a) wrong and (b) causes spurious permissions errors
+        * if ".." is not readable by us. Instead, treat it as if it were a
+        * symlink. (This uses an extra fd, but it can only happen once at the
+        * top level of a traverse.) But we can't necessarily assume t->st is
+        * valid here (though t->lst is), which complicates the logic a
+        * little.
+        */
        if (tree_current_is_physical_dir(t)) {
                tree_push(t, t->basename, t->current_filesystem_id,
                    t->lst.st_dev, t->lst.st_ino, &t->restore_time);
-               t->stack->flags |= isDir;
+               if (t->stack->parent->parent != NULL)
+                       t->stack->flags |= isDir;
+               else
+                       t->stack->flags |= isDirLink;
        } else if (tree_current_is_dir(t)) {
                tree_push(t, t->basename, t->current_filesystem_id,
                    t->st.st_dev, t->st.st_ino, &t->restore_time);
@@ -2151,6 +2164,17 @@ tree_open(const char *path, int symlink_mode, int rest
 static struct tree *
 tree_reopen(struct tree *t, const char *path, int restore_time)
 {
+#if defined(O_PATH)
+       /* Linux */
+       const int o_flag = O_PATH;
+#elif defined(O_SEARCH)
+       /* SunOS */
+       const int o_flag = O_SEARCH;
+#elif defined(O_EXEC)
+       /* FreeBSD */
+       const int o_flag = O_EXEC;
+#endif
+
        t->flags = (restore_time != 0)?needsRestoreTimes:0;
        t->flags |= onInitialDir;
        t->visit_type = 0;
@@ -2172,6 +2196,15 @@ tree_reopen(struct tree *t, const char *path, int rest
        t->stack->flags = needsFirstVisit;
        t->maxOpenCount = t->openCount = 1;
        t->initial_dir_fd = open(".", O_RDONLY | O_CLOEXEC);
+#if defined(O_PATH) || defined(O_SEARCH) || defined(O_EXEC)
+       /*
+        * Most likely reason to fail opening "." is that it's not readable,
+        * so try again for execute. The consequences of not opening this are
+        * unhelpful and unnecessary errors later.
+        */
+       if (t->initial_dir_fd < 0)
+               t->initial_dir_fd = open(".", o_flag | O_CLOEXEC);
+#endif
        __archive_ensure_cloexec_flag(t->initial_dir_fd);
        t->working_dir_fd = tree_dup(t->initial_dir_fd);
        return (t);
@@ -2479,7 +2512,7 @@ tree_current_stat(struct tree *t)
 #else
                if (tree_enter_working_dir(t) != 0)
                        return NULL;
-               if (stat(tree_current_access_path(t), &t->st) != 0)
+               if (la_stat(tree_current_access_path(t), &t->st) != 0)
 #endif
                        return NULL;
                t->flags |= hasStat;

Modified: head/contrib/libarchive/libarchive/archive_read_private.h
==============================================================================
--- head/contrib/libarchive/libarchive/archive_read_private.h   Mon May 20 
12:32:00 2019        (r347989)
+++ head/contrib/libarchive/libarchive/archive_read_private.h   Mon May 20 
12:57:39 2019        (r347990)
@@ -98,6 +98,8 @@ struct archive_read_filter {
        int (*close)(struct archive_read_filter *self);
        /* Function that handles switching from reading one block to the 
next/prev */
        int (*sswitch)(struct archive_read_filter *self, unsigned int iindex);
+       /* Read any header metadata if available. */
+       int (*read_header)(struct archive_read_filter *self, struct 
archive_entry *entry);
        /* My private data. */
        void *data;
 
@@ -250,6 +252,7 @@ int64_t     __archive_read_seek(struct archive_read*, int6
 int64_t        __archive_read_filter_seek(struct archive_read_filter *, 
int64_t, int);
 int64_t        __archive_read_consume(struct archive_read *, int64_t);
 int64_t        __archive_read_filter_consume(struct archive_read_filter *, 
int64_t);
+int __archive_read_header(struct archive_read *, struct archive_entry *);
 int __archive_read_program(struct archive_read_filter *, const char *);
 void __archive_read_free_filters(struct archive_read *);
 struct archive_read_extract *__archive_read_get_extract(struct archive_read *);

Modified: head/contrib/libarchive/libarchive/archive_read_set_format.c
==============================================================================
--- head/contrib/libarchive/libarchive/archive_read_set_format.c        Mon May 
20 12:32:00 2019        (r347989)
+++ head/contrib/libarchive/libarchive/archive_read_set_format.c        Mon May 
20 12:57:39 2019        (r347990)
@@ -73,6 +73,9 @@ archive_read_set_format(struct archive *_a, int code)
     case ARCHIVE_FORMAT_RAR:
       strcpy(str, "rar");
       break;
+    case ARCHIVE_FORMAT_RAR_V5:
+      strcpy(str, "rar5");
+      break;
     case ARCHIVE_FORMAT_TAR:
       strcpy(str, "tar");
       break;

Modified: head/contrib/libarchive/libarchive/archive_read_support_filter_gzip.c
==============================================================================
--- head/contrib/libarchive/libarchive/archive_read_support_filter_gzip.c       
Mon May 20 12:32:00 2019        (r347989)
+++ head/contrib/libarchive/libarchive/archive_read_support_filter_gzip.c       
Mon May 20 12:57:39 2019        (r347990)
@@ -37,6 +37,9 @@ __FBSDID("$FreeBSD$");
 #ifdef HAVE_STRING_H
 #include <string.h>
 #endif
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
@@ -45,6 +48,8 @@ __FBSDID("$FreeBSD$");
 #endif
 
 #include "archive.h"
+#include "archive_entry.h"
+#include "archive_endian.h"
 #include "archive_private.h"
 #include "archive_read_private.h"
 
@@ -56,6 +61,8 @@ struct private_data {
        size_t           out_block_size;
        int64_t          total_out;
        unsigned long    crc;
+       uint32_t         mtime;
+       char            *name;
        char             eof; /* True = found end of compressed data. */
 };
 
@@ -123,7 +130,8 @@ archive_read_support_filter_gzip(struct archive *_a)
  * count of bits verified, suitable for use by bidder.
  */
 static ssize_t
-peek_at_header(struct archive_read_filter *filter, int *pbits)
+peek_at_header(struct archive_read_filter *filter, int *pbits,
+              struct private_data *state)
 {
        const unsigned char *p;
        ssize_t avail, len;
@@ -144,7 +152,9 @@ peek_at_header(struct archive_read_filter *filter, int
                return (0);
        bits += 3;
        header_flags = p[3];
-       /* Bytes 4-7 are mod time. */
+       /* Bytes 4-7 are mod time in little endian. */
+       if (state)
+               state->mtime = archive_le32dec(p + 4);
        /* Byte 8 is deflate flags. */
        /* XXXX TODO: return deflate flags back to consume_header for use
           in initializing the decompressor. */
@@ -161,6 +171,7 @@ peek_at_header(struct archive_read_filter *filter, int
 
        /* Null-terminated optional filename. */
        if (header_flags & 8) {
+               ssize_t file_start = len;
                do {
                        ++len;
                        if (avail < len)
@@ -169,6 +180,12 @@ peek_at_header(struct archive_read_filter *filter, int
                        if (p == NULL)
                                return (0);
                } while (p[len - 1] != 0);
+
+               if (state) {
+                       /* Reset the name in case of repeat header reads. */
+                       free(state->name);
+                       state->name = strdup((const char *)&p[file_start]);
+               }
        }
 
        /* Null-terminated optional comment. */
@@ -214,12 +231,29 @@ gzip_bidder_bid(struct archive_read_filter_bidder *sel
 
        (void)self; /* UNUSED */
 
-       if (peek_at_header(filter, &bits_checked))
+       if (peek_at_header(filter, &bits_checked, NULL))
                return (bits_checked);
        return (0);
 }
 
+static int
+gzip_read_header(struct archive_read_filter *self, struct archive_entry *entry)
+{
+       struct private_data *state;
 
+       state = (struct private_data *)self->data;
+
+       /* A mtime of 0 is considered invalid/missing. */
+       if (state->mtime != 0)
+               archive_entry_set_mtime(entry, state->mtime, 0);
+
+       /* If the name is available, extract it. */
+       if (state->name)
+               archive_entry_set_pathname(entry, state->name);
+
+       return (ARCHIVE_OK);
+}
+
 #ifndef HAVE_ZLIB_H
 
 /*
@@ -272,6 +306,7 @@ gzip_bidder_init(struct archive_read_filter *self)
        self->read = gzip_filter_read;
        self->skip = NULL; /* not supported */
        self->close = gzip_filter_close;
+       self->read_header = gzip_read_header;
 
        state->in_stream = 0; /* We're not actually within a stream yet. */
 
@@ -289,7 +324,7 @@ consume_header(struct archive_read_filter *self)
        state = (struct private_data *)self->data;
 
        /* If this is a real header, consume it. */
-       len = peek_at_header(self->upstream, NULL);
+       len = peek_at_header(self->upstream, NULL, state);
        if (len == 0)
                return (ARCHIVE_EOF);
        __archive_read_filter_consume(self->upstream, len);
@@ -374,7 +409,7 @@ gzip_filter_read(struct archive_read_filter *self, con
 {
        struct private_data *state;
        size_t decompressed;
-       ssize_t avail_in;
+       ssize_t avail_in, max_in;
        int ret;
 
        state = (struct private_data *)self->data;
@@ -408,6 +443,12 @@ gzip_filter_read(struct archive_read_filter *self, con
                            "truncated gzip input");
                        return (ARCHIVE_FATAL);
                }
+               if (UINT_MAX >= SSIZE_MAX)
+                       max_in = SSIZE_MAX;
+               else
+                       max_in = UINT_MAX;
+               if (avail_in > max_in)
+                       avail_in = max_in;
                state->stream.avail_in = (uInt)avail_in;
 
                /* Decompress and consume some of that data. */
@@ -469,6 +510,7 @@ gzip_filter_close(struct archive_read_filter *self)
                }
        }
 
+       free(state->name);
        free(state->out_block);
        free(state);
        return (ret);

Modified: head/contrib/libarchive/libarchive/archive_read_support_format_cab.c
==============================================================================
--- head/contrib/libarchive/libarchive/archive_read_support_format_cab.c        
Mon May 20 12:32:00 2019        (r347989)
+++ head/contrib/libarchive/libarchive/archive_read_support_format_cab.c        
Mon May 20 12:57:39 2019        (r347990)
@@ -1509,8 +1509,8 @@ cab_read_ahead_cfdata_deflate(struct archive_read *a, 
                        }
                        if (mszip == 1 && cab->stream.next_in[0] != 0x4b)
                                goto nomszip;
-                       else if (cab->stream.next_in[0] != 0x43 ||
-                           cab->stream.next_in[1] != 0x4b)
+                       else if (mszip == 2 && (cab->stream.next_in[0] != 0x43 
||
+                           cab->stream.next_in[1] != 0x4b))
                                goto nomszip;
                        cab->stream.next_in += mszip;
                        cab->stream.avail_in -= mszip;

Modified: head/contrib/libarchive/libarchive/archive_read_support_format_mtree.c
==============================================================================
--- head/contrib/libarchive/libarchive/archive_read_support_format_mtree.c      
Mon May 20 12:32:00 2019        (r347989)
+++ head/contrib/libarchive/libarchive/archive_read_support_format_mtree.c      
Mon May 20 12:57:39 2019        (r347990)
@@ -45,6 +45,9 @@ __FBSDID("$FreeBSD$");
 #ifdef HAVE_STRING_H
 #include <string.h>
 #endif
+#ifdef HAVE_CTYPE_H
+#include <ctype.h>
+#endif
 
 #include "archive.h"
 #include "archive_entry.h"
@@ -1011,7 +1014,7 @@ read_mtree(struct archive_read *a, struct mtree *mtree
 {
        ssize_t len;
        uintmax_t counter;
-       char *p;
+       char *p, *s;
        struct mtree_option *global;
        struct mtree_entry *last_entry;
        int r, is_form_d;
@@ -1025,6 +1028,7 @@ read_mtree(struct archive_read *a, struct mtree *mtree
        (void)detect_form(a, &is_form_d);
 
        for (counter = 1; ; ++counter) {
+               r = ARCHIVE_OK;
                len = readline(a, mtree, &p, 65536);
                if (len == 0) {
                        mtree->this_entry = mtree->entries;
@@ -1045,6 +1049,15 @@ read_mtree(struct archive_read *a, struct mtree *mtree
                        continue;
                if (*p == '\r' || *p == '\n' || *p == '\0')
                        continue;
+               /* Non-printable characters are not allowed */
+               for (s = p;s < p + len - 1; s++) {
+                       if (!isprint(*s)) {
+                               r = ARCHIVE_FATAL;
+                               break;
+                       }
+               }
+               if (r != ARCHIVE_OK)
+                       break;
                if (*p != '/') {
                        r = process_add_entry(a, mtree, &global, p, len,
                            &last_entry, is_form_d);

Modified: head/contrib/libarchive/libarchive/archive_read_support_format_rar.c
==============================================================================
--- head/contrib/libarchive/libarchive/archive_read_support_format_rar.c        
Mon May 20 12:32:00 2019        (r347989)
+++ head/contrib/libarchive/libarchive/archive_read_support_format_rar.c        
Mon May 20 12:57:39 2019        (r347990)
@@ -1024,8 +1024,10 @@ archive_read_format_rar_read_data(struct archive_read 
   case COMPRESS_METHOD_GOOD:
   case COMPRESS_METHOD_BEST:
     ret = read_data_compressed(a, buff, size, offset);
-    if (ret != ARCHIVE_OK && ret != ARCHIVE_WARN)
+    if (ret != ARCHIVE_OK && ret != ARCHIVE_WARN) {
       __archive_ppmd7_functions.Ppmd7_Free(&rar->ppmd7_context);
+      rar->start_new_table = 1;
+    }
     break;
 
   default:

Modified: head/contrib/libarchive/libarchive/archive_read_support_format_rar5.c
==============================================================================
--- head/contrib/libarchive/libarchive/archive_read_support_format_rar5.c       
Mon May 20 12:32:00 2019        (r347989)
+++ head/contrib/libarchive/libarchive/archive_read_support_format_rar5.c       
Mon May 20 12:57:39 2019        (r347990)
@@ -33,6 +33,9 @@
 #ifdef HAVE_ZLIB_H
 #include <zlib.h> /* crc32 */
 #endif
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
 
 #include "archive.h"
 #ifndef HAVE_ZLIB_H
@@ -78,230 +81,275 @@
 
 static unsigned char rar5_signature[] = { 243, 192, 211, 128, 187, 166, 160, 
161 };
 static const ssize_t rar5_signature_size = sizeof(rar5_signature);
-/* static const size_t g_unpack_buf_chunk_size = 1024; */
 static const size_t g_unpack_window_size = 0x20000;
 
+/* These could have been static const's, but they aren't, because of
+ * Visual Studio. */
+#define MAX_NAME_IN_CHARS 2048
+#define MAX_NAME_IN_BYTES (4 * MAX_NAME_IN_CHARS)
+
 struct file_header {
-    ssize_t bytes_remaining;
-    ssize_t unpacked_size;
-    int64_t last_offset;         /* Used in sanity checks. */
-    int64_t last_size;           /* Used in sanity checks. */
+       ssize_t bytes_remaining;
+       ssize_t unpacked_size;
+       int64_t last_offset;         /* Used in sanity checks. */
+       int64_t last_size;           /* Used in sanity checks. */
 
-    uint8_t solid : 1;           /* Is this a solid stream? */
-    uint8_t service : 1;         /* Is this file a service data? */
-    uint8_t eof : 1;             /* Did we finish unpacking the file? */
+       uint8_t solid : 1;           /* Is this a solid stream? */
+       uint8_t service : 1;         /* Is this file a service data? */
+       uint8_t eof : 1;             /* Did we finish unpacking the file? */
+       uint8_t dir : 1;             /* Is this file entry a directory? */
 
-    /* Optional time fields. */
-    uint64_t e_mtime;
-    uint64_t e_ctime;
-    uint64_t e_atime;
-    uint32_t e_unix_ns;
+       /* Optional time fields. */
+       uint64_t e_mtime;
+       uint64_t e_ctime;
+       uint64_t e_atime;
+       uint32_t e_unix_ns;
 
-    /* Optional hash fields. */
-    uint32_t stored_crc32;
-    uint32_t calculated_crc32;
-    uint8_t blake2sp[32];
-    blake2sp_state b2state;
-    char has_blake2;
+       /* Optional hash fields. */
+       uint32_t stored_crc32;
+       uint32_t calculated_crc32;
+       uint8_t blake2sp[32];
+       blake2sp_state b2state;
+       char has_blake2;
+
+       /* Optional redir fields */
+       uint64_t redir_type;
+       uint64_t redir_flags;
 };
 
+enum EXTRA {
+       EX_CRYPT = 0x01,
+       EX_HASH = 0x02,
+       EX_HTIME = 0x03,
+       EX_VERSION = 0x04,
+       EX_REDIR = 0x05,
+       EX_UOWNER = 0x06,
+       EX_SUBDATA = 0x07
+};
+
+#define REDIR_SYMLINK_IS_DIR   1
+
+enum REDIR_TYPE {
+       REDIR_TYPE_NONE = 0,
+       REDIR_TYPE_UNIXSYMLINK = 1,
+       REDIR_TYPE_WINSYMLINK = 2,
+       REDIR_TYPE_JUNCTION = 3,
+       REDIR_TYPE_HARDLINK = 4,
+       REDIR_TYPE_FILECOPY = 5,
+};
+
+#define        OWNER_USER_NAME         0x01
+#define        OWNER_GROUP_NAME        0x02
+#define        OWNER_USER_UID          0x04
+#define        OWNER_GROUP_GID         0x08
+#define        OWNER_MAXNAMELEN        256
+
 enum FILTER_TYPE {
-    FILTER_DELTA = 0,   /* Generic pattern. */
-    FILTER_E8    = 1,   /* Intel x86 code. */
-    FILTER_E8E9  = 2,   /* Intel x86 code. */
-    FILTER_ARM   = 3,   /* ARM code. */
-    FILTER_AUDIO = 4,   /* Audio filter, not used in RARv5. */
-    FILTER_RGB   = 5,   /* Color palette, not used in RARv5. */
-    FILTER_ITANIUM = 6, /* Intel's Itanium, not used in RARv5. */
-    FILTER_PPM   = 7,   /* Predictive pattern matching, not used in RARv5. */
-    FILTER_NONE  = 8,
+       FILTER_DELTA = 0,   /* Generic pattern. */
+       FILTER_E8    = 1,   /* Intel x86 code. */
+       FILTER_E8E9  = 2,   /* Intel x86 code. */
+       FILTER_ARM   = 3,   /* ARM code. */
+       FILTER_AUDIO = 4,   /* Audio filter, not used in RARv5. */
+       FILTER_RGB   = 5,   /* Color palette, not used in RARv5. */
+       FILTER_ITANIUM = 6, /* Intel's Itanium, not used in RARv5. */
+       FILTER_PPM   = 7,   /* Predictive pattern matching, not used in
+                              RARv5. */
+       FILTER_NONE  = 8,
 };
 
 struct filter_info {
-    int type;
-    int channels;
-    int pos_r;
+       int type;
+       int channels;
+       int pos_r;
 
-    int64_t block_start;
-    ssize_t block_length;
-    uint16_t width;
+       int64_t block_start;
+       ssize_t block_length;
+       uint16_t width;
 };
 
 struct data_ready {
-    char used;
-    const uint8_t* buf;
-    size_t size;
-    int64_t offset;
+       char used;
+       const uint8_t* buf;
+       size_t size;
+       int64_t offset;
 };
 
 struct cdeque {
-    uint16_t beg_pos;
-    uint16_t end_pos;
-    uint16_t cap_mask;
-    uint16_t size;
-    size_t* arr;
+       uint16_t beg_pos;
+       uint16_t end_pos;
+       uint16_t cap_mask;
+       uint16_t size;
+       size_t* arr;
 };
 
 struct decode_table {
-    uint32_t size;
-    int32_t decode_len[16];
-    uint32_t decode_pos[16];
-    uint32_t quick_bits;

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to