1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-11-28 08:02:54 +00:00

Improve ACL branding mismatch detection and reporting in some rare cases,

such as "setfacl -m ''".
This commit is contained in:
Edward Tomasz Napierala 2009-12-26 10:06:45 +00:00
parent 48660452c1
commit c93b62deca
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=201016
4 changed files with 32 additions and 8 deletions

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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;

View File

@ -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);
}