nfsd4: Handle the NFSv4 READDIR 'dircount' hint being zero
commitf2e717d655upstream. 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:aee3776441("nfsd4: fix rd_dircount enforcement") Cc: <stable@vger.kernel.org> Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
12d4b17902
commit
8f174a208c
1 changed files with 11 additions and 8 deletions
|
|
@ -3427,15 +3427,18 @@ nfsd4_encode_dirent(void *ccdv, const char *name, int namlen,
|
|||
goto fail;
|
||||
cd->rd_maxcount -= entry_bytes;
|
||||
/*
|
||||
* RFC 3530 14.2.24 describes rd_dircount as only a "hint", so
|
||||
* let's always let through the first entry, at least:
|
||||
* RFC 3530 14.2.24 describes rd_dircount as only a "hint", and
|
||||
* notes that it could be zero. If it is zero, then the server
|
||||
* should enforce only the rd_maxcount value.
|
||||
*/
|
||||
if (!cd->rd_dircount)
|
||||
goto fail;
|
||||
name_and_cookie = 4 + 4 * XDR_QUADLEN(namlen) + 8;
|
||||
if (name_and_cookie > cd->rd_dircount && cd->cookie_offset)
|
||||
goto fail;
|
||||
cd->rd_dircount -= min(cd->rd_dircount, name_and_cookie);
|
||||
if (cd->rd_dircount) {
|
||||
name_and_cookie = 4 + 4 * XDR_QUADLEN(namlen) + 8;
|
||||
if (name_and_cookie > cd->rd_dircount && cd->cookie_offset)
|
||||
goto fail;
|
||||
cd->rd_dircount -= min(cd->rd_dircount, name_and_cookie);
|
||||
if (!cd->rd_dircount)
|
||||
cd->rd_maxcount = 0;
|
||||
}
|
||||
|
||||
cd->cookie_offset = cookie_offset;
|
||||
skip_entry:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue