diff options
author | Tim Kientzle <kientzle@acm.org> | 2016-08-13 09:38:16 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-08-13 09:38:16 -0700 |
commit | 6a0d970f70102fe50ee9f1e51a2e4c048985e616 (patch) | |
tree | b38f0e0163d0aa4227068ba5cc5507dcca7291e9 /libarchive | |
parent | dc1882e4ab48c3b1c11a596e9f577c43a5592dfb (diff) | |
parent | 8f5639566efbfed4de50c027b4030e012bf69b15 (diff) | |
download | libarchive-6a0d970f70102fe50ee9f1e51a2e4c048985e616.tar.gz |
Merge pull request #755 from mmatuska/fix_acl_get_flagset_np
fix use of acl_get_flagset_np() on FreeBSD
Diffstat (limited to 'libarchive')
-rw-r--r-- | libarchive/archive_read_disk_entry_from_file.c | 17 | ||||
-rw-r--r-- | libarchive/archive_write_disk_acl.c | 18 |
2 files changed, 21 insertions, 14 deletions
diff --git a/libarchive/archive_read_disk_entry_from_file.c b/libarchive/archive_read_disk_entry_from_file.c index 74fe353d..18963ce1 100644 --- a/libarchive/archive_read_disk_entry_from_file.c +++ b/libarchive/archive_read_disk_entry_from_file.c @@ -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); diff --git a/libarchive/archive_write_disk_acl.c b/libarchive/archive_write_disk_acl.c index 5cbba54f..54a96696 100644 --- a/libarchive/archive_write_disk_acl.c +++ b/libarchive/archive_write_disk_acl.c @@ -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 } |