]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Return failure in getnetgrent only when all netgroups have been searched (#17363)
authorSiddhesh Poyarekar <siddhesh@redhat.com>
Wed, 10 Sep 2014 16:21:50 +0000 (21:51 +0530)
committerSiddhesh Poyarekar <siddhesh@redhat.com>
Wed, 10 Sep 2014 16:21:50 +0000 (21:51 +0530)
The netgroups lookup code fails when one of the groups in the search
tree is empty.  In such a case it only returns the leaves of the tree
after the blank netgroup.  This is because the line parser returns a
NOTFOUND status when the netgroup exists but is empty.  The
__getnetgrent_internal implementation needs to be fixed to try
remaining groups if the current group is entry.  This patch implements
this fix.  Tested on x86_64.

[BZ #17363]
* inet/getnetgrent_r.c (__internal_getnetgrent_r): Try next
group if the current group is empty.

ChangeLog
NEWS
inet/getnetgrent_r.c

index dc61c8783c5365611bff860cdd3158eab980a795..a9f3338d00fc99dd4ba8e2832249781e8f54f3e4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2014-09-10  Siddhesh Poyarekar  <siddhesh@redhat.com>
+
+       [BZ #17363]
+       * inet/getnetgrent_r.c (__internal_getnetgrent_r): Try next
+       group if the current group is empty.
+
 2014-09-10  Adhemerval Zanella  <azanella@linux.vnet.ibm.com>
 
        * benchtests/bench-memset.c (test_main): Add more test from size
diff --git a/NEWS b/NEWS
index 721b457a8b3fd37ce5fe13a03d00d580a84d9b5c..40e2497eff513679c11d0cf3dd101cca3121f702 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,12 @@ See the end for copying conditions.
 Please send GNU C library bug reports via <http://sourceware.org/bugzilla/>
 using `glibc' in the "product" field.
 \f
+Version 2.21
+
+* The following bugs are resolved with this release:
+
+  17363.
+\f
 Version 2.20
 
 * The following bugs are resolved with this release:
index f6d064dbb5faeb8c80ba846bcb0784bcdcec37e8..e1015377e6babec966e84424e745fe41e1c48858 100644 (file)
@@ -297,7 +297,10 @@ __internal_getnetgrent_r (char **hostp, char **userp, char **domainp,
     {
       status = DL_CALL_FCT (*fct, (datap, buffer, buflen, &errno));
 
-      if (status == NSS_STATUS_RETURN)
+      if (status == NSS_STATUS_RETURN
+         /* The service returned a NOTFOUND, but there are more groups that we
+            need to resolve before we give up.  */
+         || (status == NSS_STATUS_NOTFOUND && datap->needed_groups != NULL))
        {
          /* This was the last one for this group.  Look at next group
             if available.  */