sunrpc: Avoid a KASAN slab-out-of-bounds bug in xdr_set_page_base()
authorAnna Schumaker <Anna.Schumaker@Netapp.com>
Wed, 9 Jun 2021 21:07:29 +0000 (17:07 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Sun, 13 Jun 2021 23:36:49 +0000 (19:36 -0400)
This seems to happen fairly easily during READ_PLUS testing on NFS v4.2.
I found that we could end up accessing xdr->buf->pages[pgnr] with a pgnr
greater than the number of pages in the array. So let's just return
early if we're setting base to a point at the end of the page data and
let xdr_set_tail_base() handle setting up the buffer pointers instead.

Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Fixes: 8d86e373b0ef ("SUNRPC: Clean up helpers xdr_set_iov() and xdr_set_page_base()")
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
net/sunrpc/xdr.c

index 3964ff7..ca10ba2 100644 (file)
@@ -1230,10 +1230,9 @@ static unsigned int xdr_set_page_base(struct xdr_stream *xdr,
        void *kaddr;
 
        maxlen = xdr->buf->page_len;
-       if (base >= maxlen) {
-               base = maxlen;
-               maxlen = 0;
-       } else
+       if (base >= maxlen)
+               return 0;
+       else
                maxlen -= base;
        if (len > maxlen)
                len = maxlen;