]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
fix use of acl_get_flagset_np() on FreeBSD 755/head
authorMartin Matuska <martin@matuska.org>
Thu, 4 Aug 2016 13:36:03 +0000 (15:36 +0200)
committerMartin Matuska <martin@matuska.org>
Thu, 4 Aug 2016 13:36:03 +0000 (15:36 +0200)
libarchive/archive_read_disk_entry_from_file.c
libarchive/archive_write_disk_acl.c

index 74fe353d9d347bb68a6334ec10632cbb42892480..18963ce11bf54459fa43f9b60c92d16b374a7840 100644 (file)
@@ -642,13 +642,16 @@ translate_acl(struct archive_read_disk *a,
                 * Libarchive stores "flag" (NFSv4 inheritance bits)
                 * in the ae_perm bitmap.
                 */
-               acl_get_flagset_np(acl_entry, &acl_flagset);
-                for (i = 0; i < (int)(sizeof(acl_inherit_map) / sizeof(acl_inherit_map[0])); ++i) {
-                       if (acl_get_flag_np(acl_flagset,
-                                           acl_inherit_map[i].platform_inherit))
-                               ae_perm |= acl_inherit_map[i].archive_inherit;
-
-                }
+               // XXX acl_get_flagset_np on FreeBSD returns EINVAL for
+               // non-NFSv4 ACLs
+               r = acl_get_flagset_np(acl_entry, &acl_flagset);
+               if (r == 0) {
+                       for (i = 0; i < (int)(sizeof(acl_inherit_map) / sizeof(acl_inherit_map[0])); ++i) {
+                               if (acl_get_flag_np(acl_flagset,
+                                                   acl_inherit_map[i].platform_inherit))
+                                       ae_perm |= acl_inherit_map[i].archive_inherit;
+                       }
+               }
 #endif
 
                acl_get_permset(acl_entry, &acl_permset);
index 5cbba54f08fdf2fa68d3c45a429171bd82fbe181..54a96696f285e53d4bbcff2f6b21151ded1aa6ba 100644 (file)
@@ -145,7 +145,7 @@ set_acl(struct archive *a, int fd, const char *name,
        gid_t            ae_gid;
        const char      *ae_name;
        int              entries;
-       int              i;
+       int              i, r;
 
        ret = ARCHIVE_OK;
        entries = archive_acl_reset(abstract_acl, ae_requested_type);
@@ -223,12 +223,16 @@ set_acl(struct archive *a, int fd, const char *name,
                }
 
 #ifdef ACL_TYPE_NFS4
-               acl_get_flagset_np(acl_entry, &acl_flagset);
-               acl_clear_flags_np(acl_flagset);
-               for (i = 0; i < (int)(sizeof(acl_inherit_map) / sizeof(acl_inherit_map[0])); ++i) {
-                       if (ae_permset & acl_inherit_map[i].archive_inherit)
-                               acl_add_flag_np(acl_flagset,
-                                               acl_inherit_map[i].platform_inherit);
+               // XXX acl_get_flagset_np on FreeBSD returns EINVAL for
+               // non-NFSv4 ACLs
+               r = acl_get_flagset_np(acl_entry, &acl_flagset);
+               if (r == 0) {
+                       acl_clear_flags_np(acl_flagset);
+                       for (i = 0; i < (int)(sizeof(acl_inherit_map) / sizeof(acl_inherit_map[0])); ++i) {
+                               if (ae_permset & acl_inherit_map[i].archive_inherit)
+                                       acl_add_flag_np(acl_flagset,
+                                                       acl_inherit_map[i].platform_inherit);
+                       }
                }
 #endif
        }