diff options
author | cel <cel@FreeBSD.org> | 2006-03-08 01:43:01 +0000 |
---|---|---|
committer | cel <cel@FreeBSD.org> | 2006-03-08 01:43:01 +0000 |
commit | 85c8b06cbe7efe55ca9d6a18d623fa181f29b4b3 (patch) | |
tree | f7f412d6230989b22378d95918e715aa6be90d92 | |
parent | 7d4fc1e0d475c302273e3401767bdee27f72041b (diff) | |
download | FreeBSD-src-85c8b06cbe7efe55ca9d6a18d623fa181f29b4b3.zip FreeBSD-src-85c8b06cbe7efe55ca9d6a18d623fa181f29b4b3.tar.gz |
Fix a bug in NFSv3 READDIRPLUS reply processing
The client's READDIRPLUS logic skips the attributes and
filehandle of the ".." entry. If the server doesn't send
attributes but does send a filehandle for "..", the
client's logic doesn't account for the extra "value
follows" field that indicates whether the filehandle is
present, causing the remaining entries in the reply
to be ignored.
Sponsored by: Network Appliance, Inc.
Reviewed by: rick, mohans
Approved by: silby
MFC after: 2 weeks
-rw-r--r-- | sys/nfsclient/nfs_vnops.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/sys/nfsclient/nfs_vnops.c b/sys/nfsclient/nfs_vnops.c index 445030d..7028836 100644 --- a/sys/nfsclient/nfs_vnops.c +++ b/sys/nfsclient/nfs_vnops.c @@ -2312,7 +2312,11 @@ nfs_readdirplusrpc(struct vnode *vp, struct uio *uiop, struct ucred *cred) /* Just skip over the file handle */ tl = nfsm_dissect(u_int32_t *, NFSX_UNSIGNED); i = fxdr_unsigned(int, *tl); - nfsm_adv(nfsm_rndup(i)); + if (i) { + tl = nfsm_dissect(u_int32_t *, NFSX_UNSIGNED); + fhsize = fxdr_unsigned(int, *tl); + nfsm_adv(nfsm_rndup(fhsize)); + } } if (newvp != NULLVP) { if (newvp == vp) |