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.
This commit is contained in:
Siddhesh Poyarekar 2014-03-27 19:49:51 +05:30
parent ea7d8b95e2
commit dd3022d75e
3 changed files with 17 additions and 4 deletions

View File

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

3
NEWS
View File

@ -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,

View File

@ -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;