NFSD: MKNOD should return NFSERR_BADTYPE instead of NFSERR_INVAL
authorChuck Lever <chuck.lever@oracle.com>
Fri, 23 Oct 2020 14:41:12 +0000 (10:41 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Thu, 5 Nov 2020 22:20:12 +0000 (17:20 -0500)
A late paragraph of RFC 1813 Section 3.3.11 states:

| ... if the server does not support the target type or the
| target type is illegal, the error, NFS3ERR_BADTYPE, should
| be returned. Note that NF3REG, NF3DIR, and NF3LNK are
| illegal types for MKNOD.

The Linux NFS server incorrectly returns NFSERR_INVAL in these
cases.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfs3proc.c

index 1446861..a633044 100644 (file)
@@ -316,10 +316,6 @@ nfsd3_proc_mknod(struct svc_rqst *rqstp)
        fh_copy(&resp->dirfh, &argp->fh);
        fh_init(&resp->fh, NFS3_FHSIZE);
 
-       if (argp->ftype == 0 || argp->ftype >= NF3BAD) {
-               resp->status = nfserr_inval;
-               goto out;
-       }
        if (argp->ftype == NF3CHR || argp->ftype == NF3BLK) {
                rdev = MKDEV(argp->major, argp->minor);
                if (MAJOR(rdev) != argp->major ||
@@ -328,7 +324,7 @@ nfsd3_proc_mknod(struct svc_rqst *rqstp)
                        goto out;
                }
        } else if (argp->ftype != NF3SOCK && argp->ftype != NF3FIFO) {
-               resp->status = nfserr_inval;
+               resp->status = nfserr_badtype;
                goto out;
        }