• Chuck Lever's avatar
    NFS: Fix listxattr receive buffer size · 6c2190b3
    Chuck Lever authored
    Certain NFSv4.2/RDMA tests fail with v5.9-rc1.
    
    rpcrdma_convert_kvec() runs off the end of the rl_segments array
    because rq_rcv_buf.tail[0].iov_len holds a very large positive
    value. The resultant kernel memory corruption is enough to crash
    the client system.
    
    Callers of rpc_prepare_reply_pages() must reserve an extra XDR_UNIT
    in the maximum decode size for a possible XDR pad of the contents
    of the xdr_buf's pages. That guarantees the allocated receive buffer
    will be large enough to accommodate the usual contents plus that XDR
    pad word.
    
    encode_op_hdr() cannot add that extra word. If it does,
    xdr_inline_pages() underruns the length of the tail iovec.
    
    Fixes: 3e1f0212 ("NFSv4.2: add client side XDR handling for extended attributes")
    Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
    6c2190b3
nfs42xdr.c 39.9 KB