about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSiddhesh Poyarekar <siddhesh@redhat.com>2014-03-27 19:49:51 +0530
committerSiddhesh Poyarekar <siddhesh@redhat.com>2014-03-27 19:49:51 +0530
commitdd3022d75e6fb8957843d6d84257a5d8457822d5 (patch)
tree2a80ab93d6c2b5451fcf470539c70fc5b139a64f
parentea7d8b95e2fcb81f68b04ed7787a3dbda023991a (diff)
downloadglibc-dd3022d75e6fb8957843d6d84257a5d8457822d5.tar.gz
glibc-dd3022d75e6fb8957843d6d84257a5d8457822d5.tar.xz
glibc-dd3022d75e6fb8957843d6d84257a5d8457822d5.zip
Return NULL for wildcard values in getnetgrent from nscd (BZ #16759)
getnetgrent is supposed to return NULL for values that are wildcards
in the (host, user, domain) triplet.  This works correctly with nscd
disabled, but with it enabled, it returns a blank ("") instead of a
NULL.  This is easily seen with the output of `getent netgroup foonet`
for a netgroup foonet defined as follows in /etc/netgroup:

    foonet (,foo,)

The output with nscd disabled is:

    foonet ( ,foo,)

while with nscd enabled, it is:

    foonet (,foo,)

The extra space with nscd disabled is due to the fact that `getent
netgroup` adds it if the return value from getnetgrent is NULL for
either host or user.
-rw-r--r--ChangeLog4
-rw-r--r--NEWS3
-rw-r--r--inet/getnetgrent_r.c14
3 files changed, 17 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 7cf7bd1e43..796978df45 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2014-03-27  Siddhesh Poyarekar  <siddhesh@redhat.com>
 
+	[BZ #16759]
+	* inet/getnetgrent_r.c (get_nonempty_val): New function.
+	(nscd_getnetgrent): Use it.
+
 	[BZ #16760]
 	* nscd/netgroupcache.c (addgetnetgrentX): Use memmove instead
 	of stpcpy.
diff --git a/NEWS b/NEWS
index 6286681b47..afe4021337 100644
--- a/NEWS
+++ b/NEWS
@@ -12,7 +12,8 @@ Version 2.20
   15347, 15804, 15894, 16002, 16198, 16284, 16357, 16447, 16532, 16545,
   16574, 16599, 16600, 16609, 16610, 16611, 16613, 16623, 16632, 16634,
   16639, 16642, 16649, 16670, 16674, 16677, 16680, 16683, 16689, 16695,
-  16701, 16706, 16707, 16712, 16713, 16714, 16731, 16743, 16758, 16760.
+  16701, 16706, 16707, 16712, 16713, 16714, 16731, 16743, 16758, 16759,
+  16760.
 
 * Running the testsuite no longer terminates as soon as a test fails.
   Instead, a file tests.sum (xtests.sum from "make xcheck") is generated,
diff --git a/inet/getnetgrent_r.c b/inet/getnetgrent_r.c
index 62cdfda9cb..f6d064dbb5 100644
--- a/inet/getnetgrent_r.c
+++ b/inet/getnetgrent_r.c
@@ -235,6 +235,14 @@ endnetgrent (void)
 }
 
 #ifdef USE_NSCD
+static const char *
+get_nonempty_val (const char *in)
+{
+  if (*in == '\0')
+    return NULL;
+  return in;
+}
+
 static enum nss_status
 nscd_getnetgrent (struct __netgrent *datap, char *buffer, size_t buflen,
 		  int *errnop)
@@ -243,11 +251,11 @@ nscd_getnetgrent (struct __netgrent *datap, char *buffer, size_t buflen,
     return NSS_STATUS_UNAVAIL;
 
   datap->type = triple_val;
-  datap->val.triple.host = datap->cursor;
+  datap->val.triple.host = get_nonempty_val (datap->cursor);
   datap->cursor = (char *) __rawmemchr (datap->cursor, '\0') + 1;
-  datap->val.triple.user = datap->cursor;
+  datap->val.triple.user = get_nonempty_val (datap->cursor);
   datap->cursor = (char *) __rawmemchr (datap->cursor, '\0') + 1;
-  datap->val.triple.domain = datap->cursor;
+  datap->val.triple.domain = get_nonempty_val (datap->cursor);
   datap->cursor = (char *) __rawmemchr (datap->cursor, '\0') + 1;
 
   return NSS_STATUS_SUCCESS;