Hi,

>>>>> On Sat, 27 Oct 2007 14:02:59 +0200
>>>>> Tomas Janousek <[EMAIL PROTECTED]> said:

tjanouse> On Fri, Oct 26, 2007 at 03:30:30PM -0400, Ken Murchison wrote:
>> 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 think you're right on the 'ret == -1' test.  We want to stay in the loop 
> if getgrouplist() fails, AND it returns a different number of groups.  

tjanouse> Yes. It should read "ret == -1 && ngroups != newstate->ngroups". I'm 
really
tjanouse> confused why I put the "ret != -1" in there.

As far as I read the FreeBSD's getgrouplist() implementation, when it
returns -1, the number of the groups actually filled is set to
ngroups.  It is match with the following description in the manpage:

  RETURN VALUES
     The getgrouplist() function returns -1 if the size of the group list is
     too small to hold all the user's groups.  Here, the group array will be
     filled with as many groups as will fit.

So, I think that "ret == -1 && ngroups != newstate->ngroups" doesn't
work on at least FreeBSD.

Sincerely,

--
Hajimu UMEMOTO @ Internet Mutual Aid Society Yokohama, Japan
[EMAIL PROTECTED]  [EMAIL PROTECTED],jp.}FreeBSD.org
http://www.imasy.org/~ume/
----
Cyrus Home Page: http://cyrusimap.web.cmu.edu/
Cyrus Wiki/FAQ: http://cyrusimap.web.cmu.edu/twiki
List Archives/Info: http://asg.web.cmu.edu/cyrus/mailing-list.html

Reply via email to