]>
Commit | Line | Data |
---|---|---|
bb330e25 AF |
1 | commit 50fd745b4dec07e8e213cf2703b5cabcfa128225 |
2 | Author: Andreas Schwab <schwab@suse.de> | |
3 | Date: Mon Jun 10 14:39:09 2013 +0200 | |
4 | ||
5 | Fix handling of netgroup cache in nscd | |
6 | ||
7 | diff --git a/nscd/connections.c b/nscd/connections.c | |
8 | index 7099215..69e3e7d 100644 | |
9 | --- a/nscd/connections.c | |
10 | +++ b/nscd/connections.c | |
11 | @@ -1779,7 +1779,7 @@ nscd_run_worker (void *p) | |
12 | else | |
13 | { | |
14 | /* Get the key. */ | |
15 | - char keybuf[MAXKEYLEN]; | |
16 | + char keybuf[MAXKEYLEN + 1]; | |
17 | ||
18 | if (__builtin_expect (TEMP_FAILURE_RETRY (read (fd, keybuf, | |
19 | req.key_len)) | |
20 | @@ -1791,6 +1791,7 @@ nscd_run_worker (void *p) | |
21 | strerror_r (errno, buf, sizeof (buf))); | |
22 | goto close_and_out; | |
23 | } | |
24 | + keybuf[req.key_len] = '\0'; | |
25 | ||
26 | if (__builtin_expect (debug_level, 0) > 0) | |
27 | { | |
28 | diff --git a/nscd/netgroupcache.c b/nscd/netgroupcache.c | |
29 | index 2d6c5aa..dd06ce4 100644 | |
30 | --- a/nscd/netgroupcache.c | |
31 | +++ b/nscd/netgroupcache.c | |
32 | @@ -192,18 +192,26 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, | |
33 | const char *nuser = data.val.triple.user; | |
34 | const char *ndomain = data.val.triple.domain; | |
35 | ||
36 | - if (data.val.triple.host > data.val.triple.user | |
37 | - || data.val.triple.user > data.val.triple.domain) | |
38 | + if (nhost == NULL || nuser == NULL || ndomain == NULL | |
39 | + || nhost > nuser || nuser > ndomain) | |
40 | { | |
41 | - const char *last = MAX (nhost, | |
42 | - MAX (nuser, ndomain)); | |
43 | - size_t bufused = (last + strlen (last) + 1 | |
44 | - - buffer); | |
45 | + const char *last = nhost; | |
46 | + if (last == NULL | |
47 | + || (nuser != NULL && nuser > last)) | |
48 | + last = nuser; | |
49 | + if (last == NULL | |
50 | + || (ndomain != NULL && ndomain > last)) | |
51 | + last = ndomain; | |
52 | + | |
53 | + size_t bufused | |
54 | + = (last == NULL | |
55 | + ? buffilled | |
56 | + : last + strlen (last) + 1 - buffer); | |
57 | ||
58 | /* We have to make temporary copies. */ | |
59 | - size_t hostlen = strlen (nhost) + 1; | |
60 | - size_t userlen = strlen (nuser) + 1; | |
61 | - size_t domainlen = strlen (ndomain) + 1; | |
62 | + size_t hostlen = strlen (nhost ?: "") + 1; | |
63 | + size_t userlen = strlen (nuser ?: "") + 1; | |
64 | + size_t domainlen = strlen (ndomain ?: "") + 1; | |
65 | size_t needed = hostlen + userlen + domainlen; | |
66 | ||
67 | if (buflen - req->key_len - bufused < needed) | |
68 | @@ -226,11 +234,11 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, | |
69 | } | |
70 | ||
71 | nhost = memcpy (buffer + bufused, | |
72 | - nhost, hostlen); | |
73 | + nhost ?: "", hostlen); | |
74 | nuser = memcpy ((char *) nhost + hostlen, | |
75 | - nuser, userlen); | |
76 | + nuser ?: "", userlen); | |
77 | ndomain = memcpy ((char *) nuser + userlen, | |
78 | - ndomain, domainlen); | |
79 | + ndomain ?: "", domainlen); | |
80 | } | |
81 | ||
82 | char *wp = buffer + buffilled; | |
83 | diff --git a/nscd/nscd_netgroup.c b/nscd/nscd_netgroup.c | |
84 | index cac4ebf..acb2c81 100644 | |
85 | --- a/nscd/nscd_netgroup.c | |
86 | +++ b/nscd/nscd_netgroup.c | |
87 | @@ -48,7 +48,7 @@ __nscd_setnetgrent (const char *group, struct __netgrent *datap) | |
88 | { | |
89 | int gc_cycle; | |
90 | int nretries = 0; | |
91 | - size_t group_len = strlen (group); | |
92 | + size_t group_len = strlen (group) + 1; | |
93 | ||
94 | /* If the mapping is available, try to search there instead of | |
95 | communicating with the nscd. */ |