aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenny Halevy <bhalevy@panasas.com>2008-07-02 04:13:18 -0400
committerJ. Bruce Fields <bfields@citi.umich.edu>2008-07-02 15:58:20 -0400
commit30cff1ffff3981c8d96dc33870b652e70190ba37 (patch)
tree26cdbe835637c5cd0885f9edc917d02cf8d66003
parent07cad1d2a4b0112acd41381d5bc6be82fd71ebac (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.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)
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;