diff options
author | Jose Castillo <jcastillo@redhat.com> | 2013-04-19 10:51:57 -0400 |
---|---|---|
committer | Steve Dickson <steved@redhat.com> | 2013-04-22 12:47:20 -0400 |
commit | 85352dd5ffd0d9a451b79fa61d24a518b553d280 (patch) | |
tree | 5d68ca426644b7dc50df28a20b9d3161205e5bcb | |
parent | 5acc87a87c012766a9d7f4e2f07e5de455e566e3 (diff) | |
download | nfs-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>
-rw-r--r-- | utils/mountd/cache.c | 10 |
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"); |