int sys_acl_clear_perms(SMB_ACL_PERMSET_T permset_d);
int sys_acl_add_perm(SMB_ACL_PERMSET_T permset_d, SMB_ACL_PERM_T perm);
int sys_acl_get_perm(SMB_ACL_PERMSET_T permset_d, SMB_ACL_PERM_T perm);
-char *sys_acl_to_text(const struct smb_acl_t *acl_d, ssize_t *len_p);
+char *sys_acl_to_text(TALLOC_CTX *mem_ctx, const struct smb_acl_t *acl_d);
SMB_ACL_T sys_acl_init(TALLOC_CTX *mem_ctx);
int sys_acl_create_entry(SMB_ACL_T *acl_p, SMB_ACL_ENTRY_T *entry_p);
int sys_acl_set_tag_type(SMB_ACL_ENTRY_T entry_d, SMB_ACL_TAG_T tag_type);
return *permset_d & perm;
}
-char *sys_acl_to_text(const struct smb_acl_t *acl_d, ssize_t *len_p)
+char *sys_acl_to_text(TALLOC_CTX *mem_ctx, const struct smb_acl_t *acl_d)
{
- int i;
- int len, maxlen;
- char *text;
-
- /*
- * use an initial estimate of 20 bytes per ACL entry
- * when allocating memory for the text representation
- * of the ACL
- */
- len = 0;
- maxlen = 20 * acl_d->count;
- if ((text = (char *)SMB_MALLOC(maxlen)) == NULL) {
- errno = ENOMEM;
- return NULL;
- }
+ int32_t i;
+ char *text = NULL;
+
+ text = talloc_strdup(mem_ctx, "");
for (i = 0; i < acl_d->count; i++) {
struct smb_acl_entry *ap = &acl_d->acl[i];
const char *tag;
const char *id = "";
char perms[4];
- int nbytes;
switch (ap->a_type) {
/*
perms[2] = (ap->a_perm & SMB_ACL_EXECUTE) ? 'x' : '-';
perms[3] = '\0';
- /* <tag> : <qualifier> : rwx \n \0 */
- nbytes = strlen(tag) + 1 + strlen(id) + 1 + 3 + 1 + 1;
-
- /*
- * If this entry would overflow the buffer
- * allocate enough additional memory for this
- * entry and an estimate of another 20 bytes
- * for each entry still to be processed
- */
- if ((len + nbytes) > maxlen) {
- maxlen += nbytes + 20 * (acl_d->count - i);
- if ((text = (char *)SMB_REALLOC(text, maxlen)) == NULL) {
- errno = ENOMEM;
- return NULL;
- }
- }
-
-
- slprintf(&text[len], nbytes, "%s:%s:%s\n", tag, id, perms);
- len += (nbytes - 1);
+ talloc_asprintf_addbuf(&text, "%s:%s:%s\n", tag, id, perms);
}
- if (len_p)
- *len_p = len;
-
return text;
}
}
if (acl_valid(result) != 0) {
- char *acl_string = sys_acl_to_text(acl, NULL);
- DEBUG(0, ("smb_acl_to_posix: ACL %s is invalid for set (%s)\n",
- acl_string, strerror(errno)));
- SAFE_FREE(acl_string);
+ char *acl_string = sys_acl_to_text(talloc_tos(), acl);
+ DBG_WARNING("ACL %s is invalid for set (%s)\n",
+ acl_string,
+ strerror(errno));
+ TALLOC_FREE(acl_string);
goto fail;
}
printf("sys_acl_get_fd failed (%s)\n", strerror(errno));
return NT_STATUS_UNSUCCESSFUL;
}
- acl_text = sys_acl_to_text(acl, NULL);
+ acl_text = sys_acl_to_text(acl, acl);
printf("%s", acl_text);
TALLOC_FREE(acl);
- SAFE_FREE(acl_text);
return NT_STATUS_OK;
}
TALLOC_FREE(pathref_fname);
return NT_STATUS_UNSUCCESSFUL;
}
- acl_text = sys_acl_to_text(acl, NULL);
+ acl_text = sys_acl_to_text(acl, acl);
printf("%s", acl_text);
TALLOC_FREE(acl);
TALLOC_FREE(smb_fname);
TALLOC_FREE(pathref_fname);
- SAFE_FREE(acl_text);
return NT_STATUS_OK;
}