diff options
author | Jeremy Allison <jra@samba.org> | 2000-02-15 19:36:47 +0000 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2000-02-15 19:36:47 +0000 |
commit | 3cf31a194f5721b67b1255e3f168d4bc87d433fc (patch) | |
tree | f9e3ef842e2bad4d7fb0142f685962e125176b23 /source3/lib/replace.c | |
parent | 8688933c7feb87179c178a30e4fc42970fe1da8f (diff) | |
download | samba-3cf31a194f5721b67b1255e3f168d4bc87d433fc.tar.gz samba-3cf31a194f5721b67b1255e3f168d4bc87d433fc.tar.bz2 samba-3cf31a194f5721b67b1255e3f168d4bc87d433fc.zip |
Added replacement functions sys_popen and sys_pclose. These are based
on the glibc source code and are safer than the traditional popen as
they don't use a shell to exec the requested command. Now we have
these functions they can be tightened up (environment etc.) as required
to make a safe popen. It should now be safe to add the environement
variable loading code to loadparm.c
Jeremy.
(This used to be commit b52e92b09d4ca3b66e534f520468dee27065d048)
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 */ |