Commit a648fdeb authored by Chuck Lever's avatar Chuck Lever

NFSD: Fix NFSv3 SETATTR/CREATE's handling of large file sizes

iattr::ia_size is a loff_t, so these NFSv3 procedures must be
careful to deal with incoming client size values that are larger
than s64_max without corrupting the value.

Silently capping the value results in storing a different value
than the client passed in which is unexpected behavior, so remove
the min_t() check in decode_sattr3().

Note that RFC 1813 permits only the WRITE procedure to return
NFS3ERR_FBIG. We believe that NFSv3 reference implementations
also return NFS3ERR_FBIG when ia_size is too large.

Cc: stable@vger.kernel.org
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent e6faac3f
...@@ -254,7 +254,7 @@ svcxdr_decode_sattr3(struct svc_rqst *rqstp, struct xdr_stream *xdr, ...@@ -254,7 +254,7 @@ svcxdr_decode_sattr3(struct svc_rqst *rqstp, struct xdr_stream *xdr,
if (xdr_stream_decode_u64(xdr, &newsize) < 0) if (xdr_stream_decode_u64(xdr, &newsize) < 0)
return false; return false;
iap->ia_valid |= ATTR_SIZE; iap->ia_valid |= ATTR_SIZE;
iap->ia_size = min_t(u64, newsize, NFS_OFFSET_MAX); iap->ia_size = newsize;
} }
if (xdr_stream_decode_u32(xdr, &set_it) < 0) if (xdr_stream_decode_u32(xdr, &set_it) < 0)
return false; return false;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment