aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/cifs/smb2misc.c11
-rw-r--r--fs/cifs/smb2pdu.c3
2 files changed, 9 insertions, 5 deletions
diff --git a/fs/cifs/smb2misc.c b/fs/cifs/smb2misc.c
index 9df9f0b48160..68ea8491c160 100644
--- a/fs/cifs/smb2misc.c
+++ b/fs/cifs/smb2misc.c
@@ -94,7 +94,8 @@ static const __le16 smb2_rsp_struct_sizes[NUMBER_OF_SMB2_COMMANDS] = {
94}; 94};
95 95
96#ifdef CONFIG_CIFS_SMB311 96#ifdef CONFIG_CIFS_SMB311
97static __u32 get_neg_ctxt_len(struct smb2_hdr *hdr, __u32 len, __u32 non_ctxlen) 97static __u32 get_neg_ctxt_len(struct smb2_hdr *hdr, __u32 len, __u32 non_ctxlen,
98 size_t hdr_preamble_size)
98{ 99{
99 __u16 neg_count; 100 __u16 neg_count;
100 __u32 nc_offset, size_of_pad_before_neg_ctxts; 101 __u32 nc_offset, size_of_pad_before_neg_ctxts;
@@ -108,11 +109,12 @@ static __u32 get_neg_ctxt_len(struct smb2_hdr *hdr, __u32 len, __u32 non_ctxlen)
108 109
109 /* Make sure that negotiate contexts start after gss security blob */ 110 /* Make sure that negotiate contexts start after gss security blob */
110 nc_offset = le32_to_cpu(pneg_rsp->NegotiateContextOffset); 111 nc_offset = le32_to_cpu(pneg_rsp->NegotiateContextOffset);
111 if (nc_offset < non_ctxlen - 4 /* RFC1001 len field */) { 112 if (nc_offset < non_ctxlen - hdr_preamble_size /* RFC1001 len */) {
112 printk_once(KERN_WARNING "invalid negotiate context offset\n"); 113 printk_once(KERN_WARNING "invalid negotiate context offset\n");
113 return 0; 114 return 0;
114 } 115 }
115 size_of_pad_before_neg_ctxts = nc_offset - (non_ctxlen - 4); 116 size_of_pad_before_neg_ctxts = nc_offset -
117 (non_ctxlen - hdr_preamble_size);
116 118
117 /* Verify that at least minimal negotiate contexts fit within frame */ 119 /* Verify that at least minimal negotiate contexts fit within frame */
118 if (len < nc_offset + (neg_count * sizeof(struct smb2_neg_context))) { 120 if (len < nc_offset + (neg_count * sizeof(struct smb2_neg_context))) {
@@ -235,7 +237,8 @@ smb2_check_message(char *buf, unsigned int length, struct TCP_Server_Info *srvr)
235 237
236#ifdef CONFIG_CIFS_SMB311 238#ifdef CONFIG_CIFS_SMB311
237 if (shdr->Command == SMB2_NEGOTIATE) 239 if (shdr->Command == SMB2_NEGOTIATE)
238 clc_len += get_neg_ctxt_len(hdr, len, clc_len); 240 clc_len += get_neg_ctxt_len(hdr, len, clc_len,
241 srvr->vals->header_preamble_size);
239#endif /* SMB311 */ 242#endif /* SMB311 */
240 if (srvr->vals->header_preamble_size + len != clc_len) { 243 if (srvr->vals->header_preamble_size + len != clc_len) {
241 cifs_dbg(FYI, "Calculated size %u length %zu mismatch mid %llu\n", 244 cifs_dbg(FYI, "Calculated size %u length %zu mismatch mid %llu\n",
diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
index 5cbdddcafaec..be44c5c3e77e 100644
--- a/fs/cifs/smb2pdu.c
+++ b/fs/cifs/smb2pdu.c
@@ -474,7 +474,8 @@ static int smb311_decode_neg_context(struct smb2_negotiate_rsp *rsp,
474 if (len_of_ctxts < sizeof(struct smb2_neg_context)) 474 if (len_of_ctxts < sizeof(struct smb2_neg_context))
475 break; 475 break;
476 476
477 pctx = (struct smb2_neg_context *)(offset + 4 + (char *)rsp); 477 pctx = (struct smb2_neg_context *)(offset +
478 server->vals->header_preamble_size + (char *)rsp);
478 clen = le16_to_cpu(pctx->DataLength); 479 clen = le16_to_cpu(pctx->DataLength);
479 if (clen > len_of_ctxts) 480 if (clen > len_of_ctxts)
480 break; 481 break;