Cyrus IMAPd 2.3.10 Released

Hajimu UMEMOTO ume at mahoroba.org
Fri Oct 26 13:31:32 EDT 2007


Hi,

>>>>> On Fri, 26 Oct 2007 11:13:01 -0400
>>>>> Ken Murchison <murch at andrew.cmu.edu> said:

murch> Tomas Janousek wrote:
> Hello,
> 
> On Fri, Oct 26, 2007 at 04:50:02PM +0200, Simon Matter wrote:
>>>>> --- auth_unix.c.~1.46.~	2007-09-27 16:02:45.000000000 -0400
>>>>> +++ auth_unix.c	2007-10-25 23:02:15.000000000 -0400
>>>>> @@ -225,7 +225,7 @@
>>>>>      struct group *grp;
>>>>>  #ifdef HAVE_GETGROUPLIST
>>>>>      gid_t gid, *groupids = NULL;
>>>>> -    int ret, ngroups = 0;
>>>>> +    int ret, ngroups = 10;
>>>>>  #else
>>>>>      char **mem;
>>>>>  #endif
>>>>> @@ -248,10 +248,7 @@
>>>>>  #ifdef HAVE_GETGROUPLIST
>>>>>      gid = pwd ? pwd->pw_gid : (gid_t) -1;
>>>>>
>>>>> -    /* get number of groups user is member of into ngroups */
>>>>> -    getgrouplist(identifier, gid, NULL, &ngroups);
>>>>> -
>>>>> -    /* get the actual group ids */
>>>>> +    /* get the group ids */
>>>>>      do {
>>>>>  	groupids = (gid_t *)xrealloc((gid_t *)groupids,
>>>>>  				     ngroups * sizeof(gid_t));
> 
> This should not change behaviour nor cause additional problems, I think.
> 
> The gnu manpage of getgrouplist does not mention the NULL case either, though
> it works. If it segfaults, I'd consider that a libc failure, since when
> ngroups == 0, the pointer shouldn't be used at all (it should point to the
> first element of the array but array of 0 elements has no first element).
> 
> If it really is a wrong code of mine, then sorry for not testing on anything
> other than Linux.

murch> Its not a problem.  Since we might have to realloc() the grouplist 
murch> anyways, it really doesn't make much sense to just get the count first.

The code is suspicious to me.  Isn't the test of `ret != -1' is
opposite?
Further, it seems that the test of `ngroups == newstate->ngroups'
assumes that newstate->ngroups holds the actual number of groups
found, by calling getgrouplist() in the first place.
Perhaps, it should be:

    do {
	groupids = (gid_t *)xrealloc((gid_t *)groupids,
				     ngroups * sizeof(gid_t));

	newstate->ngroups = ngroups; /* copy of ngroups for comparision */
	ret = getgrouplist(identifier, gid, groupids, &ngroups);
	/*
	 * This is tricky. We do this as long as getgrouplist tells us to
	 * realloc _and_ the number of groups changes. It tells us to realloc
	 * also in the case of failure...
	 */
    } while (ret == -1 && ngroups == newstate->ngroups);
             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

I'm not sure that we can expect `ngroups == newstate->ngroups',
though.

Sincerely,

--
Hajimu UMEMOTO @ Internet Mutual Aid Society Yokohama, Japan
ume at mahoroba.org  ume@{,jp.}FreeBSD.org
http://www.imasy.org/~ume/


More information about the Info-cyrus mailing list