Skip to content

Commit

Permalink
Use NSS_STATUS_TRYAGAIN to indicate insufficient buffer (BZ #16878)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Siddhesh Poyarekar committed May 26, 2014
1 parent aa2f176 commit c3ec475
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 10 deletions.
8 changes: 8 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
2014-05-26 Siddhesh Poyarekar <siddhesh@redhat.com>

[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.

2014-05-25 Richard Henderson <rth@twiddle.net>

* sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h
Expand Down
6 changes: 3 additions & 3 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ Version 2.20
16670, 16674, 16677, 16680, 16683, 16689, 16695, 16701, 16706, 16707,
16712, 16713, 16714, 16731, 16739, 16740, 16743, 16754, 16758, 16759,
16760, 16770, 16786, 16789, 16791, 16799, 16800, 16815, 16823, 16824,
16831, 16838, 16849, 16854, 16876, 16877, 16885, 16888, 16890, 16912,
16915, 16916, 16917, 16922, 16927, 16928, 16932, 16943, 16958, 16966,
16967, 16965, 16977, 16978.
16831, 16838, 16849, 16854, 16876, 16877, 16878, 16885, 16888, 16890,
16912, 16915, 16916, 16917, 16922, 16927, 16928, 16932, 16943, 16958,
16966, 16967, 16965, 16977, 16978.

* The minimum Linux kernel version that this version of the GNU C Library
can be used with is 2.6.32.
Expand Down
14 changes: 8 additions & 6 deletions nscd/netgroupcache.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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 *);
Expand Down
2 changes: 1 addition & 1 deletion nss/nss_files/files-netgrp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down

0 comments on commit c3ec475

Please sign in to comment.