Author: mm
Date: Mon Nov 26 11:01:51 2018
New Revision: 340938
URL: https://svnweb.freebsd.org/changeset/base/340938

Log:
  Update vendor/libarchive/dist to git 2c5e9bdbb62eeb56a37776f796c15ed16727193e
  Relevant vendor changes:
    Issue #1096: Support extracting ACLs with in-entry comments (GNU tar)
    PR #1023: Support extracting extattrs as non-root on non-user-writable files

Modified:
  vendor/libarchive/dist/CMakeLists.txt
  vendor/libarchive/dist/libarchive/archive_acl.c
  vendor/libarchive/dist/libarchive/archive_write_disk_posix.c
  vendor/libarchive/dist/libarchive/test/test_extattr_freebsd.c
  vendor/libarchive/dist/libarchive/test/test_read_format_rar5.c

Modified: vendor/libarchive/dist/CMakeLists.txt
==============================================================================
--- vendor/libarchive/dist/CMakeLists.txt       Mon Nov 26 10:53:17 2018        
(r340937)
+++ vendor/libarchive/dist/CMakeLists.txt       Mon Nov 26 11:01:51 2018        
(r340938)
@@ -592,6 +592,8 @@ ENDIF(ZSTD_FOUND)
 MARK_AS_ADVANCED(CLEAR ZSTD_INCLUDE_DIR)
 MARK_AS_ADVANCED(CLEAR ZSTD_LIBRARY)
 
+set(CMAKE_REQUIRED_LIBRARIES)
+
 #
 # Check headers
 #

Modified: vendor/libarchive/dist/libarchive/archive_acl.c
==============================================================================
--- vendor/libarchive/dist/libarchive/archive_acl.c     Mon Nov 26 10:53:17 
2018        (r340937)
+++ vendor/libarchive/dist/libarchive/archive_acl.c     Mon Nov 26 11:01:51 
2018        (r340938)
@@ -1585,18 +1585,30 @@ next_field_w(const wchar_t **wp, const wchar_t **start
 
        /* Scan for the separator. */
        while (**wp != L'\0' && **wp != L',' && **wp != L':' &&
-           **wp != L'\n') {
+           **wp != L'\n' && **wp != L'#') {
                (*wp)++;
        }
        *sep = **wp;
 
-       /* Trim trailing whitespace to locate end of field. */
-       *end = *wp - 1;
-       while (**end == L' ' || **end == L'\t' || **end == L'\n') {
-               (*end)--;
+       /* Locate end of field, trim trailing whitespace if necessary */
+       if (*wp == *start) {
+               *end = *wp;
+       } else {
+               *end = *wp - 1;
+               while (**end == L' ' || **end == L'\t' || **end == L'\n') {
+                       (*end)--;
+               }
+               (*end)++;
        }
-       (*end)++;
 
+       /* Handle in-field comments */
+       if (*sep == L'#') {
+               while (**wp != L'\0' && **wp != L',' && **wp != L'\n') {
+                       (*wp)++;
+               }
+               *sep = **wp;
+       }
+
        /* Adjust scanner location. */
        if (**wp != L'\0')
                (*wp)++;
@@ -1646,7 +1658,7 @@ archive_acl_from_text_l(struct archive_acl *acl, const
        ret = ARCHIVE_OK;
        types = 0;
 
-       while (text != NULL  &&  *text != '\0') {
+       while (text != NULL &&  *text != '\0') {
                /*
                 * Parse the fields out of the next entry,
                 * advance 'text' to start of next entry.
@@ -2057,23 +2069,30 @@ next_field(const char **p, const char **start,
        *start = *p;
 
        /* Scan for the separator. */
-       while (**p != '\0' && **p != ',' && **p != ':' && **p != '\n') {
+       while (**p != '\0' && **p != ',' && **p != ':' && **p != '\n' &&
+           **p != '#') {
                (*p)++;
        }
        *sep = **p;
 
-       /* If the field is only whitespace, bail out now. */
-       if (**p == '\0') {
+       /* Locate end of field, trim trailing whitespace if necessary */
+       if (*p == *start) {
                *end = *p;
-               return;
+       } else {
+               *end = *p - 1;
+               while (**end == ' ' || **end == '\t' || **end == '\n') {
+                       (*end)--;
+               }
+               (*end)++;
        }
 
-       /* Trim trailing whitespace to locate end of field. */
-       *end = *p - 1;
-       while (**end == ' ' || **end == '\t' || **end == '\n') {
-               (*end)--;
+       /* Handle in-field comments */
+       if (*sep == '#') {
+               while (**p != '\0' && **p != ',' && **p != '\n') {
+                       (*p)++;
+               }
+               *sep = **p;
        }
-       (*end)++;
 
        /* Adjust scanner location. */
        if (**p != '\0')

Modified: vendor/libarchive/dist/libarchive/archive_write_disk_posix.c
==============================================================================
--- vendor/libarchive/dist/libarchive/archive_write_disk_posix.c        Mon Nov 
26 10:53:17 2018        (r340937)
+++ vendor/libarchive/dist/libarchive/archive_write_disk_posix.c        Mon Nov 
26 11:01:51 2018        (r340938)
@@ -1705,6 +1705,20 @@ _archive_write_disk_finish_entry(struct archive *_a)
        }
 
        /*
+        * HYPOTHESIS:
+        * If we're not root, we won't be setting any security
+        * attributes that may be wiped by the set_mode() routine
+        * below.  We also can't set xattr on non-owner-writable files,
+        * which may be the state after set_mode(). Perform
+        * set_xattrs() first based on these constraints.
+        */
+       if (a->user_uid != 0 &&
+           (a->todo & TODO_XATTR)) {
+               int r2 = set_xattrs(a);
+               if (r2 < ret) ret = r2;
+       }
+
+       /*
         * set_mode must precede ACLs on systems such as Solaris and
         * FreeBSD where setting the mode implicitly clears extended ACLs
         */
@@ -1717,8 +1731,10 @@ _archive_write_disk_finish_entry(struct archive *_a)
         * Security-related extended attributes (such as
         * security.capability on Linux) have to be restored last,
         * since they're implicitly removed by other file changes.
+        * We do this last only when root.
         */
-       if (a->todo & TODO_XATTR) {
+       if (a->user_uid == 0 &&
+           (a->todo & TODO_XATTR)) {
                int r2 = set_xattrs(a);
                if (r2 < ret) ret = r2;
        }
@@ -2222,6 +2238,15 @@ create_filesystem_object(struct archive_write_disk *a)
         * security, so we never restore them at this point.
         */
        mode = final_mode & 0777 & ~a->user_umask;
+
+       /* 
+        * Always create writable such that [f]setxattr() works if we're not
+        * root.
+        */
+       if (a->user_uid != 0 &&
+           a->todo & (TODO_HFS_COMPRESSION | TODO_XATTR)) {
+               mode |= 0200;
+       }
 
        switch (a->mode & AE_IFMT) {
        default:

Modified: vendor/libarchive/dist/libarchive/test/test_extattr_freebsd.c
==============================================================================
--- vendor/libarchive/dist/libarchive/test/test_extattr_freebsd.c       Mon Nov 
26 10:53:17 2018        (r340937)
+++ vendor/libarchive/dist/libarchive/test/test_extattr_freebsd.c       Mon Nov 
26 11:01:51 2018        (r340938)
@@ -48,7 +48,6 @@ DEFINE_TEST(test_extattr_freebsd)
        struct archive *a;
        struct archive_entry *ae;
        int n, fd;
-       int extattr_privilege_bug = 0;
 
        /*
         * First, do a quick manual set/read of an extended attribute
@@ -72,24 +71,6 @@ DEFINE_TEST(test_extattr_freebsd)
        assertEqualInt(4, n);
        close(fd);
 
-       /*
-        * Repeat the above, but with file permissions set to 0000.
-        * This should work (extattr_set_fd() should follow fd
-        * permissions, not file permissions), but is known broken on
-        * some versions of FreeBSD.
-        */
-       fd = open("pretest2", O_RDWR | O_CREAT, 00000);
-       failure("Could not create test file?!");
-       if (!assert(fd >= 0))
-               return;
-
-       n = extattr_set_fd(fd, EXTATTR_NAMESPACE_USER, "testattr", "1234", 4);
-       if (n != 4) {
-               skipping("Restoring xattr to an unwritable file seems to be 
broken on this platform");
-               extattr_privilege_bug = 1;
-       }
-       close(fd);
-
        /* Create a write-to-disk object. */
        assert(NULL != (a = archive_write_disk_new()));
        archive_write_disk_set_options(a,
@@ -119,16 +100,12 @@ DEFINE_TEST(test_extattr_freebsd)
        archive_entry_free(ae);
 
        /* Close the archive. */
-       if (extattr_privilege_bug)
-               /* If the bug is here, write_close will return warning. */
-               assertEqualIntA(a, ARCHIVE_WARN, archive_write_close(a));
-       else
-               assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
-       assertEqualInt(ARCHIVE_OK, archive_write_free(a));
+       assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
 
        /* Verify the data on disk. */
        assertEqualInt(0, stat("test0", &st));
        assertEqualInt(st.st_mtime, 123456);
+       assertEqualInt(st.st_mode & 0777, 0755);
        /* Verify extattr */
        n = extattr_get_file("test0", EXTATTR_NAMESPACE_USER,
            "foo", buff, sizeof(buff));
@@ -140,17 +117,20 @@ DEFINE_TEST(test_extattr_freebsd)
        /* Verify the data on disk. */
        assertEqualInt(0, stat("test1", &st));
        assertEqualInt(st.st_mtime, 12345678);
+       assertEqualInt(st.st_mode & 0777, 0);
+       /*
+        * If we are not root, we have to make test1 user readable
+        * or extattr_get_file() will fail
+        */
+       if (geteuid() != 0) {
+               chmod("test1", S_IRUSR);
+       }
        /* Verify extattr */
        n = extattr_get_file("test1", EXTATTR_NAMESPACE_USER,
            "bar", buff, sizeof(buff));
-       if (extattr_privilege_bug) {
-               /* If we have the bug, the extattr won't have been written. */
-               assertEqualInt(n, -1);
-       } else {
-               if (assertEqualInt(n, 6)) {
-                       buff[n] = '\0';
-                       assertEqualString(buff, "123456");
-               }
+       if (assertEqualInt(n, 6)) {
+               buff[n] = '\0';
+               assertEqualString(buff, "123456");
        }
 
        /* Use libarchive APIs to read the file back into an entry and

Modified: vendor/libarchive/dist/libarchive/test/test_read_format_rar5.c
==============================================================================
--- vendor/libarchive/dist/libarchive/test/test_read_format_rar5.c      Mon Nov 
26 10:53:17 2018        (r340937)
+++ vendor/libarchive/dist/libarchive/test/test_read_format_rar5.c      Mon Nov 
26 11:01:51 2018        (r340938)
@@ -90,7 +90,7 @@ int verify_data(const uint8_t* data_ptr, int magic, in
 
 static
 int extract_one(struct archive* a, struct archive_entry* ae, uint32_t crc) {
-    la_ssize_t fsize, read;
+    la_ssize_t fsize, bytes_read;
     uint8_t* buf;
     int ret = 1;
     uint32_t computed_crc;
@@ -100,9 +100,9 @@ int extract_one(struct archive* a, struct archive_entr
     if(buf == NULL)
         return 1;
 
-    read = archive_read_data(a, buf, fsize);
-    if(read != fsize) {
-        assertEqualInt(read, fsize);
+    bytes_read = archive_read_data(a, buf, fsize);
+    if(bytes_read != fsize) {
+        assertEqualInt(bytes_read, fsize);
         goto fn_exit;
     }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to