diff options
author | trasz <trasz@FreeBSD.org> | 2009-12-26 10:06:45 +0000 |
---|---|---|
committer | trasz <trasz@FreeBSD.org> | 2009-12-26 10:06:45 +0000 |
commit | 0d8feb4153ecf50f763a2d1ce9074675cf68aae1 (patch) | |
tree | 69da4084dd7940b1bc884ce84515d2b52bc68da0 /bin/setfacl | |
parent | e11fe899ea4c6f36c564e59d30a2d022dfb7f33c (diff) | |
download | FreeBSD-src-0d8feb4153ecf50f763a2d1ce9074675cf68aae1.zip FreeBSD-src-0d8feb4153ecf50f763a2d1ce9074675cf68aae1.tar.gz |
Improve ACL branding mismatch detection and reporting in some rare cases,
such as "setfacl -m ''".
Diffstat (limited to 'bin/setfacl')
-rw-r--r-- | bin/setfacl/merge.c | 10 | ||||
-rw-r--r-- | bin/setfacl/remove.c | 5 | ||||
-rw-r--r-- | bin/setfacl/setfacl.h | 2 | ||||
-rw-r--r-- | bin/setfacl/util.c | 23 |
4 files changed, 32 insertions, 8 deletions
diff --git a/bin/setfacl/merge.c b/bin/setfacl/merge.c index 495e66c..0a42eec 100644 --- a/bin/setfacl/merge.c +++ b/bin/setfacl/merge.c @@ -100,11 +100,10 @@ merge_acl(acl_t acl, acl_t *prev_acl, const char *filename) acl_get_brand_np(acl, &acl_brand); acl_get_brand_np(*prev_acl, &prev_acl_brand); - if (acl_brand != prev_acl_brand) { + if (branding_mismatch(acl_brand, prev_acl_brand)) { warnx("%s: branding mismatch; existing ACL is %s, " "entry to be merged is %s", filename, - prev_acl_brand == ACL_BRAND_NFS4 ? "NFSv4" : "POSIX.1e", - acl_brand == ACL_BRAND_NFS4 ? "NFSv4" : "POSIX.1e"); + brand_name(prev_acl_brand), brand_name(acl_brand)); return (-1); } @@ -252,9 +251,10 @@ add_acl(acl_t acl, uint entry_number, acl_t *prev_acl, const char *filename) return (-1); } - if (acl_brand != ACL_BRAND_NFS4) { + if (branding_mismatch(acl_brand, ACL_BRAND_NFS4)) { warnx("%s: branding mismatch; existing ACL is NFSv4, " - "entry to be added is POSIX.1e", filename); + "entry to be added is %s", filename, + brand_name(acl_brand)); return (-1); } diff --git a/bin/setfacl/remove.c b/bin/setfacl/remove.c index 6cd82b3..e6feef9 100644 --- a/bin/setfacl/remove.c +++ b/bin/setfacl/remove.c @@ -53,11 +53,10 @@ remove_acl(acl_t acl, acl_t *prev_acl, const char *filename) acl_get_brand_np(acl, &acl_brand); acl_get_brand_np(*prev_acl, &prev_acl_brand); - if (acl_brand != prev_acl_brand) { + if (branding_mismatch(acl_brand, prev_acl_brand)) { warnx("%s: branding mismatch; existing ACL is %s, " "entry to be removed is %s", filename, - prev_acl_brand == ACL_BRAND_NFS4 ? "NFSv4" : "POSIX.1e", - acl_brand == ACL_BRAND_NFS4 ? "NFSv4" : "POSIX.1e"); + brand_name(prev_acl_brand), brand_name(acl_brand)); return (-1); } diff --git a/bin/setfacl/setfacl.h b/bin/setfacl/setfacl.h index 7c11b3a..290ac5b 100644 --- a/bin/setfacl/setfacl.h +++ b/bin/setfacl/setfacl.h @@ -71,6 +71,8 @@ void remove_ext(acl_t *prev_acl, const char *filename); int set_acl_mask(acl_t *prev_acl, const char *filename); /* util.c */ void *zmalloc(size_t size); +const char *brand_name(int brand); +int branding_mismatch(int brand1, int brand2); uint have_mask; uint need_mask; diff --git a/bin/setfacl/util.c b/bin/setfacl/util.c index 46b9abb..3c42979 100644 --- a/bin/setfacl/util.c +++ b/bin/setfacl/util.c @@ -43,3 +43,26 @@ zmalloc(size_t size) err(1, "calloc() failed"); return (ptr); } + +const char * +brand_name(int brand) +{ + switch (brand) { + case ACL_BRAND_NFS4: + return "NFSv4"; + case ACL_BRAND_POSIX: + return "POSIX.1e"; + default: + return "unknown"; + } +} + +int +branding_mismatch(int brand1, int brand2) +{ + if (brand1 == ACL_BRAND_UNKNOWN || brand2 == ACL_BRAND_UNKNOWN) + return (0); + if (brand1 != brand2) + return (1); + return (1); +} |