pNFS/flexfiles: fix incorrect size check in decode_nfs_fh()
authorNikola Livic <nlivic@gmail.com>
Mon, 29 Mar 2021 08:56:49 +0000 (11:56 +0300)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Wed, 14 Apr 2021 13:36:29 +0000 (09:36 -0400)
We (adam zabrocki, alexander matrosov, alexander tereshkin, maksym
bazalii) observed the check:

if (fh->size > sizeof(struct nfs_fh))

should not use the size of the nfs_fh struct which includes an extra two
bytes from the size field.

struct nfs_fh {
unsigned short         size;
unsigned char          data[NFS_MAXFHSIZE];
}

but should determine the size from data[NFS_MAXFHSIZE] so the memcpy
will not write 2 bytes beyond destination.  The proposed fix is to
compare against the NFS_MAXFHSIZE directly, as is done elsewhere in fs
code base.

Fixes: d67ae825a59d ("pnfs/flexfiles: Add the FlexFile Layout Driver")
Signed-off-by: Nikola Livic <nlivic@gmail.com>
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/flexfilelayout/flexfilelayout.c

index 872112bffcab2cd80d9e12e1e879d00822f80ef8..d383de00d4868fc569c7a9435868d8a7a26d6a7e 100644 (file)
@@ -106,7 +106,7 @@ static int decode_nfs_fh(struct xdr_stream *xdr, struct nfs_fh *fh)
        if (unlikely(!p))
                return -ENOBUFS;
        fh->size = be32_to_cpup(p++);
-       if (fh->size > sizeof(struct nfs_fh)) {
+       if (fh->size > NFS_MAXFHSIZE) {
                printk(KERN_ERR "NFS flexfiles: Too big fh received %d\n",
                       fh->size);
                return -EOVERFLOW;