Skip to content

Commit

Permalink
nfs: Fix GETATTR bitmap verification
Browse files Browse the repository at this point in the history
When decoding GETATTR replies, the client checks the attribute bitmap
for which attributes the server has sent.  It misses bits at the word
boundaries, though; fix that.

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
  • Loading branch information
Andreas Gruenbacher authored and Trond Myklebust committed Nov 3, 2015
1 parent 8fbcf23 commit 1ca843a
Showing 1 changed file with 23 additions and 0 deletions.
23 changes: 23 additions & 0 deletions fs/nfs/nfs4xdr.c
Original file line number Diff line number Diff line change
Expand Up @@ -4375,6 +4375,11 @@ static int decode_statfs(struct xdr_stream *xdr, struct nfs_fsstat *fsstat)
goto xdr_error;
if ((status = decode_attr_files_total(xdr, bitmap, &fsstat->tfiles)) != 0)
goto xdr_error;

status = -EIO;
if (unlikely(bitmap[0]))
goto xdr_error;

if ((status = decode_attr_space_avail(xdr, bitmap, &fsstat->abytes)) != 0)
goto xdr_error;
if ((status = decode_attr_space_free(xdr, bitmap, &fsstat->fbytes)) != 0)
Expand Down Expand Up @@ -4574,6 +4579,10 @@ static int decode_getfattr_attrs(struct xdr_stream *xdr, uint32_t *bitmap,
goto xdr_error;
fattr->valid |= status;

status = -EIO;
if (unlikely(bitmap[0]))
goto xdr_error;

status = decode_attr_mode(xdr, bitmap, &fmode);
if (status < 0)
goto xdr_error;
Expand Down Expand Up @@ -4627,6 +4636,10 @@ static int decode_getfattr_attrs(struct xdr_stream *xdr, uint32_t *bitmap,
goto xdr_error;
fattr->valid |= status;

status = -EIO;
if (unlikely(bitmap[1]))
goto xdr_error;

status = decode_attr_mdsthreshold(xdr, bitmap, fattr->mdsthreshold);
if (status < 0)
goto xdr_error;
Expand Down Expand Up @@ -4811,12 +4824,22 @@ static int decode_fsinfo(struct xdr_stream *xdr, struct nfs_fsinfo *fsinfo)
if ((status = decode_attr_maxwrite(xdr, bitmap, &fsinfo->wtmax)) != 0)
goto xdr_error;
fsinfo->wtpref = fsinfo->wtmax;

status = -EIO;
if (unlikely(bitmap[0]))
goto xdr_error;

status = decode_attr_time_delta(xdr, bitmap, &fsinfo->time_delta);
if (status != 0)
goto xdr_error;
status = decode_attr_pnfstype(xdr, bitmap, &fsinfo->layouttype);
if (status != 0)
goto xdr_error;

status = -EIO;
if (unlikely(bitmap[1]))
goto xdr_error;

status = decode_attr_layout_blksize(xdr, bitmap, &fsinfo->blksize);
if (status)
goto xdr_error;
Expand Down

0 comments on commit 1ca843a

Please sign in to comment.