acl_create_entry: Don't invalidate existing entry_d and permset_d.

* sec_posixacl .cc (__acl_dup): Remove.
	(acl_dup): Fold __acl_dup functionality into this function.
	(acl_create_entry): Don't create new acl_t.  Just realloc
	acl->entry to make room for new aclent_t.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2016-01-06 23:00:51 +01:00
parent 3d88f10983
commit e4ecb5b96a
1 changed files with 11 additions and 16 deletions

View File

@ -48,22 +48,21 @@ acl_init (int count)
return acl; return acl;
} }
static acl_t extern "C" acl_t
__acl_dup (acl_t acl, int max) acl_dup (acl_t acl)
{ {
__try __try
{ {
acl_t new_acl = acl_init (max); acl_t new_acl = acl_init (acl->max_count);
if (new_acl) if (new_acl)
{ {
int new_idx = 0; uint16_t new_idx = 0;
for (uint16_t idx = 0; idx < acl->count; ++idx) for (uint16_t idx = 0; idx < acl->count; ++idx)
if (acl->entry[idx].a_type != ACL_DELETED_TAG) if (acl->entry[idx].a_type != ACL_DELETED_TAG)
new_acl->entry[new_idx++] = acl->entry[idx]; new_acl->entry[new_idx++] = acl->entry[idx];
new_acl->magic = ACL_MAGIC; new_acl->magic = ACL_MAGIC;
new_acl->count = new_idx; new_acl->count = new_idx;
new_acl->max_count = max;
return new_acl; return new_acl;
} }
} }
@ -72,12 +71,6 @@ __acl_dup (acl_t acl, int max)
return NULL; return NULL;
} }
extern "C" acl_t
acl_dup (acl_t acl)
{
return __acl_dup (acl, acl->max_count);
}
extern "C" int extern "C" int
acl_free (void *obj_p) acl_free (void *obj_p)
{ {
@ -159,12 +152,14 @@ acl_create_entry (acl_t *acl_p, acl_entry_t *entry_p)
} }
if (acl->count >= acl->max_count) if (acl->count >= acl->max_count)
{ {
acl_t new_acl = __acl_dup (acl, acl->count + 1); aclent_t *new_e;
if (!new_acl)
new_e = (aclent_t *) realloc (acl->entry,
_ENTRY_SIZE (acl->max_count + 1));
if (!new_e)
__leave; __leave;
*acl_p = new_acl; acl->entry = new_e;
acl_free (acl); ++acl->max_count;
acl = *acl_p;
} }
idx = acl->count++; idx = acl->count++;
*entry_p = __to_entry (acl, idx); *entry_p = __to_entry (acl, idx);