Loading fs/nfsd/nfs4xdr.c +38 −25 Original line number Diff line number Diff line Loading @@ -1559,46 +1559,59 @@ nfsd4_decode_state_protect4_a(struct nfsd4_compoundargs *argp, } static __be32 nfsd4_decode_exchange_id(struct nfsd4_compoundargs *argp, nfsd4_decode_nfs_impl_id4(struct nfsd4_compoundargs *argp, struct nfsd4_exchange_id *exid) { DECODE_HEAD; int dummy; __be32 status; u32 count; status = nfsd4_decode_verifier4(argp, &exid->verifier); if (xdr_stream_decode_u32(argp->xdr, &count) < 0) return nfserr_bad_xdr; switch (count) { case 0: break; case 1: /* Note that RFC 8881 places no length limit on * nii_domain, but this implementation permits no * more than NFS4_OPAQUE_LIMIT bytes */ status = nfsd4_decode_opaque(argp, &exid->nii_domain); if (status) return status; status = nfsd4_decode_opaque(argp, &exid->clname); /* Note that RFC 8881 places no length limit on * nii_name, but this implementation permits no * more than NFS4_OPAQUE_LIMIT bytes */ status = nfsd4_decode_opaque(argp, &exid->nii_name); if (status) return status; if (xdr_stream_decode_u32(argp->xdr, &exid->flags) < 0) return nfserr_bad_xdr; status = nfsd4_decode_state_protect4_a(argp, exid); status = nfsd4_decode_nfstime4(argp, &exid->nii_time); if (status) return status; break; default: return nfserr_bad_xdr; } READ_BUF(4); /* nfs_impl_id4 array length */ dummy = be32_to_cpup(p++); return nfs_ok; } if (dummy > 1) goto xdr_error; static __be32 nfsd4_decode_exchange_id(struct nfsd4_compoundargs *argp, struct nfsd4_exchange_id *exid) { __be32 status; if (dummy == 1) { status = nfsd4_decode_opaque(argp, &exid->nii_domain); status = nfsd4_decode_verifier4(argp, &exid->verifier); if (status) goto xdr_error; /* nii_name */ status = nfsd4_decode_opaque(argp, &exid->nii_name); return status; status = nfsd4_decode_opaque(argp, &exid->clname); if (status) goto xdr_error; /* nii_date */ status = nfsd4_decode_time(argp, &exid->nii_time); return status; if (xdr_stream_decode_u32(argp->xdr, &exid->flags) < 0) return nfserr_bad_xdr; status = nfsd4_decode_state_protect4_a(argp, exid); if (status) goto xdr_error; } DECODE_TAIL; return status; return nfsd4_decode_nfs_impl_id4(argp, exid); } static __be32 Loading Loading
fs/nfsd/nfs4xdr.c +38 −25 Original line number Diff line number Diff line Loading @@ -1559,46 +1559,59 @@ nfsd4_decode_state_protect4_a(struct nfsd4_compoundargs *argp, } static __be32 nfsd4_decode_exchange_id(struct nfsd4_compoundargs *argp, nfsd4_decode_nfs_impl_id4(struct nfsd4_compoundargs *argp, struct nfsd4_exchange_id *exid) { DECODE_HEAD; int dummy; __be32 status; u32 count; status = nfsd4_decode_verifier4(argp, &exid->verifier); if (xdr_stream_decode_u32(argp->xdr, &count) < 0) return nfserr_bad_xdr; switch (count) { case 0: break; case 1: /* Note that RFC 8881 places no length limit on * nii_domain, but this implementation permits no * more than NFS4_OPAQUE_LIMIT bytes */ status = nfsd4_decode_opaque(argp, &exid->nii_domain); if (status) return status; status = nfsd4_decode_opaque(argp, &exid->clname); /* Note that RFC 8881 places no length limit on * nii_name, but this implementation permits no * more than NFS4_OPAQUE_LIMIT bytes */ status = nfsd4_decode_opaque(argp, &exid->nii_name); if (status) return status; if (xdr_stream_decode_u32(argp->xdr, &exid->flags) < 0) return nfserr_bad_xdr; status = nfsd4_decode_state_protect4_a(argp, exid); status = nfsd4_decode_nfstime4(argp, &exid->nii_time); if (status) return status; break; default: return nfserr_bad_xdr; } READ_BUF(4); /* nfs_impl_id4 array length */ dummy = be32_to_cpup(p++); return nfs_ok; } if (dummy > 1) goto xdr_error; static __be32 nfsd4_decode_exchange_id(struct nfsd4_compoundargs *argp, struct nfsd4_exchange_id *exid) { __be32 status; if (dummy == 1) { status = nfsd4_decode_opaque(argp, &exid->nii_domain); status = nfsd4_decode_verifier4(argp, &exid->verifier); if (status) goto xdr_error; /* nii_name */ status = nfsd4_decode_opaque(argp, &exid->nii_name); return status; status = nfsd4_decode_opaque(argp, &exid->clname); if (status) goto xdr_error; /* nii_date */ status = nfsd4_decode_time(argp, &exid->nii_time); return status; if (xdr_stream_decode_u32(argp->xdr, &exid->flags) < 0) return nfserr_bad_xdr; status = nfsd4_decode_state_protect4_a(argp, exid); if (status) goto xdr_error; } DECODE_TAIL; return status; return nfsd4_decode_nfs_impl_id4(argp, exid); } static __be32 Loading