summaryrefslogtreecommitdiff
path: root/libarchive
diff options
context:
space:
mode:
authorTim Kientzle <kientzle@acm.org>2016-08-13 09:38:16 -0700
committerGitHub <noreply@github.com>2016-08-13 09:38:16 -0700
commit6a0d970f70102fe50ee9f1e51a2e4c048985e616 (patch)
treeb38f0e0163d0aa4227068ba5cc5507dcca7291e9 /libarchive
parentdc1882e4ab48c3b1c11a596e9f577c43a5592dfb (diff)
parent8f5639566efbfed4de50c027b4030e012bf69b15 (diff)
downloadlibarchive-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.c17
-rw-r--r--libarchive/archive_write_disk_acl.c18
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
}