summaryrefslogtreecommitdiffstats
path: root/source/nsswitch/winbindd_group.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/nsswitch/winbindd_group.c')
-rw-r--r--source/nsswitch/winbindd_group.c30
1 files changed, 22 insertions, 8 deletions
diff --git a/source/nsswitch/winbindd_group.c b/source/nsswitch/winbindd_group.c
index ed4db07dda4..c6a54eb67c9 100644
--- a/source/nsswitch/winbindd_group.c
+++ b/source/nsswitch/winbindd_group.c
@@ -513,12 +513,21 @@ static BOOL get_sam_group_entries(struct getent_state *ent)
/* Copy entries into return buffer */
if (num_entries) {
+ struct acct_info *tnl;
- name_list = Realloc(name_list,
+ tnl = (struct acct_info *)Realloc(name_list,
sizeof(struct acct_info) *
(ent->num_sam_entries +
num_entries));
+ if (!tnl) {
+ DEBUG(0,("get_sam_group_entries: Realloc fail.\n"));
+ if (name_list)
+ free(name_list);
+ return False;
+ } else
+ name_list = tnl;
+
memcpy(&name_list[ent->num_sam_entries],
sam_grp_entries,
num_entries * sizeof(struct acct_info));
@@ -761,10 +770,10 @@ 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;
- struct winbindd_domain *domain;
+ uint32 total_entries = 0;
+ struct winbindd_domain *domain;
struct getent_state groups;
- char *extra_data = NULL;
+ char *ted, *extra_data = NULL;
int extra_data_len = 0, i;
DEBUG(3, ("[%5d]: list groups\n", state->pid));
@@ -794,12 +803,17 @@ enum winbindd_result winbindd_list_groups(struct winbindd_cli_state *state)
account names to sizeof(fstring) = 128 characters. */
total_entries += groups.num_sam_entries;
- extra_data = Realloc(extra_data,
- sizeof(fstring) * total_entries);
- if (!extra_data) {
+ ted = Realloc(extra_data,
+ sizeof(fstring) * total_entries);
+
+ if (!ted) {
+ DEBUG(0,("winbindd_list_groups: failed to enlarge buffer!\n"));
+ if (extra_data)
+ free(extra_data);
return WINBINDD_ERROR;
- }
+ } else
+ extra_data = ted;
/* Pack group list into extra data fields */