lkml.org 
[lkml]   [2013]   [May]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[ 069/136 ] nfsd: Decode and send 64bit time values
    3.6.11.4 stable review patch.
    If anyone has any objections, please let me know.

    ------------------

    From: Bryan Schumaker <bjschuma@netapp.com>

    [ Upstream commit bf8d909705e9d9bac31d9b8eac6734d2b51332a7 ]

    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>
    Cc: stable@kernel.org
    Signed-off-by: J. Bruce Fields <bfields@redhat.com>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    ---
    fs/nfsd/nfs4xdr.c | 19 +++++--------------
    1 file changed, 5 insertions(+), 14 deletions(-)

    diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
    index 551b061..348937b 100644
    --- a/fs/nfsd/nfs4xdr.c
    +++ b/fs/nfsd/nfs4xdr.c
    @@ -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;
    @@ -2397,8 +2391,7 @@ out_acl:
    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) {
    @@ -2411,15 +2404,13 @@ out_acl:
    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) {
    --
    1.7.10.4



    \
     
     \ /
      Last update: 2013-05-18 05:21    [W:4.031 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site