NFSv4: Fix up decode_attr_filehandle() to handle the case of empty fh pointer
decode_attr_filehandle still needs to skip the XDR-encoded filehandle if someone passes a null pointer argument. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
4a201d6e3f
commit
7ad0735300
|
@ -2883,12 +2883,8 @@ static int decode_attr_filehandle(struct xdr_stream *xdr, uint32_t *bitmap, stru
|
||||||
__be32 *p;
|
__be32 *p;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
if (fh == NULL) {
|
if (fh != NULL)
|
||||||
bitmap[0] &= ~FATTR4_WORD0_FILEHANDLE;
|
memset(fh, 0, sizeof(*fh));
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(fh, 0, sizeof(*fh));
|
|
||||||
|
|
||||||
if (unlikely(bitmap[0] & (FATTR4_WORD0_FILEHANDLE - 1U)))
|
if (unlikely(bitmap[0] & (FATTR4_WORD0_FILEHANDLE - 1U)))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
@ -2899,11 +2895,13 @@ static int decode_attr_filehandle(struct xdr_stream *xdr, uint32_t *bitmap, stru
|
||||||
len = be32_to_cpup(p);
|
len = be32_to_cpup(p);
|
||||||
if (len > NFS4_FHSIZE)
|
if (len > NFS4_FHSIZE)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
fh->size = len;
|
|
||||||
p = xdr_inline_decode(xdr, len);
|
p = xdr_inline_decode(xdr, len);
|
||||||
if (unlikely(!p))
|
if (unlikely(!p))
|
||||||
goto out_overflow;
|
goto out_overflow;
|
||||||
memcpy(fh->data, p, len);
|
if (fh != NULL) {
|
||||||
|
memcpy(fh->data, p, len);
|
||||||
|
fh->size = len;
|
||||||
|
}
|
||||||
bitmap[0] &= ~FATTR4_WORD0_FILEHANDLE;
|
bitmap[0] &= ~FATTR4_WORD0_FILEHANDLE;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue