diff options
-rw-r--r-- | source3/nsswitch/winbindd_group.c | 69 |
1 files changed, 9 insertions, 60 deletions
diff --git a/source3/nsswitch/winbindd_group.c b/source3/nsswitch/winbindd_group.c index 2e932b1a55..6e22a8b559 100644 --- a/source3/nsswitch/winbindd_group.c +++ b/source3/nsswitch/winbindd_group.c @@ -671,87 +671,46 @@ enum winbindd_result winbindd_getgrent(struct winbindd_cli_state *state) enum winbindd_result winbindd_list_groups(struct winbindd_cli_state *state) { uint32 total_entries = 0; - uint32 num_domain_entries; struct winbindd_domain *domain; - struct getent_state groups; char *extra_data = NULL; char *ted = NULL; int extra_data_len = 0, i; - void *sam_entries = NULL; DEBUG(3, ("[%5d]: list groups\n", state->pid)); /* Enumerate over trusted domains */ - ZERO_STRUCT(groups); - if (domain_list == NULL) get_domain_info(); for (domain = domain_list; domain; domain = domain->next) { - int new_size; - int offset; + struct getent_state groups; + + ZERO_STRUCT(groups); /* Skip domains other than WINBINDD_DOMAIN environment variable */ - if ((strcmp(state->request.domain, "") != 0) && !check_domain_env(state->request.domain, domain->name)) continue; /* Get list of sam groups */ - ZERO_STRUCT(groups); groups.domain = domain; - /* - * iterate through all groups - * total_entries: maintains a total count over **all domains** - * num_domain_entries: is the running count for this domain - */ - - num_domain_entries = 0; - get_sam_group_entries(&groups); - offset = sizeof(struct acct_info) * num_domain_entries; - new_size = sizeof(struct acct_info) - * (groups.num_sam_entries + num_domain_entries); - sam_entries = Realloc(sam_entries, new_size); - - if (!sam_entries) - return WINBINDD_ERROR; - - num_domain_entries += groups.num_sam_entries; - memcpy (((char *)sam_entries)+offset, - groups.sam_entries, - sizeof(struct acct_info) * - groups.num_sam_entries); - - free(groups.sam_entries); - - groups.sam_entries = NULL; - groups.num_sam_entries = 0; - - /* skip remainder of loop if we idn;t retrieve any groups */ - - if (num_domain_entries == 0) + if (groups.num_sam_entries == 0) { + /* this domain is empty or in an error state */ continue; - - /* setup the groups struct to contain all the groups - retrieved for this domain */ - - groups.num_sam_entries = num_domain_entries; - groups.sam_entries = sam_entries; + } /* keep track the of the total number of groups seen so far over all domains */ - total_entries += groups.num_sam_entries; /* Allocate some memory for extra data. Note that we limit - account names to sizeof(fstring) = 128 characters. */ - + account names to sizeof(fstring) = 128 characters. */ ted = Realloc(extra_data, sizeof(fstring) * total_entries); if (!ted) { @@ -763,35 +722,25 @@ enum winbindd_result winbindd_list_groups(struct winbindd_cli_state *state) extra_data = ted; /* Pack group list into extra data fields */ - for (i = 0; i < groups.num_sam_entries; i++) { char *group_name = ((struct acct_info *) groups.sam_entries)[i].acct_name; fstring name; - /* Convert unistring to ascii */ - snprintf(name, sizeof(name), "%s%s%s", domain->name, lp_winbind_separator(), group_name); - /* Append to extra data */ - + /* Append to extra data */ memcpy(&extra_data[extra_data_len], name, strlen(name)); - extra_data_len += strlen(name); - extra_data[extra_data_len++] = ','; } - } - /* Free group data */ - - if (groups.sam_entries) free(groups.sam_entries); + } /* Assign extra_data fields in response structure */ - if (extra_data) { extra_data[extra_data_len - 1] = '\0'; state->response.extra_data = extra_data; |