TALLOC_CTX *get_talloc_ctx(void) { TALLOC_CTX *tc = get_current_rpc_talloc(); if (tc) return tc; return main_loop_talloc_get(); }
static size_t afs_to_nt_acl(struct afs_acl *afs_acl, struct files_struct *fsp, uint32 security_info, struct security_descriptor **ppdesc) { SEC_ACE *nt_ace_list; DOM_SID owner_sid, group_sid; SEC_ACCESS mask; SMB_STRUCT_STAT sbuf; SEC_ACL *psa = NULL; int good_aces; size_t sd_size; TALLOC_CTX *mem_ctx = main_loop_talloc_get(); struct afs_ace *afs_ace; if (fsp->is_directory || fsp->fh->fd == -1) { /* Get the stat struct for the owner info. */ if(SMB_VFS_STAT(fsp->conn,fsp->fsp_name, &sbuf) != 0) { return 0; } } else { if(SMB_VFS_FSTAT(fsp,fsp->fh->fd,&sbuf) != 0) { return 0; } } uid_to_sid(&owner_sid, sbuf.st_uid); gid_to_sid(&group_sid, sbuf.st_gid); if (afs_acl->num_aces) { nt_ace_list = TALLOC_ARRAY(mem_ctx, SEC_ACE, afs_acl->num_aces); if (nt_ace_list == NULL) return 0; } else { nt_ace_list = NULL; } afs_ace = afs_acl->acelist; good_aces = 0; while (afs_ace != NULL) { uint32 nt_rights; uint8 flag = SEC_ACE_FLAG_OBJECT_INHERIT | SEC_ACE_FLAG_CONTAINER_INHERIT; if (afs_ace->type == SID_NAME_UNKNOWN) { DEBUG(10, ("Ignoring unknown name %s\n", afs_ace->name)); afs_ace = afs_ace->next; continue; } if (fsp->is_directory) afs_to_nt_dir_rights(afs_ace->rights, &nt_rights, &flag); else nt_rights = afs_to_nt_file_rights(afs_ace->rights); init_sec_access(&mask, nt_rights); init_sec_ace(&nt_ace_list[good_aces++], &(afs_ace->sid), SEC_ACE_TYPE_ACCESS_ALLOWED, mask, flag); afs_ace = afs_ace->next; } psa = make_sec_acl(mem_ctx, NT4_ACL_REVISION, good_aces, nt_ace_list); if (psa == NULL) return 0; *ppdesc = make_sec_desc(mem_ctx, SEC_DESC_REVISION, SEC_DESC_SELF_RELATIVE, (security_info & OWNER_SECURITY_INFORMATION) ? &owner_sid : NULL, (security_info & GROUP_SECURITY_INFORMATION) ? &group_sid : NULL, NULL, psa, &sd_size); return sd_size; }