From patchwork Fri Jun 1 00:48:11 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ronnie Sahlberg X-Patchwork-Id: 10442293 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id B9ABB602BC for ; Fri, 1 Jun 2018 00:48:15 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B1DAE2841E for ; Fri, 1 Jun 2018 00:48:15 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A37152885E; Fri, 1 Jun 2018 00:48:15 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00, MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 543CA286B7 for ; Fri, 1 Jun 2018 00:48:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751260AbeFAAsN (ORCPT ); Thu, 31 May 2018 20:48:13 -0400 Received: from mx1.redhat.com ([209.132.183.28]:48860 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751005AbeFAAsM (ORCPT ); Thu, 31 May 2018 20:48:12 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8811630BC682; Fri, 1 Jun 2018 00:48:12 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 74DF41001944; Fri, 1 Jun 2018 00:48:12 +0000 (UTC) Received: from zmail25.collab.prod.int.phx2.redhat.com (zmail25.collab.prod.int.phx2.redhat.com [10.5.83.31]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 5D89F1800C9C; Fri, 1 Jun 2018 00:48:12 +0000 (UTC) Date: Thu, 31 May 2018 20:48:11 -0400 (EDT) From: Ronnie Sahlberg To: Steve French Cc: linux-cifs Message-ID: <713441058.5388811.1527814091923.JavaMail.zimbra@redhat.com> In-Reply-To: References: <20180530214348.25589-1-lsahlber@redhat.com> <20180530214348.25589-3-lsahlber@redhat.com> Subject: Re: [PATCH 02/15] cifs: remove rfc1002 header from all SMB2 response structures MIME-Version: 1.0 X-Originating-IP: [10.64.54.65, 10.4.195.10] Thread-Topic: cifs: remove rfc1002 header from all SMB2 response structures Thread-Index: A4rp+pzrXRjvl9grkNJVYtDA9k6snA== X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.46]); Fri, 01 Jun 2018 00:48:12 +0000 (UTC) Sender: linux-cifs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-cifs@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This was unintentionally unbroken again in 0009 This is the fix for 0002 : I will resend the series shortly ----- Original Message ----- > From: "Steve French" > To: "Ronnie Sahlberg" > Cc: "linux-cifs" > Sent: Thursday, 31 May, 2018 8:59:13 AM > Subject: Re: [PATCH 02/15] cifs: remove rfc1002 header from all SMB2 response structures > > This one seemed to break smb3.11 mounts - so I backed out all but the > first in the series till we can verify > > > > On Wed, May 30, 2018 at 4:43 PM, Ronnie Sahlberg wrote: > > Separate out all the 4 byte rfc1002 headers so that they are no longer > > part of the SMB2 header structures to prepare for future work to add > > compounding support. > > > > Update the smb3 transform header processing that we no longer have > > a rfc1002 header at the start of this structure. > > > > Update smb2_readv_callback to accomodate that the first iovector in the > > response is no the smb2 header and no longer a rfc1002 header. > > > > Signed-off-by: Ronnie Sahlberg > > --- > > fs/cifs/connect.c | 6 ++- > > fs/cifs/smb2ops.c | 112 > > ++++++++++++++++++++++++++++-------------------- > > fs/cifs/smb2pdu.c | 27 +++++------- > > fs/cifs/smb2pdu.h | 6 --- > > fs/cifs/smb2transport.c | 10 ++--- > > 5 files changed, 85 insertions(+), 76 deletions(-) > > > > diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c > > index 4c0e3f6ae356..34a64719d3e2 100644 > > --- a/fs/cifs/connect.c > > +++ b/fs/cifs/connect.c > > @@ -882,7 +882,11 @@ cifs_demultiplex_thread(void *p) > > length = cifs_read_from_socket(server, buf, pdu_length); > > if (length < 0) > > continue; > > - server->total_read = length; > > + > > + if (server->vals->header_preamble_size == 0) > > + server->total_read = 0; > > + else > > + server->total_read = length; > > > > /* > > * The right amount was read from socket - 4 bytes, > > diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c > > index 7c0edd2ab784..20cc67c3a6d0 100644 > > --- a/fs/cifs/smb2ops.c > > +++ b/fs/cifs/smb2ops.c > > @@ -2144,12 +2144,11 @@ smb2_dir_needs_close(struct cifsFileInfo *cfile) > > } > > > > static void > > -fill_transform_hdr(struct TCP_Server_Info *server, > > - struct smb2_transform_hdr *tr_hdr, struct smb_rqst > > *old_rq) > > +fill_transform_hdr(struct smb2_transform_hdr *tr_hdr, unsigned int > > orig_len, > > + struct smb_rqst *old_rq) > > { > > struct smb2_sync_hdr *shdr = > > (struct smb2_sync_hdr *)old_rq->rq_iov[1].iov_base; > > - unsigned int orig_len = > > get_rfc1002_length(old_rq->rq_iov[0].iov_base); > > > > memset(tr_hdr, 0, sizeof(struct smb2_transform_hdr)); > > tr_hdr->ProtocolId = SMB2_TRANSFORM_PROTO_NUM; > > @@ -2157,8 +2156,6 @@ fill_transform_hdr(struct TCP_Server_Info *server, > > tr_hdr->Flags = cpu_to_le16(0x01); > > get_random_bytes(&tr_hdr->Nonce, SMB3_AES128CMM_NONCE); > > memcpy(&tr_hdr->SessionId, &shdr->SessionId, 8); > > - inc_rfc1001_len(tr_hdr, sizeof(struct smb2_transform_hdr) - > > server->vals->header_preamble_size); > > - inc_rfc1001_len(tr_hdr, orig_len); > > } > > > > /* We can not use the normal sg_set_buf() as we will sometimes pass a > > @@ -2170,11 +2167,16 @@ static inline void smb2_sg_set_buf(struct > > scatterlist *sg, const void *buf, > > sg_set_page(sg, virt_to_page(buf), buflen, offset_in_page(buf)); > > } > > > > +/* Assumes: > > + * rqst->rq_iov[0] is rfc1002 length > > + * rqst->rq_iov[1] is tranform header > > + * rqst->rq_iov[2+] data to be encrypted/decrypted > > + */ > > static struct scatterlist * > > init_sg(struct smb_rqst *rqst, u8 *sign) > > { > > - unsigned int sg_len = rqst->rq_nvec + rqst->rq_npages + 1; > > - unsigned int assoc_data_len = sizeof(struct smb2_transform_hdr) - > > 24; > > + unsigned int sg_len = rqst->rq_nvec + rqst->rq_npages; > > + unsigned int assoc_data_len = sizeof(struct smb2_transform_hdr) - > > 20; > > struct scatterlist *sg; > > unsigned int i; > > unsigned int j; > > @@ -2184,10 +2186,10 @@ init_sg(struct smb_rqst *rqst, u8 *sign) > > return NULL; > > > > sg_init_table(sg, sg_len); > > - smb2_sg_set_buf(&sg[0], rqst->rq_iov[0].iov_base + 24, > > assoc_data_len); > > - for (i = 1; i < rqst->rq_nvec; i++) > > - smb2_sg_set_buf(&sg[i], rqst->rq_iov[i].iov_base, > > - rqst->rq_iov[i].iov_len); > > + smb2_sg_set_buf(&sg[0], rqst->rq_iov[1].iov_base + 20, > > assoc_data_len); > > + for (i = 1; i < rqst->rq_nvec - 1; i++) > > + smb2_sg_set_buf(&sg[i], rqst->rq_iov[i+1].iov_base, > > + rqst->rq_iov[i+1].iov_len); > > for (j = 0; i < sg_len - 1; i++, j++) { > > unsigned int len = (j < rqst->rq_npages - 1) ? > > rqst->rq_pagesz > > : rqst->rq_tailsz; > > @@ -2219,9 +2221,10 @@ smb2_get_enc_key(struct TCP_Server_Info *server, > > __u64 ses_id, int enc, u8 *key) > > } > > /* > > * Encrypt or decrypt @rqst message. @rqst has the following format: > > - * iov[0] - transform header (associate data), > > - * iov[1-N] and pages - data to encrypt. > > - * On success return encrypted data in iov[1-N] and pages, leave iov[0] > > + * iov[0] - rfc1002 length > > + * iov[1] - transform header (associate data), > > + * iov[2-N] and pages - data to encrypt. > > + * On success return encrypted data in iov[2-N] and pages, leave iov[0-1] > > * untouched. > > */ > > static int > > @@ -2316,6 +2319,10 @@ crypt_message(struct TCP_Server_Info *server, struct > > smb_rqst *rqst, int enc) > > return rc; > > } > > > > +/* > > + * This is called from smb_send_rqst. At this point we have the rfc1002 > > + * header as the first element in the vector. > > + */ > > static int > > smb3_init_transform_rq(struct TCP_Server_Info *server, struct smb_rqst > > *new_rq, > > struct smb_rqst *old_rq) > > @@ -2324,6 +2331,7 @@ smb3_init_transform_rq(struct TCP_Server_Info > > *server, struct smb_rqst *new_rq, > > struct page **pages; > > struct smb2_transform_hdr *tr_hdr; > > unsigned int npages = old_rq->rq_npages; > > + unsigned int orig_len = > > get_rfc1002_length(old_rq->rq_iov[0].iov_base); > > int i; > > int rc = -ENOMEM; > > > > @@ -2342,24 +2350,34 @@ smb3_init_transform_rq(struct TCP_Server_Info > > *server, struct smb_rqst *new_rq, > > goto err_free_pages; > > } > > > > - iov = kmalloc_array(old_rq->rq_nvec, sizeof(struct kvec), > > GFP_KERNEL); > > + /* Make space for one extra iov to hold the transform header */ > > + iov = kmalloc_array(old_rq->rq_nvec + 1, sizeof(struct kvec), > > + GFP_KERNEL); > > if (!iov) > > goto err_free_pages; > > > > /* copy all iovs from the old except the 1st one (rfc1002 length) > > */ > > - memcpy(&iov[1], &old_rq->rq_iov[1], > > + memcpy(&iov[2], &old_rq->rq_iov[1], > > sizeof(struct kvec) * (old_rq->rq_nvec - > > 1)); > > + /* copy the rfc1002 iov */ > > + iov[0].iov_base = old_rq->rq_iov[0].iov_base; > > + iov[0].iov_len = old_rq->rq_iov[0].iov_len; > > + > > new_rq->rq_iov = iov; > > - new_rq->rq_nvec = old_rq->rq_nvec; > > + new_rq->rq_nvec = old_rq->rq_nvec + 1; > > > > tr_hdr = kmalloc(sizeof(struct smb2_transform_hdr), GFP_KERNEL); > > if (!tr_hdr) > > goto err_free_iov; > > > > - /* fill the 1st iov with a transform header */ > > - fill_transform_hdr(server, tr_hdr, old_rq); > > - new_rq->rq_iov[0].iov_base = tr_hdr; > > - new_rq->rq_iov[0].iov_len = sizeof(struct smb2_transform_hdr); > > + /* fill the 2nd iov with a transform header */ > > + fill_transform_hdr(tr_hdr, orig_len, old_rq); > > + new_rq->rq_iov[1].iov_base = tr_hdr; > > + new_rq->rq_iov[1].iov_len = sizeof(struct smb2_transform_hdr); > > + > > + /* Update rfc1002 header */ > > + inc_rfc1001_len(new_rq->rq_iov[0].iov_base, > > + sizeof(struct smb2_transform_hdr)); > > > > /* copy pages form the old */ > > for (i = 0; i < npages; i++) { > > @@ -2399,7 +2417,7 @@ smb3_free_transform_rq(struct smb_rqst *rqst) > > put_page(rqst->rq_pages[i]); > > kfree(rqst->rq_pages); > > /* free transform header */ > > - kfree(rqst->rq_iov[0].iov_base); > > + kfree(rqst->rq_iov[1].iov_base); > > kfree(rqst->rq_iov); > > } > > > > @@ -2416,18 +2434,19 @@ decrypt_raw_data(struct TCP_Server_Info *server, > > char *buf, > > unsigned int buf_data_size, struct page **pages, > > unsigned int npages, unsigned int page_data_size) > > { > > - struct kvec iov[2]; > > + struct kvec iov[3]; > > struct smb_rqst rqst = {NULL}; > > - struct smb2_hdr *hdr; > > int rc; > > > > - iov[0].iov_base = buf; > > - iov[0].iov_len = sizeof(struct smb2_transform_hdr); > > - iov[1].iov_base = buf + sizeof(struct smb2_transform_hdr); > > - iov[1].iov_len = buf_data_size; > > + iov[0].iov_base = NULL; > > + iov[0].iov_len = 0; > > + iov[1].iov_base = buf; > > + iov[1].iov_len = sizeof(struct smb2_transform_hdr); > > + iov[2].iov_base = buf + sizeof(struct smb2_transform_hdr); > > + iov[2].iov_len = buf_data_size; > > > > rqst.rq_iov = iov; > > - rqst.rq_nvec = 2; > > + rqst.rq_nvec = 3; > > rqst.rq_pages = pages; > > rqst.rq_npages = npages; > > rqst.rq_pagesz = PAGE_SIZE; > > @@ -2439,10 +2458,9 @@ decrypt_raw_data(struct TCP_Server_Info *server, > > char *buf, > > if (rc) > > return rc; > > > > - memmove(buf + server->vals->header_preamble_size, iov[1].iov_base, > > buf_data_size); > > - hdr = (struct smb2_hdr *)buf; > > - hdr->smb2_buf_length = cpu_to_be32(buf_data_size + page_data_size); > > - server->total_read = buf_data_size + page_data_size + > > server->vals->header_preamble_size; > > + memmove(buf + server->vals->header_preamble_size, iov[2].iov_base, > > buf_data_size); > > + > > + server->total_read = buf_data_size + page_data_size; > > > > return rc; > > } > > @@ -3196,8 +3214,8 @@ struct smb_version_values smb20_values = { > > .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK, > > .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK, > > .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK, > > - .header_size = sizeof(struct smb2_hdr), > > - .header_preamble_size = 4, > > + .header_size = sizeof(struct smb2_sync_hdr), > > + .header_preamble_size = 0, > > .max_header_size = MAX_SMB2_HDR_SIZE, > > .read_rsp_size = sizeof(struct smb2_read_rsp) - 1, > > .lock_cmd = SMB2_LOCK, > > @@ -3217,8 +3235,8 @@ struct smb_version_values smb21_values = { > > .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK, > > .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK, > > .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK, > > - .header_size = sizeof(struct smb2_hdr), > > - .header_preamble_size = 4, > > + .header_size = sizeof(struct smb2_sync_hdr), > > + .header_preamble_size = 0, > > .max_header_size = MAX_SMB2_HDR_SIZE, > > .read_rsp_size = sizeof(struct smb2_read_rsp) - 1, > > .lock_cmd = SMB2_LOCK, > > @@ -3238,8 +3256,8 @@ struct smb_version_values smb3any_values = { > > .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK, > > .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK, > > .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK, > > - .header_size = sizeof(struct smb2_hdr), > > - .header_preamble_size = 4, > > + .header_size = sizeof(struct smb2_sync_hdr), > > + .header_preamble_size = 0, > > .max_header_size = MAX_SMB2_HDR_SIZE, > > .read_rsp_size = sizeof(struct smb2_read_rsp) - 1, > > .lock_cmd = SMB2_LOCK, > > @@ -3259,8 +3277,8 @@ struct smb_version_values smbdefault_values = { > > .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK, > > .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK, > > .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK, > > - .header_size = sizeof(struct smb2_hdr), > > - .header_preamble_size = 4, > > + .header_size = sizeof(struct smb2_sync_hdr), > > + .header_preamble_size = 0, > > .max_header_size = MAX_SMB2_HDR_SIZE, > > .read_rsp_size = sizeof(struct smb2_read_rsp) - 1, > > .lock_cmd = SMB2_LOCK, > > @@ -3280,8 +3298,8 @@ struct smb_version_values smb30_values = { > > .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK, > > .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK, > > .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK, > > - .header_size = sizeof(struct smb2_hdr), > > - .header_preamble_size = 4, > > + .header_size = sizeof(struct smb2_sync_hdr), > > + .header_preamble_size = 0, > > .max_header_size = MAX_SMB2_HDR_SIZE, > > .read_rsp_size = sizeof(struct smb2_read_rsp) - 1, > > .lock_cmd = SMB2_LOCK, > > @@ -3301,8 +3319,8 @@ struct smb_version_values smb302_values = { > > .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK, > > .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK, > > .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK, > > - .header_size = sizeof(struct smb2_hdr), > > - .header_preamble_size = 4, > > + .header_size = sizeof(struct smb2_sync_hdr), > > + .header_preamble_size = 0, > > .max_header_size = MAX_SMB2_HDR_SIZE, > > .read_rsp_size = sizeof(struct smb2_read_rsp) - 1, > > .lock_cmd = SMB2_LOCK, > > @@ -3323,8 +3341,8 @@ struct smb_version_values smb311_values = { > > .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK, > > .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK, > > .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK, > > - .header_size = sizeof(struct smb2_hdr), > > - .header_preamble_size = 4, > > + .header_size = sizeof(struct smb2_sync_hdr), > > + .header_preamble_size = 0, > > .max_header_size = MAX_SMB2_HDR_SIZE, > > .read_rsp_size = sizeof(struct smb2_read_rsp) - 1, > > .lock_cmd = SMB2_LOCK, > > diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c > > index fd9cc24b86a2..c5f24c71c10d 100644 > > --- a/fs/cifs/smb2pdu.c > > +++ b/fs/cifs/smb2pdu.c > > @@ -465,12 +465,12 @@ static int decode_encrypt_ctx(struct TCP_Server_Info > > *server, > > } > > > > static int smb311_decode_neg_context(struct smb2_negotiate_rsp *rsp, > > - struct TCP_Server_Info *server) > > + struct TCP_Server_Info *server, > > + unsigned int len_of_smb) > > { > > struct smb2_neg_context *pctx; > > unsigned int offset = le32_to_cpu(rsp->NegotiateContextOffset); > > unsigned int ctxt_cnt = le16_to_cpu(rsp->NegotiateContextCount); > > - unsigned int len_of_smb = be32_to_cpu(rsp->hdr.smb2_buf_length); > > unsigned int len_of_ctxts, i; > > int rc = 0; > > > > @@ -736,7 +736,8 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses > > *ses) > > #ifdef CONFIG_CIFS_SMB311 > > if (rsp->DialectRevision == cpu_to_le16(SMB311_PROT_ID)) { > > if (rsp->NegotiateContextCount) > > - rc = smb311_decode_neg_context(rsp, server); > > + rc = smb311_decode_neg_context(rsp, server, > > + rsp_iov.iov_len); > > else > > cifs_dbg(VFS, "Missing expected negotiate > > contexts\n"); > > } > > @@ -2014,7 +2015,6 @@ SMB2_ioctl(const unsigned int xid, struct cifs_tcon > > *tcon, u64 persistent_fid, > > { > > struct smb2_ioctl_req *req; > > struct smb2_ioctl_rsp *rsp; > > - struct smb2_sync_hdr *shdr; > > struct cifs_ses *ses; > > struct kvec iov[2]; > > struct kvec rsp_iov; > > @@ -2139,7 +2139,7 @@ SMB2_ioctl(const unsigned int xid, struct cifs_tcon > > *tcon, u64 persistent_fid, > > goto ioctl_exit; > > } > > > > - if (get_rfc1002_length(rsp) < le32_to_cpu(rsp->OutputOffset) + > > *plen) { > > + if (rsp_iov.iov_len < le32_to_cpu(rsp->OutputOffset) + *plen) { > > cifs_dbg(VFS, "Malformed ioctl resp: len %d offset %d\n", > > *plen, > > le32_to_cpu(rsp->OutputOffset)); > > *plen = 0; > > @@ -2153,8 +2153,7 @@ SMB2_ioctl(const unsigned int xid, struct cifs_tcon > > *tcon, u64 persistent_fid, > > goto ioctl_exit; > > } > > > > - shdr = get_sync_hdr(rsp); > > - memcpy(*out_data, (char *)shdr + le32_to_cpu(rsp->OutputOffset), > > *plen); > > + memcpy(*out_data, (char *)rsp + le32_to_cpu(rsp->OutputOffset), > > *plen); > > ioctl_exit: > > free_rsp_buf(resp_buftype, rsp); > > return rc; > > @@ -2695,7 +2694,7 @@ smb2_readv_callback(struct mid_q_entry *mid) > > struct cifs_tcon *tcon = tlink_tcon(rdata->cfile->tlink); > > struct TCP_Server_Info *server = tcon->ses->server; > > struct smb2_sync_hdr *shdr = > > - (struct smb2_sync_hdr > > *)rdata->iov[1].iov_base; > > + (struct smb2_sync_hdr > > *)rdata->iov[0].iov_base; > > unsigned int credits_received = 1; > > struct smb_rqst rqst = { .rq_iov = rdata->iov, > > .rq_nvec = 2, > > @@ -2847,7 +2846,6 @@ SMB2_read(const unsigned int xid, struct > > cifs_io_parms *io_parms, > > int resp_buftype, rc = -EACCES; > > struct smb2_read_plain_req *req = NULL; > > struct smb2_read_rsp *rsp = NULL; > > - struct smb2_sync_hdr *shdr; > > struct kvec iov[1]; > > struct kvec rsp_iov; > > unsigned int total_len; > > @@ -2894,10 +2892,8 @@ SMB2_read(const unsigned int xid, struct > > cifs_io_parms *io_parms, > > *nbytes = 0; > > } > > > > - shdr = get_sync_hdr(rsp); > > - > > if (*buf) { > > - memcpy(*buf, (char *)shdr + rsp->DataOffset, *nbytes); > > + memcpy(*buf, (char *)rsp + rsp->DataOffset, *nbytes); > > free_rsp_buf(resp_buftype, rsp_iov.iov_base); > > } else if (resp_buftype != CIFS_NO_BUFFER) { > > *buf = rsp_iov.iov_base; > > @@ -3339,10 +3335,9 @@ SMB2_query_directory(const unsigned int xid, struct > > cifs_tcon *tcon, > > cifs_buf_release(srch_inf->ntwrk_buf_start); > > } > > srch_inf->ntwrk_buf_start = (char *)rsp; > > - srch_inf->srch_entries_start = srch_inf->last_entry = 4 /* rfclen > > */ + > > - (char *)&rsp->hdr + le16_to_cpu(rsp->OutputBufferOffset); > > - /* 4 for rfc1002 length field */ > > - end_of_smb = get_rfc1002_length(rsp) + 4 + (char *)&rsp->hdr; > > + srch_inf->srch_entries_start = srch_inf->last_entry = > > + (char *)rsp + le16_to_cpu(rsp->OutputBufferOffset); > > + end_of_smb = rsp_iov.iov_len + (char *)rsp; > > srch_inf->entries_in_buffer = > > num_entries(srch_inf->srch_entries_start, > > end_of_smb, > > &srch_inf->last_entry, info_buf_size); > > diff --git a/fs/cifs/smb2pdu.h b/fs/cifs/smb2pdu.h > > index 853e5a707276..6ef786519be8 100644 > > --- a/fs/cifs/smb2pdu.h > > +++ b/fs/cifs/smb2pdu.h > > @@ -123,9 +123,6 @@ struct smb2_sync_pdu { > > } __packed; > > > > struct smb2_hdr { > > - __be32 smb2_buf_length; /* big endian on wire */ > > - /* length is only two or three bytes - with > > */ > > - /* one or two byte type preceding it that > > MBZ */ > > struct smb2_sync_hdr sync_hdr; > > } __packed; > > > > @@ -138,9 +135,6 @@ struct smb2_pdu { > > #define SMB3_AES128GCM_NONCE 12 > > > > struct smb2_transform_hdr { > > - __be32 smb2_buf_length; /* big endian on wire */ > > - /* length is only two or three bytes - with > > - one or two byte type preceding it that MBZ > > */ > > __le32 ProtocolId; /* 0xFD 'S' 'M' 'B' */ > > __u8 Signature[16]; > > __u8 Nonce[16]; > > diff --git a/fs/cifs/smb2transport.c b/fs/cifs/smb2transport.c > > index 8806f3f76c1d..2c671123a6bf 100644 > > --- a/fs/cifs/smb2transport.c > > +++ b/fs/cifs/smb2transport.c > > @@ -480,7 +480,7 @@ smb2_verify_signature(struct smb_rqst *rqst, struct > > TCP_Server_Info *server) > > unsigned int rc; > > char server_response_sig[16]; > > struct smb2_sync_hdr *shdr = > > - (struct smb2_sync_hdr *)rqst->rq_iov[1].iov_base; > > + (struct smb2_sync_hdr *)rqst->rq_iov[0].iov_base; > > > > if ((shdr->Command == SMB2_NEGOTIATE) || > > (shdr->Command == SMB2_SESSION_SETUP) || > > @@ -605,14 +605,12 @@ smb2_check_receive(struct mid_q_entry *mid, struct > > TCP_Server_Info *server, > > bool log_error) > > { > > unsigned int len = mid->resp_buf_size; > > - struct kvec iov[2]; > > + struct kvec iov[1]; > > struct smb_rqst rqst = { .rq_iov = iov, > > - .rq_nvec = 2 }; > > + .rq_nvec = 1 }; > > > > iov[0].iov_base = (char *)mid->resp_buf; > > - iov[0].iov_len = 4; > > - iov[1].iov_base = (char *)mid->resp_buf + 4; > > - iov[1].iov_len = len; > > + iov[0].iov_len = len; > > > > dump_smb(mid->resp_buf, min_t(u32, 80, len)); > > /* convert the length into a more usable form */ > > -- > > 2.13.3 > > > > > > -- > Thanks, > > Steve > -- > To unsubscribe from this list: send the line "unsubscribe linux-cifs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > --- To unsubscribe from this list: send the line "unsubscribe linux-cifs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c index 927226a2122f..e7254e386b79 100644 --- a/fs/cifs/transport.c +++ b/fs/cifs/transport.c @@ -800,8 +800,8 @@ cifs_send_recv(const unsigned int xid, struct cifs_ses *ses, #ifdef CONFIG_CIFS_SMB311 if ((ses->status == CifsNew) || (optype & CIFS_NEG_OP)) { struct kvec iov = { - .iov_base = buf + 4, - .iov_len = get_rfc1002_length(buf) + .iov_base = buf, + .iov_len = midQ->resp_buf_size }; smb311_update_preauth_hash(ses, &iov, 1); }