This one time, at band camp, Guido Guenther said:
> Hi Stephen,
> On Sat, May 26, 2007 at 11:51:33PM +0000, Stephen Gran wrote:
> > Which looks really good, until you spot the subtle flaw: the goto does
> > not actually retry the group that returned NSS_STATUS_TRYAGAIN, it tries
> > to grab the next group off the list.  getgrent always returns the next
> > group in the list each time it's called - it doesn't notice that the
>
> this is confusing. Running with this patch for testing:

I've updated your patch to this:

@@ -168,13 +168,16 @@
 tryagain:
    do {
        status = vtable->getent((void *)&result, buffer, buflen, &errnop);
+       printf("gid_t: %d starting\n", result.gr.gr_gid);
        if (status != NSS_STATUS_SUCCESS) {
            break;
        }
+       printf("gid_t: %d done\n", result.gr.gr_gid);
        status = callback(handle, (void *)&result, private);
    } while (status == NSS_STATUS_SUCCESS);
 
    if (status == NSS_STATUS_TRYAGAIN) {
+       printf("Enlarging buffer from %d to %d\n", buflen, buflen*2);
        buflen *= 2;
        buffer = realloc(buffer, buflen);
        if (buffer == NULL) {

And this is the output:

gid_t: 10110 starting
gid_t: 10110 done
gid_t: 10800 starting
Enlarging buffer from 496 to 992
gid_t: 11197 starting
gid_t: 11197 done

Note that gid 10800 (the giant group) never shows done.

> Note that the group with gid 10000 is the only group that needs the
> buffer enlarged (I've been running with a reduced buffer size of 128
> bytes for testing), this is current unstable with glibc 2.5). A similar
> test on sarge (glibc 2.3.2) fetching several thousand users from ldap
> works fine too and for completeness I checked glibc and getXXbyYY_r.c in
> glibc 2.3.5 suggests something different:
> 
>      /* The status is NSS_STATUS_TRYAGAIN and errno is ERANGE the
>        provided buffer is too small.  In this case we should give
>        the user the possibility to enlarge the buffer and we should
>        not simply go on with the next service (even if the TRYAGAIN
>        action tells us so).  */

I saw that, and what it says to me is that the only way to do this is to 
rewind to the top of the loop and try again with a larger buffer.
Currently, the buffer is being resized for all subsequent getent calls,
but not for the failed one.

> Might this be a bug affecting etch only?

I don't think so, based on the above output.

Take care,
-- 
 -----------------------------------------------------------------
|   ,''`.                                            Stephen Gran |
|  : :' :                                        [EMAIL PROTECTED] |
|  `. `'                        Debian user, admin, and developer |
|    `-                                     http://www.debian.org |
 -----------------------------------------------------------------

Attachment: signature.asc
Description: Digital signature

Reply via email to