]> sourceware.org Git - glibc.git/commitdiff
Use NSS_STATUS_TRYAGAIN to indicate insufficient buffer (BZ #16878)
authorSiddhesh Poyarekar <siddhesh@redhat.com>
Mon, 26 May 2014 06:10:08 +0000 (11:40 +0530)
committerSiddhesh Poyarekar <siddhesh@redhat.com>
Mon, 26 May 2014 06:10:08 +0000 (11:40 +0530)
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.

ChangeLog
NEWS
nscd/netgroupcache.c
nss/nss_files/files-netgrp.c

index 299d4dedeea5b86d4d214047c77d2f932288c9f3..99d622313376ee07f4faec2a7549bbf48db98e4b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/NEWS b/NEWS
index 85b140cc36b7bb949d946afdc11661e8eee267a0..eaf0bc0331065bea41319eafa70e28464a11d10e 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -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.
index b3d40e9174c6d3b731d337dca89a4f25b35806d3..edab1744f44601b82ee38dcb5efe9bce703b0af0 100644 (file)
@@ -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 *);
index 34eae4c5becd8e95cc373213b5e60128a1b09f94..bc0b367da87583ceaa3b7368e2c064cff314055d 100644 (file)
@@ -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
     {
This page took 0.288967 seconds and 5 git commands to generate.