Commit f2e717d6 authored by Trond Myklebust's avatar Trond Myklebust Committed by Chuck Lever

nfsd4: Handle the NFSv4 READDIR 'dircount' hint being zero

RFC3530 notes that the 'dircount' field may be zero, in which case the
recommendation is to ignore it, and only enforce the 'maxcount' field.
In RFC5661, this recommendation to ignore a zero valued field becomes a
requirement.

Fixes: aee37764 ("nfsd4: fix rd_dircount enforcement")
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent 1d625050
...@@ -3544,15 +3544,18 @@ nfsd4_encode_dirent(void *ccdv, const char *name, int namlen, ...@@ -3544,15 +3544,18 @@ nfsd4_encode_dirent(void *ccdv, const char *name, int namlen,
goto fail; goto fail;
cd->rd_maxcount -= entry_bytes; cd->rd_maxcount -= entry_bytes;
/* /*
* RFC 3530 14.2.24 describes rd_dircount as only a "hint", so * RFC 3530 14.2.24 describes rd_dircount as only a "hint", and
* let's always let through the first entry, at least: * notes that it could be zero. If it is zero, then the server
* should enforce only the rd_maxcount value.
*/ */
if (!cd->rd_dircount) if (cd->rd_dircount) {
goto fail; name_and_cookie = 4 + 4 * XDR_QUADLEN(namlen) + 8;
name_and_cookie = 4 + 4 * XDR_QUADLEN(namlen) + 8; if (name_and_cookie > cd->rd_dircount && cd->cookie_offset)
if (name_and_cookie > cd->rd_dircount && cd->cookie_offset) goto fail;
goto fail; cd->rd_dircount -= min(cd->rd_dircount, name_and_cookie);
cd->rd_dircount -= min(cd->rd_dircount, name_and_cookie); if (!cd->rd_dircount)
cd->rd_maxcount = 0;
}
cd->cookie_offset = cookie_offset; cd->cookie_offset = cookie_offset;
skip_entry: skip_entry:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment