1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-25 23:21:54 +03:00

Converted some more functions to create and dispose of a talloc context on a

per-call basis rather than per-connection.

Had a bit more of a reformatting fest.

Still need to run it through insure and handle downed connections.
(This used to be commit 46fe5a8fb9)
This commit is contained in:
Tim Potter 2001-10-19 01:46:43 +00:00
parent 6cc3953196
commit 52995a5f7d
5 changed files with 106 additions and 87 deletions

View File

@ -55,6 +55,7 @@ struct getent_state {
uint32 grp_query_start_ndx;
BOOL got_all_sam_entries, got_sam_entries;
struct winbindd_domain *domain;
TALLOC_CTX *mem_ctx;
};
/* Storage for cached getpwent() user entries */

View File

@ -52,9 +52,11 @@ static BOOL fill_grent_mem(struct winbindd_domain *domain,
int buf_len, buf_ndx, i;
char **names = NULL, *buf;
BOOL result = False;
if (!num_gr_mem || !gr_mem || !gr_mem_len) return False;
TALLOC_CTX *mem_ctx;
if (!(mem_ctx = talloc_init()))
return False;
/* Initialise group membership information */
DEBUG(10, ("fill_grent_mem(): group %s rid 0x%x\n",
@ -65,28 +67,27 @@ static BOOL fill_grent_mem(struct winbindd_domain *domain,
if (group_name_type != SID_NAME_DOM_GRP) {
DEBUG(1, ("fill_grent_mem(): rid %d in domain %s isn't a "
"domain group\n", group_rid, domain->name));
return False;
goto done;
}
/* Lookup group members */
if (!winbindd_lookup_groupmem(domain, group_rid, &num_names,
if (!winbindd_lookup_groupmem(domain, mem_ctx, group_rid, &num_names,
&rid_mem, &names, &name_types)) {
DEBUG(1, ("fill_grent_mem(): could not lookup membership "
"for group rid %d in domain %s\n",
group_rid, domain->name));
return False;
goto done;
}
DEBUG(10, ("fill_grent_mem(): looked up %d names\n", num_names));
if (DEBUGLEVEL >= 10) {
for (i = 0; i < num_names; i++) {
for (i = 0; i < num_names; i++)
DEBUG(10, ("\t%20s %x %d\n", names[i], rid_mem[i],
name_types[i]));
}
}
/* Add members to list */
@ -103,7 +104,8 @@ static BOOL fill_grent_mem(struct winbindd_domain *domain,
the_name = names[i];
DEBUG(10, ("fill_grent_mem(): processing name %s\n", the_name));
DEBUG(10, ("fill_grent_mem(): processing name %s\n",
the_name));
/* Only add domain users */
@ -151,7 +153,7 @@ static BOOL fill_grent_mem(struct winbindd_domain *domain,
if (!(buf = malloc(buf_len))) {
DEBUG(1, ("fill_grent_mem(): out of memory\n"));
result = False;
goto cleanup;
goto done;
}
memset(buf, 0, buf_len);
goto again;
@ -169,14 +171,8 @@ static BOOL fill_grent_mem(struct winbindd_domain *domain,
result = True;
cleanup:
/* Free memory allocated in winbindd_lookup_groupmem() */
SAFE_FREE(name_types);
SAFE_FREE(rid_mem);
free_char_array(num_names, names);
done:
talloc_destroy(mem_ctx);
DEBUG(10, ("fill_grent_mem(): returning %d\n", result));
@ -413,9 +409,11 @@ enum winbindd_result winbindd_setgrent(struct winbindd_cli_state *state)
ZERO_STRUCTP(domain_state);
domain_state->domain = tmp;
domain_state->mem_ctx = talloc_init();
/* Add to list of open domains */
domain_state->domain = tmp;
DLIST_ADD(state->getgrent_state, domain_state);
}
@ -475,7 +473,7 @@ static BOOL get_sam_group_entries(struct getent_state *ent)
break;
status = cli_samr_enum_dom_groups(
hnd->cli, hnd->cli->mem_ctx, &hnd->pol,
hnd->cli, ent->mem_ctx, &hnd->pol,
&ent->grp_query_start_ndx,
0x8000, /* buffer size? */
(struct acct_info **) &sam_grp_entries, &num_entries);
@ -764,6 +762,7 @@ enum winbindd_result winbindd_list_groups(struct winbindd_cli_state *state)
ZERO_STRUCT(groups);
groups.domain = domain;
groups.mem_ctx = talloc_init();
/*
* iterate through all groups
@ -798,7 +797,7 @@ enum winbindd_result winbindd_list_groups(struct winbindd_cli_state *state)
/* skip remainder of loop if we idn;t retrieve any groups */
if (num_domain_entries == 0)
continue;
goto next_group;
/* setup the groups struct to contain all the groups
retrieved for this domain */
@ -820,6 +819,7 @@ enum winbindd_result winbindd_list_groups(struct winbindd_cli_state *state)
DEBUG(0,("winbindd_list_groups: failed to enlarge "
"buffer!\n"));
SAFE_FREE(extra_data);
talloc_destroy(groups.mem_ctx);
return WINBINDD_ERROR;
} else
extra_data = ted;
@ -845,6 +845,9 @@ enum winbindd_result winbindd_list_groups(struct winbindd_cli_state *state)
extra_data[extra_data_len++] = ',';
}
next_group:
talloc_destroy(groups.mem_ctx);
}
/* Assign extra_data fields in response structure */

View File

@ -129,6 +129,7 @@ BOOL winbindd_lookup_usergroups(struct winbindd_domain *domain,
uint32 user_rid, uint32 *num_groups,
DOM_GID **user_groups);
BOOL winbindd_lookup_groupmem(struct winbindd_domain *domain,
TALLOC_CTX *mem_ctx,
uint32 group_rid, uint32 *num_names,
uint32 **rid_mem, char ***names,
uint32 **name_types);
@ -137,6 +138,7 @@ struct winbindd_domain *find_domain_from_sid(DOM_SID *sid);
void free_getent_state(struct getent_state *state);
BOOL winbindd_param_init(void);
NTSTATUS winbindd_query_dispinfo(struct winbindd_domain *domain,
TALLOC_CTX *mem_ctx,
uint32 *start_ndx, uint16 info_level,
uint32 *num_entries, SAM_DISPINFO_CTR *ctr);
BOOL check_domain_env(char *domain_env, char *domain);

View File

@ -33,9 +33,8 @@ static BOOL winbindd_fill_pwent(char *domain_name, char *name,
fstring name_domain, name_user;
pstring homedir;
if (!pw || !name) {
if (!pw || !name)
return False;
}
/* Resolve the uid number */
@ -112,9 +111,8 @@ enum winbindd_result winbindd_getpwnam_from_user(struct winbindd_cli_state
/* Reject names that don't have a domain - i.e name_domain contains
the entire name. */
if (strequal(name_domain, "")) {
if (strequal(name_domain, ""))
return WINBINDD_ERROR;
}
if ((domain = find_domain_from_name(name_domain)) == NULL) {
DEBUG(5, ("No such domain: %s\n", name_domain));
@ -124,9 +122,8 @@ enum winbindd_result winbindd_getpwnam_from_user(struct winbindd_cli_state
/* Check for cached user entry */
if (winbindd_fetch_user_cache_entry(domain, name_user,
&state->response.data.pw)) {
&state->response.data.pw))
return WINBINDD_OK;
}
slprintf(name, sizeof(name) - 1, "%s\\%s", name_domain, name_user);
@ -189,9 +186,8 @@ enum winbindd_result winbindd_getpwnam_from_uid(struct winbindd_cli_state
/* Bug out if the uid isn't in the winbind range */
if ((state->request.data.uid < server_state.uid_low ) ||
(state->request.data.uid > server_state.uid_high)) {
(state->request.data.uid > server_state.uid_high))
return WINBINDD_ERROR;
}
DEBUG(3, ("[%5d]: getpwuid %d\n", state->pid,
state->request.data.uid));
@ -209,9 +205,8 @@ enum winbindd_result winbindd_getpwnam_from_uid(struct winbindd_cli_state
if (winbindd_fetch_uid_cache_entry(domain,
state->request.data.uid,
&state->response.data.pw)) {
&state->response.data.pw))
return WINBINDD_OK;
}
/* Get name and name type from rid */
@ -223,13 +218,13 @@ enum winbindd_result winbindd_getpwnam_from_uid(struct winbindd_cli_state
sid_to_string(temp, &user_sid);
DEBUG(1, ("Could not lookup sid %s\n", temp));
return WINBINDD_ERROR;
}
if (strcmp("\\", lp_winbind_separator())) {
if (strcmp("\\", lp_winbind_separator()))
string_sub(user_name, "\\", lp_winbind_separator(),
sizeof(fstring));
}
/* Get some user info */
@ -253,9 +248,8 @@ enum winbindd_result winbindd_getpwnam_from_uid(struct winbindd_cli_state
/* Fill in password structure */
if (!winbindd_fill_pwent(domain->name, user_name, user_rid, group_rid,
gecos_name, &state->response.data.pw)) {
gecos_name, &state->response.data.pw))
return WINBINDD_ERROR;
}
winbindd_store_uid_cache_entry(domain, state->request.data.uid,
&state->response.data.pw);
@ -306,7 +300,9 @@ enum winbindd_result winbindd_setpwent(struct winbindd_cli_state *state)
return WINBINDD_ERROR;
ZERO_STRUCTP(domain_state);
domain_state->domain = tmp;
domain_state->mem_ctx = talloc_init();
/* Add to list of open domains */
@ -383,7 +379,7 @@ static BOOL get_sam_user_entries(struct getent_state *ent)
num_entries = 0;
status = winbindd_query_dispinfo(ent->domain,
status = winbindd_query_dispinfo(ent->domain, ent->mem_ctx,
&ent->dispinfo_ndx, 1,
&num_entries, &ctr);
@ -572,9 +568,14 @@ enum winbindd_result winbindd_list_users(struct winbindd_cli_state *state)
uint32 num_entries = 0, total_entries = 0;
char *ted, *extra_data = NULL;
int extra_data_len = 0;
TALLOC_CTX *mem_ctx;
enum winbindd_result rv = WINBINDD_ERROR;
DEBUG(3, ("[%5d]: list users\n", state->pid));
if (!(mem_ctx = talloc_init()))
return WINBINDD_ERROR;
/* Enumerate over trusted domains */
ctr.sam.info1 = &info1;
@ -587,22 +588,20 @@ enum winbindd_result winbindd_list_users(struct winbindd_cli_state *state)
variable */
if ((strcmp(state->request.domain, "") != 0) &&
!check_domain_env(state->request.domain, domain->name)) {
!check_domain_env(state->request.domain, domain->name))
continue;
}
/* Query display info */
do {
int i;
status = winbindd_query_dispinfo(domain, &start_ndx,
1, &num_entries,
&ctr);
status = winbindd_query_dispinfo(
domain, mem_ctx, &start_ndx,
1, &num_entries, &ctr);
if (num_entries == 0) {
if (num_entries == 0)
continue;
}
/* Allocate some memory for extra data */
@ -614,9 +613,9 @@ enum winbindd_result winbindd_list_users(struct winbindd_cli_state *state)
if (!ted) {
DEBUG(0,("winbindd_list_users: failed to enlarge buffer!\n"));
SAFE_FREE(extra_data);
return WINBINDD_ERROR;
}
else extra_data = ted;
goto done;
} else
extra_data = ted;
/* Pack user list into extra data fields */
@ -657,5 +656,10 @@ enum winbindd_result winbindd_list_users(struct winbindd_cli_state *state)
/* No domains responded but that's still OK so don't return an
error. */
return WINBINDD_OK;
rv = WINBINDD_OK;
done:
talloc_destroy(mem_ctx);
return rv;
}

View File

@ -72,12 +72,12 @@ BOOL get_domain_info(void)
int i;
fstring level5_dom;
BOOL rv = False;
TALLOC_CTX *mem_ctx = NULL;
TALLOC_CTX *mem_ctx;
DEBUG(1, ("getting trusted domain list\n"));
if (!(mem_ctx = talloc_init()))
goto done;
return False;
/* Add our workgroup - keep handle to look up trusted domains */
@ -113,8 +113,7 @@ BOOL get_domain_info(void)
rv = True;
done:
if (mem_ctx)
talloc_destroy(mem_ctx);
talloc_destroy(mem_ctx);
return rv;
}
@ -131,7 +130,7 @@ BOOL lookup_domain_sid(char *domain_name, struct winbindd_domain *domain)
CLI_POLICY_HND *hnd;
NTSTATUS result;
BOOL rv = False;
TALLOC_CTX *mem_ctx = NULL;
TALLOC_CTX *mem_ctx;
DEBUG(1, ("looking up sid for domain %s\n", domain_name));
@ -180,8 +179,7 @@ BOOL lookup_domain_sid(char *domain_name, struct winbindd_domain *domain)
rv = False; /* An error occured with a trusted domain */
done:
if (mem_ctx)
talloc_destroy(mem_ctx);
talloc_destroy(mem_ctx);
return rv;
}
@ -196,7 +194,7 @@ BOOL winbindd_lookup_sid_by_name(char *name, DOM_SID *sid,
uint32 *types = NULL;
CLI_POLICY_HND *hnd;
NTSTATUS result;
TALLOC_CTX *mem_ctx = NULL;
TALLOC_CTX *mem_ctx;
BOOL rv = False;
/* Don't bother with machine accounts */
@ -234,8 +232,7 @@ BOOL winbindd_lookup_sid_by_name(char *name, DOM_SID *sid,
rv = NT_STATUS_IS_OK(result);
done:
if (mem_ctx)
talloc_destroy(mem_ctx);
talloc_destroy(mem_ctx);
return rv;
}
@ -256,7 +253,7 @@ BOOL winbindd_lookup_name_by_sid(DOM_SID *sid, fstring name,
/* Lookup name */
if (!(mem_ctx = talloc_init()))
goto done;
return False;
if (!(hnd = cm_get_lsa_handle(lp_workgroup())))
goto done;
@ -283,8 +280,7 @@ BOOL winbindd_lookup_name_by_sid(DOM_SID *sid, fstring name,
rv = NT_STATUS_IS_OK(result);
done:
if (mem_ctx)
talloc_destroy(mem_ctx);
talloc_destroy(mem_ctx);
return rv;
}
@ -294,16 +290,23 @@ BOOL winbindd_lookup_name_by_sid(DOM_SID *sid, fstring name,
BOOL winbindd_lookup_userinfo(struct winbindd_domain *domain, uint32 user_rid,
SAM_USERINFO_CTR **user_info)
{
TALLOC_CTX *mem_ctx;
CLI_POLICY_HND *hnd;
uint16 info_level = 0x15;
NTSTATUS result;
NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
if (!(mem_ctx = talloc_init()))
return False;
if (!(hnd = cm_get_sam_user_handle(domain->name, &domain->sid,
user_rid)))
return False;
goto done;
result = cli_samr_query_userinfo(hnd->cli, hnd->cli->mem_ctx,
&hnd->pol, info_level, user_info);
result = cli_samr_query_userinfo(hnd->cli, mem_ctx, &hnd->pol,
info_level, user_info);
done:
talloc_destroy(mem_ctx);
return NT_STATUS_IS_OK(result);
}
@ -314,16 +317,22 @@ BOOL winbindd_lookup_usergroups(struct winbindd_domain *domain,
uint32 user_rid, uint32 *num_groups,
DOM_GID **user_groups)
{
TALLOC_CTX *mem_ctx;
CLI_POLICY_HND *hnd;
NTSTATUS result;
NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
if (!(mem_ctx = talloc_init()))
return False;
if (!(hnd = cm_get_sam_user_handle(domain->name, &domain->sid,
user_rid)))
return False;
goto done;
result = cli_samr_query_usergroups(hnd->cli, hnd->cli->mem_ctx,
&hnd->pol, num_groups,
user_groups);
result = cli_samr_query_usergroups(hnd->cli, mem_ctx, &hnd->pol,
num_groups, user_groups);
done:
talloc_destroy(mem_ctx);
return NT_STATUS_IS_OK(result);
}
@ -331,40 +340,39 @@ BOOL winbindd_lookup_usergroups(struct winbindd_domain *domain,
/* Lookup group membership given a rid. */
BOOL winbindd_lookup_groupmem(struct winbindd_domain *domain,
TALLOC_CTX *mem_ctx,
uint32 group_rid, uint32 *num_names,
uint32 **rid_mem, char ***names,
uint32 **name_types)
{
CLI_POLICY_HND *group_hnd, *dom_hnd;
NTSTATUS result;
NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
uint32 i, total_names = 0;
if (!(group_hnd = cm_get_sam_group_handle(domain->name, &domain->sid,
group_rid)))
return False;
goto done;
/* Get group membership. This is a list of rids. */
result = cli_samr_query_groupmem(group_hnd->cli,
group_hnd->cli->mem_ctx,
result = cli_samr_query_groupmem(group_hnd->cli, mem_ctx,
&group_hnd->pol, num_names, rid_mem,
name_types);
if (!NT_STATUS_IS_OK(result))
return NT_STATUS_IS_OK(result);
goto done;
/* Convert list of rids into list of names. Do this in bunches of
~1000 to avoid crashing NT4. It looks like there is a buffer
overflow or something like that lurking around somewhere. */
if (!(dom_hnd = cm_get_sam_dom_handle(domain->name, &domain->sid)))
return False;
goto done;
#define MAX_LOOKUP_RIDS 900
*names = talloc(dom_hnd->cli->mem_ctx, *num_names * sizeof(char *));
*name_types = talloc(dom_hnd->cli->mem_ctx, *num_names *
sizeof(uint32));
*names = talloc(mem_ctx, *num_names * sizeof(char *));
*name_types = talloc(mem_ctx, *num_names * sizeof(uint32));
for (i = 0; i < *num_names; i += MAX_LOOKUP_RIDS) {
int num_lookup_rids = MIN(*num_names - i, MAX_LOOKUP_RIDS);
@ -374,8 +382,7 @@ BOOL winbindd_lookup_groupmem(struct winbindd_domain *domain,
/* Lookup a chunk of rids */
result = cli_samr_lookup_rids(dom_hnd->cli,
dom_hnd->cli->mem_ctx,
result = cli_samr_lookup_rids(dom_hnd->cli, mem_ctx,
&dom_hnd->pol, 1000, /* flags */
num_lookup_rids,
&(*rid_mem)[i],
@ -383,7 +390,7 @@ BOOL winbindd_lookup_groupmem(struct winbindd_domain *domain,
&tmp_names, &tmp_types);
if (!NT_STATUS_IS_OK(result))
return False;
goto done;
/* Copy result into array. The talloc system will take
care of freeing the temporary arrays later on. */
@ -399,6 +406,7 @@ BOOL winbindd_lookup_groupmem(struct winbindd_domain *domain,
*num_names = total_names;
done:
return NT_STATUS_IS_OK(result);
}
@ -462,6 +470,8 @@ void free_getent_state(struct getent_state *state)
DLIST_REMOVE(state, state);
next = temp->next;
talloc_destroy(temp->mem_ctx);
SAFE_FREE(temp);
temp = next;
}
@ -531,6 +541,7 @@ BOOL winbindd_param_init(void)
application. */
NTSTATUS winbindd_query_dispinfo(struct winbindd_domain *domain,
TALLOC_CTX *mem_ctx,
uint32 *start_ndx, uint16 info_level,
uint32 *num_entries, SAM_DISPINFO_CTR *ctr)
{
@ -538,16 +549,14 @@ NTSTATUS winbindd_query_dispinfo(struct winbindd_domain *domain,
NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
if (!(hnd = cm_get_sam_dom_handle(domain->name, &domain->sid)))
return result;
goto done;
result = cli_samr_query_dispinfo(hnd->cli, hnd->cli->mem_ctx,
result = cli_samr_query_dispinfo(hnd->cli, mem_ctx,
&hnd->pol, start_ndx, info_level,
num_entries, 0xffff, ctr);
if (!NT_STATUS_IS_OK(result))
return result;
return NT_STATUS_OK;
done:
return result;
}
/* Check if a domain is present in a comma-separated list of domains */