Clean up get_groups: don't ever allocate dynamically, and remove
potential trouble spot where it used to call itself recursively without looking at the return value.
This commit is contained in:
parent
33c1b8fb0e
commit
6dcdd107e0
|
@ -804,33 +804,20 @@ s48_value scsh_setegid(s48_value gid)
|
||||||
s48_value get_groups()
|
s48_value get_groups()
|
||||||
{
|
{
|
||||||
int retval;
|
int retval;
|
||||||
int veclen = getgroups(0,NULL);
|
gid_t gvec[NGROUPS_MAX + 1];
|
||||||
|
int veclen = getgroups(NGROUPS_MAX + 1, gvec);
|
||||||
int i = veclen;
|
int i = veclen;
|
||||||
s48_value l = S48_NULL;
|
s48_value l = S48_NULL;
|
||||||
gid_t gvec0[20], *gp = gvec0;
|
|
||||||
|
|
||||||
if( veclen > 20 )
|
if (veclen == -1)
|
||||||
if (NULL == (gp=Malloc(gid_t,veclen))) s48_raise_os_error(errno);
|
|
||||||
|
|
||||||
retval = getgroups(veclen, gp);
|
|
||||||
|
|
||||||
if (retval == -1){
|
|
||||||
if (veclen > 20) Free(gp);
|
|
||||||
s48_raise_os_error(errno);
|
s48_raise_os_error(errno);
|
||||||
}
|
else {
|
||||||
else if (retval != veclen){ /* paranoia... */
|
|
||||||
get_groups();
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
S48_DECLARE_GC_PROTECT(1);
|
S48_DECLARE_GC_PROTECT(1);
|
||||||
S48_GC_PROTECT_1(l);
|
S48_GC_PROTECT_1(l);
|
||||||
|
|
||||||
while (i > 0){
|
while (i > 0)
|
||||||
l = s48_cons(s48_enter_integer(gp[--i]), l);
|
l = s48_cons(s48_enter_integer(gvec[--i]), l);
|
||||||
}
|
|
||||||
|
|
||||||
if (veclen > 20) Free(gp);
|
|
||||||
|
|
||||||
S48_GC_UNPROTECT();
|
S48_GC_UNPROTECT();
|
||||||
|
|
||||||
return l;
|
return l;
|
||||||
|
|
Loading…
Reference in New Issue