Skip to content

Commit

Permalink
NFSv4: Ensure decode_compound_hdr() sanity checks the tag
Browse files Browse the repository at this point in the history
The server is supposed to return the same tag that the client sends in
the outgoing RPC call, but we should still sanity check the length just
in case.

Reported-by: <[email protected]>
Signed-off-by: Trond Myklebust <[email protected]>
  • Loading branch information
Trond Myklebust committed Nov 5, 2021
1 parent 4798f80 commit 6659db4
Showing 1 changed file with 13 additions and 10 deletions.
23 changes: 13 additions & 10 deletions fs/nfs/nfs4xdr.c
Original file line number Diff line number Diff line change
Expand Up @@ -3168,20 +3168,23 @@ static int decode_opaque_inline(struct xdr_stream *xdr, unsigned int *len, char

static int decode_compound_hdr(struct xdr_stream *xdr, struct compound_hdr *hdr)
{
__be32 *p;
ssize_t ret;
void *ptr;
u32 tmp;

p = xdr_inline_decode(xdr, 8);
if (unlikely(!p))
if (xdr_stream_decode_u32(xdr, &tmp) < 0)
return -EIO;
hdr->status = be32_to_cpup(p++);
hdr->taglen = be32_to_cpup(p);
hdr->status = tmp;

p = xdr_inline_decode(xdr, hdr->taglen + 4);
if (unlikely(!p))
ret = xdr_stream_decode_opaque_inline(xdr, &ptr, NFS4_OPAQUE_LIMIT);
if (ret < 0)
return -EIO;
hdr->taglen = ret;
hdr->tag = ptr;

if (xdr_stream_decode_u32(xdr, &tmp) < 0)
return -EIO;
hdr->tag = (char *)p;
p += XDR_QUADLEN(hdr->taglen);
hdr->nops = be32_to_cpup(p);
hdr->nops = tmp;
if (unlikely(hdr->nops < 1))
return nfs4_stat_to_errno(hdr->status);
return 0;
Expand Down

0 comments on commit 6659db4

Please sign in to comment.