summaryrefslogtreecommitdiffstats
path: root/fs/nfsd
diff options
context:
space:
mode:
authorBenny Halevy <bhalevy@panasas.com>2008-07-02 10:13:18 +0200
committerJ. Bruce Fields <bfields@citi.umich.edu>2008-07-02 21:58:20 +0200
commit30cff1ffff3981c8d96dc33870b652e70190ba37 (patch)
tree26cdbe835637c5cd0885f9edc917d02cf8d66003 /fs/nfsd
parentnfsd: clean up mnt_want_write calls (diff)
downloadlinux-30cff1ffff3981c8d96dc33870b652e70190ba37.tar.xz
linux-30cff1ffff3981c8d96dc33870b652e70190ba37.zip
nfsd: return nfserr_minor_vers_mismatch when compound minorversion != 0
Check minorversion once before decoding any operation and reject with nfserr_minor_vers_mismatch if != 0 (this still happens in nfsd4_proc_compound). In this case return a zero length resultdata array as required by RFC3530. minorversion 1 processing will have its own vector of decoders. Signed-off-by: Benny Halevy <bhalevy@panasas.com> Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Diffstat (limited to 'fs/nfsd')
-rw-r--r--fs/nfsd/nfs4xdr.c10
1 files changed, 3 insertions, 7 deletions
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
index 9547ab636274..413a15332177 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
@@ -1019,6 +1019,9 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp)
}
}
+ if (argp->minorversion != 0)
+ argp->opcnt = 0;
+
for (i = 0; i < argp->opcnt; i++) {
op = &argp->ops[i];
op->replay = NULL;
@@ -1057,13 +1060,6 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp)
op->opnum = ntohl(*argp->p++);
switch (op->opnum) {
- case 2: /* Reserved operation */
- op->opnum = OP_ILLEGAL;
- if (argp->minorversion == 0)
- op->status = nfserr_op_illegal;
- else
- op->status = nfserr_minor_vers_mismatch;
- break;
case OP_ACCESS:
op->status = nfsd4_decode_access(argp, &op->u.access);
break;