You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
2.0 KiB
47 lines
2.0 KiB
commit 1c81d55fc4b07b51adf68558ba74ce975153e580 |
|
Author: DJ Delorie <dj@redhat.com> |
|
Date: Thu Mar 1 23:20:45 2018 -0500 |
|
|
|
[BZ #22342] Fix netgroup cache keys. |
|
|
|
Unlike other nscd caches, the netgroup cache contains two types of |
|
records - those for "iterate through a netgroup" (i.e. setnetgrent()) |
|
and those for "is this user in this netgroup" (i.e. innetgr()), |
|
i.e. full and partial records. The timeout code assumes these records |
|
have the same key for the group name, so that the collection of records |
|
that is "this netgroup" can be expired as a unit. |
|
|
|
However, the keys are not the same, as the in-netgroup key is generated |
|
by nscd rather than being passed to it from elsewhere, and is generated |
|
without the trailing NUL. All other keys have the trailing NUL, and as |
|
noted in the linked BZ, debug statements confirm that two keys for the |
|
same netgroup are added to the cache with two different lengths. |
|
|
|
The result of this is that as records in the cache expire, the purge |
|
code only cleans out one of the two types of entries, resulting in |
|
stale, possibly incorrect, and possibly inconsistent cache data. |
|
|
|
The patch simply includes the existing NUL in the computation for the |
|
key length ('key' points to the char after the NUL, and 'group' to the |
|
first char of the group, so 'key-group' includes the first char to the |
|
NUL, inclusive). |
|
|
|
[BZ #22342] |
|
* nscd/netgroupcache.c (addinnetgrX): Include trailing NUL in |
|
key value. |
|
|
|
Reviewed-by: Carlos O'Donell <carlos@redhat.com> |
|
|
|
diff --git a/nscd/netgroupcache.c b/nscd/netgroupcache.c |
|
index b832c93..2f187b2 100644 |
|
--- a/nscd/netgroupcache.c |
|
+++ b/nscd/netgroupcache.c |
|
@@ -480,7 +480,7 @@ addinnetgrX (struct database_dyn *db, int fd, request_header *req, |
|
{ |
|
const char *group = key; |
|
key = (char *) rawmemchr (key, '\0') + 1; |
|
- size_t group_len = key - group - 1; |
|
+ size_t group_len = key - group; |
|
const char *host = *key++ ? key : NULL; |
|
if (host != NULL) |
|
key = (char *) rawmemchr (key, '\0') + 1;
|
|
|