diff options
Diffstat (limited to 'source3/lib/replace.c')
-rw-r--r-- | source3/lib/replace.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/source3/lib/replace.c b/source3/lib/replace.c index 6a492f977c..8d91c2d785 100644 --- a/source3/lib/replace.c +++ b/source3/lib/replace.c @@ -163,15 +163,21 @@ Corrections by richard.kettlewell@kewill.com /* yikes! no SETGROUPS or INITGROUPS? how can this work? */ return(0); #else /* HAVE_SETGROUPS */ - gid_t grouplst[NGROUPS_MAX]; + gid_t *grouplst = NULL; + int max_gr = groups_max(); + int ret; int i,j; struct group *g; char *gr; + if((grouplst = (gid_t *)malloc(sizeof(gid_t) * max_gr)) == NULL) { + DEBUG(0,("initgroups: malloc fail !\n"); + return -1; + } + grouplst[0] = id; i = 1; - while (i < NGROUPS_MAX && - ((g = (struct group *)getgrent()) != (struct group *)NULL)) { + while (i < max_gr && ((g = (struct group *)getgrent()) != (struct group *)NULL)) { if (g->gr_gid == id) continue; j = 0; @@ -187,7 +193,9 @@ Corrections by richard.kettlewell@kewill.com } } endgrent(); - return(sys_setgroups(i,grouplst)); + ret = sys_setgroups(i,grouplst); + free((char *)grouplst); + return ret; #endif /* HAVE_SETGROUPS */ } #endif /* HAVE_INITGROUPS */ |