summaryrefslogtreecommitdiffstats
path: root/utils/mountd/cache.c
diff options
context:
space:
mode:
authorJose Castillo <jcastillo@redhat.com>2013-04-19 10:51:57 -0400
committerSteve Dickson <steved@redhat.com>2013-04-22 12:47:20 -0400
commit85352dd5ffd0d9a451b79fa61d24a518b553d280 (patch)
tree5d68ca426644b7dc50df28a20b9d3161205e5bcb /utils/mountd/cache.c
parent5acc87a87c012766a9d7f4e2f07e5de455e566e3 (diff)
downloadnfs-utils-85352dd5ffd0d9a451b79fa61d24a518b553d280.tar.gz
nfs-utils-85352dd5ffd0d9a451b79fa61d24a518b553d280.tar.xz
nfs-utils-85352dd5ffd0d9a451b79fa61d24a518b553d280.zip
mountd: Add the missing '$' in auth_unix_ip()
We found this problem because NFS clients to a RHEL6 NFS server were experiencing periods of ESTALE errors after being mounted and initially working successfully. Tests were run which snapshotted the nfs/sunrpc caches before and after the issue, and it was found that the '$' character at the beginning of the ID strings, used when in use_ipaddr mode, was getting lost: GOOD, while mount was working: nfsd 1.2.3.4 $1.2.3.4 BAD, after mount started returning ESTALE: nfsd 1.2.3.4 1.2.3.4 This would then cause the export checks to fail by passing '1.2.3.4' instead of '$1.2.3.4' up to rpc.mountd. The problem appears to be in the auth_unix_ip() function when renewing the auth.unix.ip cache entry. It would fail to add the '$' character back to the beginning of the string used for the domain string, breaking the use_ipaddr mode. Signed-off-by: Jose Castillo <jcastillo@redhat.com> Signed-off-by: Steve Dickson <steved@redhat.com>
Diffstat (limited to 'utils/mountd/cache.c')
-rw-r--r--utils/mountd/cache.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c
index 978698d..e1027f3 100644
--- a/utils/mountd/cache.c
+++ b/utils/mountd/cache.c
@@ -80,7 +80,7 @@ static void auth_unix_ip(FILE *f)
*/
char *cp;
char class[20];
- char ipaddr[INET6_ADDRSTRLEN];
+ char ipaddr[INET6_ADDRSTRLEN + 1];
char *client = NULL;
struct addrinfo *tmp = NULL;
if (readline(fileno(f), &lbuf, &lbuflen) != 1)
@@ -94,7 +94,7 @@ static void auth_unix_ip(FILE *f)
strcmp(class, "nfsd") != 0)
return;
- if (qword_get(&cp, ipaddr, sizeof(ipaddr)) <= 0)
+ if (qword_get(&cp, ipaddr, sizeof(ipaddr) - 1) <= 0)
return;
tmp = host_pton(ipaddr);
@@ -116,9 +116,11 @@ static void auth_unix_ip(FILE *f)
qword_print(f, "nfsd");
qword_print(f, ipaddr);
qword_printtimefrom(f, DEFAULT_TTL);
- if (use_ipaddr)
+ if (use_ipaddr) {
+ memmove(ipaddr + 1, ipaddr, strlen(ipaddr) + 1);
+ ipaddr[0] = '$';
qword_print(f, ipaddr);
- else if (client)
+ } else if (client)
qword_print(f, *client?client:"DEFAULT");
qword_eol(f);
xlog(D_CALL, "auth_unix_ip: client %p '%s'", client, client?client: "DEFAULT");