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.
95 lines
3.3 KiB
95 lines
3.3 KiB
commit 50fd745b4dec07e8e213cf2703b5cabcfa128225 |
|
Author: Andreas Schwab <schwab@suse.de> |
|
Date: Mon Jun 10 14:39:09 2013 +0200 |
|
|
|
Fix handling of netgroup cache in nscd |
|
|
|
diff --git glibc-2.17-c758a686/nscd/connections.c glibc-2.17-c758a686/nscd/connections.c |
|
index 7099215..69e3e7d 100644 |
|
--- glibc-2.17-c758a686/nscd/connections.c |
|
+++ glibc-2.17-c758a686/nscd/connections.c |
|
@@ -1779,7 +1779,7 @@ nscd_run_worker (void *p) |
|
else |
|
{ |
|
/* Get the key. */ |
|
- char keybuf[MAXKEYLEN]; |
|
+ char keybuf[MAXKEYLEN + 1]; |
|
|
|
if (__builtin_expect (TEMP_FAILURE_RETRY (read (fd, keybuf, |
|
req.key_len)) |
|
@@ -1791,6 +1791,7 @@ nscd_run_worker (void *p) |
|
strerror_r (errno, buf, sizeof (buf))); |
|
goto close_and_out; |
|
} |
|
+ keybuf[req.key_len] = '\0'; |
|
|
|
if (__builtin_expect (debug_level, 0) > 0) |
|
{ |
|
diff --git glibc-2.17-c758a686/nscd/netgroupcache.c glibc-2.17-c758a686/nscd/netgroupcache.c |
|
index 2d6c5aa..dd06ce4 100644 |
|
--- glibc-2.17-c758a686/nscd/netgroupcache.c |
|
+++ glibc-2.17-c758a686/nscd/netgroupcache.c |
|
@@ -192,18 +192,26 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, |
|
const char *nuser = data.val.triple.user; |
|
const char *ndomain = data.val.triple.domain; |
|
|
|
- if (data.val.triple.host > data.val.triple.user |
|
- || data.val.triple.user > data.val.triple.domain) |
|
+ if (nhost == NULL || nuser == NULL || ndomain == NULL |
|
+ || nhost > nuser || nuser > ndomain) |
|
{ |
|
- const char *last = MAX (nhost, |
|
- MAX (nuser, ndomain)); |
|
- size_t bufused = (last + strlen (last) + 1 |
|
- - buffer); |
|
+ const char *last = nhost; |
|
+ if (last == NULL |
|
+ || (nuser != NULL && nuser > last)) |
|
+ last = nuser; |
|
+ if (last == NULL |
|
+ || (ndomain != NULL && ndomain > last)) |
|
+ last = ndomain; |
|
+ |
|
+ size_t bufused |
|
+ = (last == NULL |
|
+ ? buffilled |
|
+ : last + strlen (last) + 1 - buffer); |
|
|
|
/* We have to make temporary copies. */ |
|
- size_t hostlen = strlen (nhost) + 1; |
|
- size_t userlen = strlen (nuser) + 1; |
|
- size_t domainlen = strlen (ndomain) + 1; |
|
+ size_t hostlen = strlen (nhost ?: "") + 1; |
|
+ size_t userlen = strlen (nuser ?: "") + 1; |
|
+ size_t domainlen = strlen (ndomain ?: "") + 1; |
|
size_t needed = hostlen + userlen + domainlen; |
|
|
|
if (buflen - req->key_len - bufused < needed) |
|
@@ -226,11 +234,11 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, |
|
} |
|
|
|
nhost = memcpy (buffer + bufused, |
|
- nhost, hostlen); |
|
+ nhost ?: "", hostlen); |
|
nuser = memcpy ((char *) nhost + hostlen, |
|
- nuser, userlen); |
|
+ nuser ?: "", userlen); |
|
ndomain = memcpy ((char *) nuser + userlen, |
|
- ndomain, domainlen); |
|
+ ndomain ?: "", domainlen); |
|
} |
|
|
|
char *wp = buffer + buffilled; |
|
diff --git glibc-2.17-c758a686/nscd/nscd_netgroup.c glibc-2.17-c758a686/nscd/nscd_netgroup.c |
|
index cac4ebf..acb2c81 100644 |
|
--- glibc-2.17-c758a686/nscd/nscd_netgroup.c |
|
+++ glibc-2.17-c758a686/nscd/nscd_netgroup.c |
|
@@ -48,7 +48,7 @@ __nscd_setnetgrent (const char *group, struct __netgrent *datap) |
|
{ |
|
int gc_cycle; |
|
int nretries = 0; |
|
- size_t group_len = strlen (group); |
|
+ size_t group_len = strlen (group) + 1; |
|
|
|
/* If the mapping is available, try to search there instead of |
|
communicating with the nscd. */
|
|
|