[PATCH v13 47/51] nfs: Fix GETATTR bitmap verification

2015-11-03 Thread Andreas Gruenbacher
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 
---
 fs/nfs/nfs4xdr.c | 23 +++
 1 file changed, 23 insertions(+)

diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
index 788adf3..6f6d921 100644
--- a/fs/nfs/nfs4xdr.c
+++ b/fs/nfs/nfs4xdr.c
@@ -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, >tfiles)) != 
0)
goto xdr_error;
+
+   status = -EIO;
+   if (unlikely(bitmap[0]))
+   goto xdr_error;
+
if ((status = decode_attr_space_avail(xdr, bitmap, >abytes)) != 
0)
goto xdr_error;
if ((status = decode_attr_space_free(xdr, bitmap, >fbytes)) != 
0)
@@ -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, );
if (status < 0)
goto xdr_error;
@@ -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;
@@ -4789,12 +4802,22 @@ static int decode_fsinfo(struct xdr_stream *xdr, struct 
nfs_fsinfo *fsinfo)
if ((status = decode_attr_maxwrite(xdr, bitmap, >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, >time_delta);
if (status != 0)
goto xdr_error;
status = decode_attr_pnfstype(xdr, bitmap, >layouttype);
if (status != 0)
goto xdr_error;
+
+   status = -EIO;
+   if (unlikely(bitmap[1]))
+   goto xdr_error;
+
status = decode_attr_layout_blksize(xdr, bitmap, >blksize);
if (status)
goto xdr_error;
-- 
2.5.0

--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v13 47/51] nfs: Fix GETATTR bitmap verification

2015-11-03 Thread Trond Myklebust
On Tue, Nov 3, 2015 at 10:17 AM, Andreas Gruenbacher
 wrote:
> 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 
> ---
>  fs/nfs/nfs4xdr.c | 23 +++
>  1 file changed, 23 insertions(+)
>
> diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
> index 788adf3..6f6d921 100644
> --- a/fs/nfs/nfs4xdr.c
> +++ b/fs/nfs/nfs4xdr.c
> @@ -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, >tfiles)) 
> != 0)
> goto xdr_error;
> +
> +   status = -EIO;
> +   if (unlikely(bitmap[0]))
> +   goto xdr_error;
> +
> if ((status = decode_attr_space_avail(xdr, bitmap, >abytes)) 
> != 0)
> goto xdr_error;
> if ((status = decode_attr_space_free(xdr, bitmap, >fbytes)) 
> != 0)
> @@ -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, );
> if (status < 0)
> goto xdr_error;
> @@ -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;
> @@ -4789,12 +4802,22 @@ static int decode_fsinfo(struct xdr_stream *xdr, 
> struct nfs_fsinfo *fsinfo)
> if ((status = decode_attr_maxwrite(xdr, bitmap, >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, >time_delta);
> if (status != 0)
> goto xdr_error;
> status = decode_attr_pnfstype(xdr, bitmap, >layouttype);
> if (status != 0)
> goto xdr_error;
> +
> +   status = -EIO;
> +   if (unlikely(bitmap[1]))
> +   goto xdr_error;
> +
> status = decode_attr_layout_blksize(xdr, bitmap, >blksize);
> if (status)
> goto xdr_error;
> --
> 2.5.0

This patch can and should be merged separately from this patchset.
Please submit it through the usual channels.

Trond
--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html