diff options
author | Benny Halevy <bhalevy@panasas.com> | 2008-07-02 04:13:18 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@citi.umich.edu> | 2008-07-02 15:58:20 -0400 |
commit | 30cff1ffff3981c8d96dc33870b652e70190ba37 (patch) | |
tree | 26cdbe835637c5cd0885f9edc917d02cf8d66003 | |
parent | 07cad1d2a4b0112acd41381d5bc6be82fd71ebac (diff) |
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>
-rw-r--r-- | fs/nfsd/nfs4xdr.c | 10 |
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) | |||
1019 | } | 1019 | } |
1020 | } | 1020 | } |
1021 | 1021 | ||
1022 | if (argp->minorversion != 0) | ||
1023 | argp->opcnt = 0; | ||
1024 | |||
1022 | for (i = 0; i < argp->opcnt; i++) { | 1025 | for (i = 0; i < argp->opcnt; i++) { |
1023 | op = &argp->ops[i]; | 1026 | op = &argp->ops[i]; |
1024 | op->replay = NULL; | 1027 | op->replay = NULL; |
@@ -1057,13 +1060,6 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp) | |||
1057 | op->opnum = ntohl(*argp->p++); | 1060 | op->opnum = ntohl(*argp->p++); |
1058 | 1061 | ||
1059 | switch (op->opnum) { | 1062 | switch (op->opnum) { |
1060 | case 2: /* Reserved operation */ | ||
1061 | op->opnum = OP_ILLEGAL; | ||
1062 | if (argp->minorversion == 0) | ||
1063 | op->status = nfserr_op_illegal; | ||
1064 | else | ||
1065 | op->status = nfserr_minor_vers_mismatch; | ||
1066 | break; | ||
1067 | case OP_ACCESS: | 1063 | case OP_ACCESS: |
1068 | op->status = nfsd4_decode_access(argp, &op->u.access); | 1064 | op->status = nfsd4_decode_access(argp, &op->u.access); |
1069 | break; | 1065 | break; |