Loading fs/nfsd/nfs3xdr.c +16 −13 Original line number Diff line number Diff line Loading @@ -616,25 +616,28 @@ nfs3svc_decode_mkdirargs(struct svc_rqst *rqstp, __be32 *p) int nfs3svc_decode_symlinkargs(struct svc_rqst *rqstp, __be32 *p) { struct xdr_stream *xdr = &rqstp->rq_arg_stream; struct nfsd3_symlinkargs *args = rqstp->rq_argp; char *base = (char *)p; size_t dlen; struct kvec *head = rqstp->rq_arg.head; struct kvec *tail = rqstp->rq_arg.tail; size_t remaining; if (!(p = decode_fh(p, &args->ffh)) || !(p = decode_filename(p, &args->fname, &args->flen))) if (!svcxdr_decode_diropargs3(xdr, &args->ffh, &args->fname, &args->flen)) return 0; if (!svcxdr_decode_sattr3(rqstp, xdr, &args->attrs)) return 0; if (xdr_stream_decode_u32(xdr, &args->tlen) < 0) return 0; p = decode_sattr3(p, &args->attrs, nfsd_user_namespace(rqstp)); args->tlen = ntohl(*p++); /* request sanity */ remaining = head->iov_len + rqstp->rq_arg.page_len + tail->iov_len; remaining -= xdr_stream_pos(xdr); if (remaining < xdr_align_size(args->tlen)) return 0; args->first.iov_base = p; args->first.iov_len = rqstp->rq_arg.head[0].iov_len; args->first.iov_len -= (char *)p - base; args->first.iov_base = xdr->p; args->first.iov_len = head->iov_len - xdr_stream_pos(xdr); dlen = args->first.iov_len + rqstp->rq_arg.page_len + rqstp->rq_arg.tail[0].iov_len; if (dlen < XDR_QUADLEN(args->tlen) << 2) return 0; return 1; } Loading Loading
fs/nfsd/nfs3xdr.c +16 −13 Original line number Diff line number Diff line Loading @@ -616,25 +616,28 @@ nfs3svc_decode_mkdirargs(struct svc_rqst *rqstp, __be32 *p) int nfs3svc_decode_symlinkargs(struct svc_rqst *rqstp, __be32 *p) { struct xdr_stream *xdr = &rqstp->rq_arg_stream; struct nfsd3_symlinkargs *args = rqstp->rq_argp; char *base = (char *)p; size_t dlen; struct kvec *head = rqstp->rq_arg.head; struct kvec *tail = rqstp->rq_arg.tail; size_t remaining; if (!(p = decode_fh(p, &args->ffh)) || !(p = decode_filename(p, &args->fname, &args->flen))) if (!svcxdr_decode_diropargs3(xdr, &args->ffh, &args->fname, &args->flen)) return 0; if (!svcxdr_decode_sattr3(rqstp, xdr, &args->attrs)) return 0; if (xdr_stream_decode_u32(xdr, &args->tlen) < 0) return 0; p = decode_sattr3(p, &args->attrs, nfsd_user_namespace(rqstp)); args->tlen = ntohl(*p++); /* request sanity */ remaining = head->iov_len + rqstp->rq_arg.page_len + tail->iov_len; remaining -= xdr_stream_pos(xdr); if (remaining < xdr_align_size(args->tlen)) return 0; args->first.iov_base = p; args->first.iov_len = rqstp->rq_arg.head[0].iov_len; args->first.iov_len -= (char *)p - base; args->first.iov_base = xdr->p; args->first.iov_len = head->iov_len - xdr_stream_pos(xdr); dlen = args->first.iov_len + rqstp->rq_arg.page_len + rqstp->rq_arg.tail[0].iov_len; if (dlen < XDR_QUADLEN(args->tlen) << 2) return 0; return 1; } Loading