NFSD: Replace READ* macros that decode the fattr4 time_set attributes
authorChuck Lever <chuck.lever@oracle.com>
Thu, 19 Nov 2020 19:01:08 +0000 (14:01 -0500)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 30 Nov 2020 19:46:37 +0000 (14:46 -0500)
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfs4xdr.c

index 433fa67..9b13386 100644 (file)
@@ -220,6 +220,21 @@ nfsd4_decode_time(struct nfsd4_compoundargs *argp, struct timespec64 *tv)
 }
 
 static __be32
+nfsd4_decode_nfstime4(struct nfsd4_compoundargs *argp, struct timespec64 *tv)
+{
+       __be32 *p;
+
+       p = xdr_inline_decode(argp->xdr, XDR_UNIT * 3);
+       if (!p)
+               return nfserr_bad_xdr;
+       p = xdr_decode_hyper(p, &tv->tv_sec);
+       tv->tv_nsec = be32_to_cpup(p++);
+       if (tv->tv_nsec >= (u32)1000000000)
+               return nfserr_inval;
+       return nfs_ok;
+}
+
+static __be32
 nfsd4_decode_bitmap(struct nfsd4_compoundargs *argp, u32 *bmval)
 {
        u32 bmlen;
@@ -388,11 +403,13 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval,
                iattr->ia_valid |= ATTR_GID;
        }
        if (bmval[1] & FATTR4_WORD1_TIME_ACCESS_SET) {
-               READ_BUF(4);
-               dummy32 = be32_to_cpup(p++);
-               switch (dummy32) {
+               u32 set_it;
+
+               if (xdr_stream_decode_u32(argp->xdr, &set_it) < 0)
+                       return nfserr_bad_xdr;
+               switch (set_it) {
                case NFS4_SET_TO_CLIENT_TIME:
-                       status = nfsd4_decode_time(argp, &iattr->ia_atime);
+                       status = nfsd4_decode_nfstime4(argp, &iattr->ia_atime);
                        if (status)
                                return status;
                        iattr->ia_valid |= (ATTR_ATIME | ATTR_ATIME_SET);
@@ -401,15 +418,17 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval,
                        iattr->ia_valid |= ATTR_ATIME;
                        break;
                default:
-                       goto xdr_error;
+                       return nfserr_bad_xdr;
                }
        }
        if (bmval[1] & FATTR4_WORD1_TIME_MODIFY_SET) {
-               READ_BUF(4);
-               dummy32 = be32_to_cpup(p++);
-               switch (dummy32) {
+               u32 set_it;
+
+               if (xdr_stream_decode_u32(argp->xdr, &set_it) < 0)
+                       return nfserr_bad_xdr;
+               switch (set_it) {
                case NFS4_SET_TO_CLIENT_TIME:
-                       status = nfsd4_decode_time(argp, &iattr->ia_mtime);
+                       status = nfsd4_decode_nfstime4(argp, &iattr->ia_mtime);
                        if (status)
                                return status;
                        iattr->ia_valid |= (ATTR_MTIME | ATTR_MTIME_SET);
@@ -418,7 +437,7 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval,
                        iattr->ia_valid |= ATTR_MTIME;
                        break;
                default:
-                       goto xdr_error;
+                       return nfserr_bad_xdr;
                }
        }