]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] kNFSd: Correct error returns.
authorAndrew Morton <akpm@osdl.org>
Thu, 26 Feb 2004 14:48:04 +0000 (06:48 -0800)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Thu, 26 Feb 2004 14:48:04 +0000 (06:48 -0800)
From: NeilBrown <neilb@cse.unsw.edu.au>

Call decode_fattr on writable attributes to check for xdr errors, incorrect
utf8, etc.

fs/nfsd/nfs4proc.c
fs/nfsd/nfs4xdr.c
include/linux/nfsd/nfsd.h

index 078529195e854b40425f35fc21995bd1ec40fbcd..7fdaa1ef51422c62f5e8d09bb33ef80aa04474bd 100644 (file)
@@ -584,8 +584,9 @@ nfsd4_verify(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_ver
 
        if ((verify->ve_bmval[0] & ~NFSD_SUPPORTED_ATTRS_WORD0)
            || (verify->ve_bmval[1] & ~NFSD_SUPPORTED_ATTRS_WORD1))
-               return nfserr_notsupp;
-       if (verify->ve_bmval[1] & NFSD_WRITEONLY_ATTRS_WORD1)
+               return nfserr_attrnotsupp;
+       if ((verify->ve_bmval[0] & FATTR4_WORD0_RDATTR_ERROR)
+           || (verify->ve_bmval[1] & NFSD_WRITEONLY_ATTRS_WORD1))
                return nfserr_inval;
        if (verify->ve_attrlen & 3)
                return nfserr_inval;
index 6223ac91cc33abfcdf595b9be887e3a5ebdc9ce7..644988d8dbc9bf8cf7c84b8c945219d061ec9355 100644 (file)
@@ -908,10 +908,31 @@ nfsd4_decode_setclientid_confirm(struct nfsd4_compoundargs *argp, struct nfsd4_s
 static int
 nfsd4_decode_verify(struct nfsd4_compoundargs *argp, struct nfsd4_verify *verify)
 {
+#if 0
+       struct nfsd4_compoundargs save = {
+               .p = argp->p,
+               .end = argp->end,
+               .rqstp = argp->rqstp,
+       };
+       u32             ve_bmval[2];
+       struct iattr    ve_iattr;           /* request */
+       struct nfs4_acl *ve_acl;            /* request */
+#endif
        DECODE_HEAD;
 
        if ((status = nfsd4_decode_bitmap(argp, verify->ve_bmval)))
                goto out;
+
+       /* For convenience's sake, we compare raw xdr'd attributes in
+        * nfsd4_proc_verify; however we still decode here just to return
+        * correct error in case of bad xdr. */
+#if 0
+       status = nfsd4_decode_fattr(ve_bmval, &ve_iattr, &ve_acl);
+       if (status == nfserr_inval) {
+               status = nfserrno(status);
+               goto out;
+       }
+#endif
        READ_BUF(4);
        READ32(verify->ve_attrlen);
        READ_BUF(verify->ve_attrlen);
index 49247c638cf8c525c3c1ee33066013c03ce00f64..20b1f4a3fb1022cb99be2d6be357f243863de602 100644 (file)
@@ -191,6 +191,7 @@ void                nfsd_lockd_shutdown(void);
 #define        nfserr_symlink          __constant_htonl(NFSERR_SYMLINK)
 #define        nfserr_not_same         __constant_htonl(NFSERR_NOT_SAME)
 #define        nfserr_restorefh        __constant_htonl(NFSERR_RESTOREFH)
+#define        nfserr_attrnotsupp      __constant_htonl(NFSERR_ATTRNOTSUPP)
 #define        nfserr_bad_xdr          __constant_htonl(NFSERR_BAD_XDR)
 #define        nfserr_openmode         __constant_htonl(NFSERR_OPENMODE)