This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
Ping! On Wed, Apr 30, 2014 at 02:43:30PM +0530, Siddhesh Poyarekar wrote: > The netgroups nss modules in the glibc tree use NSS_STATUS_UNAVAIL > (with errno as ERANGE) when the supplied buffer does not have > sufficient space for the result. This is wrong, because the canonical > way to indicate insufficient buffer is to set the errno to ERANGE and > the status to NSS_STATUS_TRYAGAIN, as is used by all other modules. > > This fixes nscd behaviour when the nss_ldap module returns > NSS_STATUS_TRYAGAIN to indicate that a netgroup entry is too long to > fit into the supplied buffer. A reproducer is present on the bz > #16878, which I used to verify that the problem is fixed. Many thanks > to Michael Weiser for the reproducer and analysis. > > Siddhesh > > [BZ #16878] > * nscd/netgroupcache.c (addgetnetgrentX): Look for > NSS_STATUS_TRYAGAIN to indicate insufficient buffer space. > * nscd/nss_files/files-netgrp.c (_nss_netgroup_parseline): Use > NSS_STATUS_TRYAGAIN to indicate insufficient buffer space. > > --- > nscd/netgroupcache.c | 14 ++++++++------ > nss/nss_files/files-netgrp.c | 2 +- > 2 files changed, 9 insertions(+), 7 deletions(-) > > diff --git a/nscd/netgroupcache.c b/nscd/netgroupcache.c > index b3d40e9..edab174 100644 > --- a/nscd/netgroupcache.c > +++ b/nscd/netgroupcache.c > @@ -197,11 +197,6 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, > int e; > status = getfct.f (&data, buffer + buffilled, > buflen - buffilled - req->key_len, &e); > - if (status == NSS_STATUS_RETURN > - || status == NSS_STATUS_NOTFOUND) > - /* This was either the last one for this group or the > - group was empty. Look at next group if available. */ > - break; > if (status == NSS_STATUS_SUCCESS) > { > if (data.type == triple_val) > @@ -320,11 +315,18 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, > } > } > } > - else if (status == NSS_STATUS_UNAVAIL && e == ERANGE) > + else if (status == NSS_STATUS_TRYAGAIN && e == ERANGE) > { > buflen *= 2; > buffer = xrealloc (buffer, buflen); > } > + else if (status == NSS_STATUS_RETURN > + || status == NSS_STATUS_NOTFOUND > + || status == NSS_STATUS_UNAVAIL) > + /* This was either the last one for this group or the > + group was empty or the NSS module had an internal > + failure. Look at next group if available. */ > + break; > } > > enum nss_status (*endfct) (struct __netgrent *); > diff --git a/nss/nss_files/files-netgrp.c b/nss/nss_files/files-netgrp.c > index 34eae4c..bc0b367 100644 > --- a/nss/nss_files/files-netgrp.c > +++ b/nss/nss_files/files-netgrp.c > @@ -252,7 +252,7 @@ _nss_netgroup_parseline (char **cursor, struct __netgrent *result, > if (cp - host > buflen) > { > *errnop = ERANGE; > - status = NSS_STATUS_UNAVAIL; > + status = NSS_STATUS_TRYAGAIN; > } > else > { > -- > 1.8.3.1 >
Attachment:
pgpfYMJ8YY6Xh.pgp
Description: PGP signature
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |