mirror of
https://github.com/torvalds/linux.git
synced 2026-06-10 07:32:29 +02:00
nfsd: Decode and send 64bit time values
commit bf8d909705 upstream.
The seconds field of an nfstime4 structure is 64bit, but we are assuming
that the first 32bits are zero-filled. So if the client tries to set
atime to a value before the epoch (touch -t 196001010101), then the
server will save the wrong value on disk.
Signed-off-by: Bryan Schumaker <bjschuma@netapp.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
f71ce17ff8
commit
2111a77044
|
|
@ -343,10 +343,7 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval,
|
|||
all 32 bits of 'nseconds'. */
|
||||
READ_BUF(12);
|
||||
len += 12;
|
||||
READ32(dummy32);
|
||||
if (dummy32)
|
||||
return nfserr_inval;
|
||||
READ32(iattr->ia_atime.tv_sec);
|
||||
READ64(iattr->ia_atime.tv_sec);
|
||||
READ32(iattr->ia_atime.tv_nsec);
|
||||
if (iattr->ia_atime.tv_nsec >= (u32)1000000000)
|
||||
return nfserr_inval;
|
||||
|
|
@ -369,10 +366,7 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval,
|
|||
all 32 bits of 'nseconds'. */
|
||||
READ_BUF(12);
|
||||
len += 12;
|
||||
READ32(dummy32);
|
||||
if (dummy32)
|
||||
return nfserr_inval;
|
||||
READ32(iattr->ia_mtime.tv_sec);
|
||||
READ64(iattr->ia_mtime.tv_sec);
|
||||
READ32(iattr->ia_mtime.tv_nsec);
|
||||
if (iattr->ia_mtime.tv_nsec >= (u32)1000000000)
|
||||
return nfserr_inval;
|
||||
|
|
@ -2371,8 +2365,7 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp,
|
|||
if (bmval1 & FATTR4_WORD1_TIME_ACCESS) {
|
||||
if ((buflen -= 12) < 0)
|
||||
goto out_resource;
|
||||
WRITE32(0);
|
||||
WRITE32(stat.atime.tv_sec);
|
||||
WRITE64((s64)stat.atime.tv_sec);
|
||||
WRITE32(stat.atime.tv_nsec);
|
||||
}
|
||||
if (bmval1 & FATTR4_WORD1_TIME_DELTA) {
|
||||
|
|
@ -2385,15 +2378,13 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp,
|
|||
if (bmval1 & FATTR4_WORD1_TIME_METADATA) {
|
||||
if ((buflen -= 12) < 0)
|
||||
goto out_resource;
|
||||
WRITE32(0);
|
||||
WRITE32(stat.ctime.tv_sec);
|
||||
WRITE64((s64)stat.ctime.tv_sec);
|
||||
WRITE32(stat.ctime.tv_nsec);
|
||||
}
|
||||
if (bmval1 & FATTR4_WORD1_TIME_MODIFY) {
|
||||
if ((buflen -= 12) < 0)
|
||||
goto out_resource;
|
||||
WRITE32(0);
|
||||
WRITE32(stat.mtime.tv_sec);
|
||||
WRITE64((s64)stat.mtime.tv_sec);
|
||||
WRITE32(stat.mtime.tv_nsec);
|
||||
}
|
||||
if (bmval1 & FATTR4_WORD1_MOUNTED_ON_FILEID) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user