Skip to content

Commit 1fc6ad2

Browse files
Ronnie Sahlbergsmfrench
authored andcommitted
cifs: remove header_preamble_size where it is always 0
Since header_preamble_size is 0 for SMB2+ we can remove it in those code paths that are only invoked from SMB2. Signed-off-by: Ronnie Sahlberg <[email protected]> Signed-off-by: Steve French <[email protected]>
1 parent 49f466b commit 1fc6ad2

File tree

3 files changed

+48
-68
lines changed

3 files changed

+48
-68
lines changed

fs/cifs/smb2misc.c

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,7 @@ static const __le16 smb2_rsp_struct_sizes[NUMBER_OF_SMB2_COMMANDS] = {
9595

9696
#ifdef CONFIG_CIFS_SMB311
9797
static __u32 get_neg_ctxt_len(struct smb2_sync_hdr *hdr, __u32 len,
98-
__u32 non_ctxlen,
99-
size_t hdr_preamble_size)
98+
__u32 non_ctxlen)
10099
{
101100
__u16 neg_count;
102101
__u32 nc_offset, size_of_pad_before_neg_ctxts;
@@ -110,12 +109,11 @@ static __u32 get_neg_ctxt_len(struct smb2_sync_hdr *hdr, __u32 len,
110109

111110
/* Make sure that negotiate contexts start after gss security blob */
112111
nc_offset = le32_to_cpu(pneg_rsp->NegotiateContextOffset);
113-
if (nc_offset < non_ctxlen - hdr_preamble_size /* RFC1001 len */) {
112+
if (nc_offset < non_ctxlen) {
114113
printk_once(KERN_WARNING "invalid negotiate context offset\n");
115114
return 0;
116115
}
117-
size_of_pad_before_neg_ctxts = nc_offset -
118-
(non_ctxlen - hdr_preamble_size);
116+
size_of_pad_before_neg_ctxts = nc_offset - non_ctxlen;
119117

120118
/* Verify that at least minimal negotiate contexts fit within frame */
121119
if (len < nc_offset + (neg_count * sizeof(struct smb2_neg_context))) {
@@ -134,7 +132,7 @@ static __u32 get_neg_ctxt_len(struct smb2_sync_hdr *hdr, __u32 len,
134132
int
135133
smb2_check_message(char *buf, unsigned int len, struct TCP_Server_Info *srvr)
136134
{
137-
struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)(buf + srvr->vals->header_preamble_size);
135+
struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buf;
138136
struct smb2_sync_pdu *pdu = (struct smb2_sync_pdu *)shdr;
139137
__u64 mid;
140138
__u32 clc_len; /* calculated length */
@@ -183,8 +181,7 @@ smb2_check_message(char *buf, unsigned int len, struct TCP_Server_Info *srvr)
183181
}
184182
return 1;
185183
}
186-
if (len > CIFSMaxBufSize + MAX_SMB2_HDR_SIZE -
187-
srvr->vals->header_preamble_size) {
184+
if (len > CIFSMaxBufSize + MAX_SMB2_HDR_SIZE) {
188185
cifs_dbg(VFS, "SMB length greater than maximum, mid=%llu\n",
189186
mid);
190187
return 1;
@@ -227,8 +224,7 @@ smb2_check_message(char *buf, unsigned int len, struct TCP_Server_Info *srvr)
227224

228225
#ifdef CONFIG_CIFS_SMB311
229226
if (shdr->Command == SMB2_NEGOTIATE)
230-
clc_len += get_neg_ctxt_len(shdr, len, clc_len,
231-
srvr->vals->header_preamble_size);
227+
clc_len += get_neg_ctxt_len(shdr, len, clc_len);
232228
#endif /* SMB311 */
233229
if (len != clc_len) {
234230
cifs_dbg(FYI, "Calculated size %u length %u mismatch mid %llu\n",
@@ -253,7 +249,7 @@ smb2_check_message(char *buf, unsigned int len, struct TCP_Server_Info *srvr)
253249
*/
254250
if (clc_len < len) {
255251
printk_once(KERN_WARNING
256-
"SMB2 server sent bad RFC1001 len %d not %u\n",
252+
"SMB2 server sent bad RFC1001 len %d not %d\n",
257253
len, clc_len);
258254
return 0;
259255
}
@@ -401,7 +397,7 @@ smb2_calc_size(void *buf, struct TCP_Server_Info *srvr)
401397
int offset; /* the offset from the beginning of SMB to data area */
402398
int data_length; /* the length of the variable length data area */
403399
/* Structure Size has already been checked to make sure it is 64 */
404-
int len = srvr->vals->header_preamble_size + le16_to_cpu(shdr->StructureSize);
400+
int len = le16_to_cpu(shdr->StructureSize);
405401

406402
/*
407403
* StructureSize2, ie length of fixed parameter area has already
@@ -422,12 +418,12 @@ smb2_calc_size(void *buf, struct TCP_Server_Info *srvr)
422418
* for some commands, typically those with odd StructureSize,
423419
* so we must add one to the calculation.
424420
*/
425-
if (offset + srvr->vals->header_preamble_size + 1 < len) {
426-
cifs_dbg(VFS, "data area offset %zu overlaps SMB2 header %d\n",
427-
offset + srvr->vals->header_preamble_size + 1, len);
421+
if (offset + 1 < len) {
422+
cifs_dbg(VFS, "data area offset %d overlaps SMB2 header %d\n",
423+
offset + 1, len);
428424
data_length = 0;
429425
} else {
430-
len = srvr->vals->header_preamble_size + offset + data_length;
426+
len = offset + data_length;
431427
}
432428
}
433429
calc_size_exit:

fs/cifs/smb2ops.c

Lines changed: 18 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1521,8 +1521,6 @@ smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon,
15211521
unsigned int sub_offset;
15221522
unsigned int print_len;
15231523
unsigned int print_offset;
1524-
struct cifs_ses *ses = tcon->ses;
1525-
struct TCP_Server_Info *server = ses->server;
15261524

15271525
cifs_dbg(FYI, "%s: path: %s\n", __func__, full_path);
15281526

@@ -1546,7 +1544,7 @@ smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon,
15461544

15471545
err_buf = err_iov.iov_base;
15481546
if (le32_to_cpu(err_buf->ByteCount) < sizeof(struct smb2_symlink_err_rsp) ||
1549-
err_iov.iov_len + server->vals->header_preamble_size < SMB2_SYMLINK_STRUCT_SIZE) {
1547+
err_iov.iov_len < SMB2_SYMLINK_STRUCT_SIZE) {
15501548
kfree(utf16_path);
15511549
return -ENOENT;
15521550
}
@@ -1559,14 +1557,13 @@ smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon,
15591557
print_len = le16_to_cpu(symlink->PrintNameLength);
15601558
print_offset = le16_to_cpu(symlink->PrintNameOffset);
15611559

1562-
if (err_iov.iov_len + server->vals->header_preamble_size <
1563-
SMB2_SYMLINK_STRUCT_SIZE + sub_offset + sub_len) {
1560+
if (err_iov.iov_len < SMB2_SYMLINK_STRUCT_SIZE + sub_offset + sub_len) {
15641561
kfree(utf16_path);
15651562
return -ENOENT;
15661563
}
15671564

1568-
if (err_iov.iov_len + server->vals->header_preamble_size <
1569-
SMB2_SYMLINK_STRUCT_SIZE + print_offset + print_len) {
1565+
if (err_iov.iov_len <
1566+
SMB2_SYMLINK_STRUCT_SIZE + print_offset + print_len) {
15701567
kfree(utf16_path);
15711568
return -ENOENT;
15721569
}
@@ -2233,7 +2230,7 @@ crypt_message(struct TCP_Server_Info *server, struct smb_rqst *rqst, int enc)
22332230
{
22342231
struct smb2_transform_hdr *tr_hdr =
22352232
(struct smb2_transform_hdr *)rqst->rq_iov[0].iov_base;
2236-
unsigned int assoc_data_len = sizeof(struct smb2_transform_hdr) - 20 - server->vals->header_preamble_size;
2233+
unsigned int assoc_data_len = sizeof(struct smb2_transform_hdr) - 20;
22372234
int rc = 0;
22382235
struct scatterlist *sg;
22392236
u8 sign[SMB2_SIGNATURE_SIZE] = {};
@@ -2459,7 +2456,7 @@ decrypt_raw_data(struct TCP_Server_Info *server, char *buf,
24592456
if (rc)
24602457
return rc;
24612458

2462-
memmove(buf + server->vals->header_preamble_size, iov[2].iov_base, buf_data_size);
2459+
memmove(buf, iov[2].iov_base, buf_data_size);
24632460

24642461
server->total_read = buf_data_size + page_data_size;
24652462

@@ -2565,7 +2562,7 @@ handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid,
25652562
return 0;
25662563
}
25672564

2568-
data_offset = server->ops->read_data_offset(buf) + server->vals->header_preamble_size;
2565+
data_offset = server->ops->read_data_offset(buf);
25692566
#ifdef CONFIG_CIFS_SMB_DIRECT
25702567
use_rdma_mr = rdata->mr;
25712568
#endif
@@ -2661,21 +2658,19 @@ receive_encrypted_read(struct TCP_Server_Info *server, struct mid_q_entry **mid)
26612658
unsigned int npages;
26622659
struct page **pages;
26632660
unsigned int len;
2664-
unsigned int buflen = server->pdu_size + server->vals->header_preamble_size;
2661+
unsigned int buflen = server->pdu_size;
26652662
int rc;
26662663
int i = 0;
26672664

2668-
len = min_t(unsigned int, buflen, server->vals->read_rsp_size -
2669-
server->vals->header_preamble_size +
2665+
len = min_t(unsigned int, buflen, server->vals->read_rsp_size +
26702666
sizeof(struct smb2_transform_hdr)) - HEADER_SIZE(server) + 1;
26712667

26722668
rc = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1, len);
26732669
if (rc < 0)
26742670
return rc;
26752671
server->total_read += rc;
26762672

2677-
len = le32_to_cpu(tr_hdr->OriginalMessageSize) +
2678-
server->vals->header_preamble_size -
2673+
len = le32_to_cpu(tr_hdr->OriginalMessageSize) -
26792674
server->vals->read_rsp_size;
26802675
npages = DIV_ROUND_UP(len, PAGE_SIZE);
26812676

@@ -2702,8 +2697,7 @@ receive_encrypted_read(struct TCP_Server_Info *server, struct mid_q_entry **mid)
27022697
if (rc)
27032698
goto free_pages;
27042699

2705-
rc = decrypt_raw_data(server, buf, server->vals->read_rsp_size -
2706-
server->vals->header_preamble_size,
2700+
rc = decrypt_raw_data(server, buf, server->vals->read_rsp_size,
27072701
pages, npages, len);
27082702
if (rc)
27092703
goto free_pages;
@@ -2740,21 +2734,20 @@ receive_encrypted_standard(struct TCP_Server_Info *server,
27402734
struct mid_q_entry *mid_entry;
27412735

27422736
/* switch to large buffer if too big for a small one */
2743-
if (pdu_length + server->vals->header_preamble_size > MAX_CIFS_SMALL_BUFFER_SIZE) {
2737+
if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE) {
27442738
server->large_buf = true;
27452739
memcpy(server->bigbuf, buf, server->total_read);
27462740
buf = server->bigbuf;
27472741
}
27482742

27492743
/* now read the rest */
27502744
length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
2751-
pdu_length - HEADER_SIZE(server) + 1 +
2752-
server->vals->header_preamble_size);
2745+
pdu_length - HEADER_SIZE(server) + 1);
27532746
if (length < 0)
27542747
return length;
27552748
server->total_read += length;
27562749

2757-
buf_size = pdu_length + server->vals->header_preamble_size - sizeof(struct smb2_transform_hdr);
2750+
buf_size = pdu_length - sizeof(struct smb2_transform_hdr);
27582751
length = decrypt_raw_data(server, buf, buf_size, NULL, 0, 0);
27592752
if (length)
27602753
return length;
@@ -2783,7 +2776,7 @@ smb3_receive_transform(struct TCP_Server_Info *server, struct mid_q_entry **mid)
27832776
struct smb2_transform_hdr *tr_hdr = (struct smb2_transform_hdr *)buf;
27842777
unsigned int orig_len = le32_to_cpu(tr_hdr->OriginalMessageSize);
27852778

2786-
if (pdu_length + server->vals->header_preamble_size < sizeof(struct smb2_transform_hdr) +
2779+
if (pdu_length < sizeof(struct smb2_transform_hdr) +
27872780
sizeof(struct smb2_sync_hdr)) {
27882781
cifs_dbg(VFS, "Transform message is too small (%u)\n",
27892782
pdu_length);
@@ -2792,14 +2785,14 @@ smb3_receive_transform(struct TCP_Server_Info *server, struct mid_q_entry **mid)
27922785
return -ECONNABORTED;
27932786
}
27942787

2795-
if (pdu_length + server->vals->header_preamble_size < orig_len + sizeof(struct smb2_transform_hdr)) {
2788+
if (pdu_length < orig_len + sizeof(struct smb2_transform_hdr)) {
27962789
cifs_dbg(VFS, "Transform message is broken\n");
27972790
cifs_reconnect(server);
27982791
wake_up(&server->response_q);
27992792
return -ECONNABORTED;
28002793
}
28012794

2802-
if (pdu_length + server->vals->header_preamble_size > CIFSMaxBufSize + MAX_HEADER_SIZE(server))
2795+
if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server))
28032796
return receive_encrypted_read(server, mid);
28042797

28052798
return receive_encrypted_standard(server, mid);
@@ -2810,8 +2803,7 @@ smb3_handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid)
28102803
{
28112804
char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
28122805

2813-
return handle_read_data(server, mid, buf, server->pdu_size +
2814-
server->vals->header_preamble_size,
2806+
return handle_read_data(server, mid, buf, server->pdu_size,
28152807
NULL, 0, 0);
28162808
}
28172809

fs/cifs/smb2pdu.c

Lines changed: 18 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -491,8 +491,7 @@ static int smb311_decode_neg_context(struct smb2_negotiate_rsp *rsp,
491491
if (len_of_ctxts < sizeof(struct smb2_neg_context))
492492
break;
493493

494-
pctx = (struct smb2_neg_context *)(offset +
495-
server->vals->header_preamble_size + (char *)rsp);
494+
pctx = (struct smb2_neg_context *)(offset + (char *)rsp);
496495
clen = le16_to_cpu(pctx->DataLength);
497496
if (clen > len_of_ctxts)
498497
break;
@@ -1213,7 +1212,7 @@ SMB2_sess_auth_rawntlmssp_negotiate(struct SMB2_sess_data *sess_data)
12131212
if (rc)
12141213
goto out;
12151214

1216-
if (offsetof(struct smb2_sess_setup_rsp, Buffer) - ses->server->vals->header_preamble_size !=
1215+
if (offsetof(struct smb2_sess_setup_rsp, Buffer) !=
12171216
le16_to_cpu(rsp->SecurityBufferOffset)) {
12181217
cifs_dbg(VFS, "Invalid security buffer offset %d\n",
12191218
le16_to_cpu(rsp->SecurityBufferOffset));
@@ -1661,7 +1660,7 @@ parse_lease_state(struct TCP_Server_Info *server, struct smb2_create_rsp *rsp,
16611660
unsigned int remaining;
16621661
char *name;
16631662

1664-
data_offset = (char *)rsp + server->vals->header_preamble_size + le32_to_cpu(rsp->CreateContextsOffset);
1663+
data_offset = (char *)rsp + le32_to_cpu(rsp->CreateContextsOffset);
16651664
remaining = le32_to_cpu(rsp->CreateContextsLength);
16661665
cc = (struct create_context *)data_offset;
16671666
while (remaining >= sizeof(struct create_context)) {
@@ -2327,13 +2326,12 @@ SMB2_close(const unsigned int xid, struct cifs_tcon *tcon,
23272326
}
23282327

23292328
static int
2330-
validate_iov(struct TCP_Server_Info *server,
2331-
unsigned int offset, unsigned int buffer_length,
2329+
validate_iov(unsigned int offset, unsigned int buffer_length,
23322330
struct kvec *iov, unsigned int min_buf_size)
23332331
{
23342332
unsigned int smb_len = iov->iov_len;
2335-
char *end_of_smb = smb_len + server->vals->header_preamble_size + (char *)iov->iov_base;
2336-
char *begin_of_buf = server->vals->header_preamble_size + offset + (char *)iov->iov_base;
2333+
char *end_of_smb = smb_len + (char *)iov->iov_base;
2334+
char *begin_of_buf = offset + (char *)iov->iov_base;
23372335
char *end_of_buf = begin_of_buf + buffer_length;
23382336

23392337

@@ -2363,18 +2361,17 @@ validate_iov(struct TCP_Server_Info *server,
23632361
* Caller must free buffer.
23642362
*/
23652363
static int
2366-
validate_and_copy_iov(struct TCP_Server_Info *server,
2367-
unsigned int offset, unsigned int buffer_length,
2364+
validate_and_copy_iov(unsigned int offset, unsigned int buffer_length,
23682365
struct kvec *iov, unsigned int minbufsize,
23692366
char *data)
23702367
{
2371-
char *begin_of_buf = server->vals->header_preamble_size + offset + (char *)(iov->iov_base);
2368+
char *begin_of_buf = offset + (char *)iov->iov_base;
23722369
int rc;
23732370

23742371
if (!data)
23752372
return -EINVAL;
23762373

2377-
rc = validate_iov(server, offset, buffer_length, iov, minbufsize);
2374+
rc = validate_iov(offset, buffer_length, iov, minbufsize);
23782375
if (rc)
23792376
return rc;
23802377

@@ -2454,8 +2451,7 @@ query_info(const unsigned int xid, struct cifs_tcon *tcon,
24542451
}
24552452
}
24562453

2457-
rc = validate_and_copy_iov(ses->server,
2458-
le16_to_cpu(rsp->OutputBufferOffset),
2454+
rc = validate_and_copy_iov(le16_to_cpu(rsp->OutputBufferOffset),
24592455
le32_to_cpu(rsp->OutputBufferLength),
24602456
&rsp_iov, min_len, *data);
24612457

@@ -3406,8 +3402,7 @@ SMB2_query_directory(const unsigned int xid, struct cifs_tcon *tcon,
34063402
goto qdir_exit;
34073403
}
34083404

3409-
rc = validate_iov(server,
3410-
le16_to_cpu(rsp->OutputBufferOffset),
3405+
rc = validate_iov(le16_to_cpu(rsp->OutputBufferOffset),
34113406
le32_to_cpu(rsp->OutputBufferLength), &rsp_iov,
34123407
info_buf_size);
34133408
if (rc)
@@ -3742,7 +3737,7 @@ build_qfs_info_req(struct kvec *iov, struct cifs_tcon *tcon, int level,
37423737
req->InputBufferOffset =
37433738
cpu_to_le16(sizeof(struct smb2_query_info_req) - 1);
37443739
req->OutputBufferLength = cpu_to_le32(
3745-
outbuf_len + sizeof(struct smb2_query_info_rsp) - 1 - server->vals->header_preamble_size);
3740+
outbuf_len + sizeof(struct smb2_query_info_rsp) - 1);
37463741

37473742
iov->iov_base = (char *)req;
37483743
iov->iov_len = total_len;
@@ -3759,7 +3754,6 @@ SMB2_QFS_info(const unsigned int xid, struct cifs_tcon *tcon,
37593754
int rc = 0;
37603755
int resp_buftype;
37613756
struct cifs_ses *ses = tcon->ses;
3762-
struct TCP_Server_Info *server = ses->server;
37633757
struct smb2_fs_full_size_info *info = NULL;
37643758
int flags = 0;
37653759

@@ -3780,10 +3774,9 @@ SMB2_QFS_info(const unsigned int xid, struct cifs_tcon *tcon,
37803774
}
37813775
rsp = (struct smb2_query_info_rsp *)rsp_iov.iov_base;
37823776

3783-
info = (struct smb2_fs_full_size_info *)(server->vals->header_preamble_size +
3777+
info = (struct smb2_fs_full_size_info *)(
37843778
le16_to_cpu(rsp->OutputBufferOffset) + (char *)rsp);
3785-
rc = validate_iov(server,
3786-
le16_to_cpu(rsp->OutputBufferOffset),
3779+
rc = validate_iov(le16_to_cpu(rsp->OutputBufferOffset),
37873780
le32_to_cpu(rsp->OutputBufferLength), &rsp_iov,
37883781
sizeof(struct smb2_fs_full_size_info));
37893782
if (!rc)
@@ -3804,7 +3797,6 @@ SMB2_QFS_attr(const unsigned int xid, struct cifs_tcon *tcon,
38043797
int rc = 0;
38053798
int resp_buftype, max_len, min_len;
38063799
struct cifs_ses *ses = tcon->ses;
3807-
struct TCP_Server_Info *server = ses->server;
38083800
unsigned int rsp_len, offset;
38093801
int flags = 0;
38103802

@@ -3840,20 +3832,20 @@ SMB2_QFS_attr(const unsigned int xid, struct cifs_tcon *tcon,
38403832

38413833
rsp_len = le32_to_cpu(rsp->OutputBufferLength);
38423834
offset = le16_to_cpu(rsp->OutputBufferOffset);
3843-
rc = validate_iov(server, offset, rsp_len, &rsp_iov, min_len);
3835+
rc = validate_iov(offset, rsp_len, &rsp_iov, min_len);
38443836
if (rc)
38453837
goto qfsattr_exit;
38463838

38473839
if (level == FS_ATTRIBUTE_INFORMATION)
3848-
memcpy(&tcon->fsAttrInfo, server->vals->header_preamble_size + offset
3840+
memcpy(&tcon->fsAttrInfo, offset
38493841
+ (char *)rsp, min_t(unsigned int,
38503842
rsp_len, max_len));
38513843
else if (level == FS_DEVICE_INFORMATION)
3852-
memcpy(&tcon->fsDevInfo, server->vals->header_preamble_size + offset
3844+
memcpy(&tcon->fsDevInfo, offset
38533845
+ (char *)rsp, sizeof(FILE_SYSTEM_DEVICE_INFO));
38543846
else if (level == FS_SECTOR_SIZE_INFORMATION) {
38553847
struct smb3_fs_ss_info *ss_info = (struct smb3_fs_ss_info *)
3856-
(server->vals->header_preamble_size + offset + (char *)rsp);
3848+
(offset + (char *)rsp);
38573849
tcon->ss_flags = le32_to_cpu(ss_info->Flags);
38583850
tcon->perf_sector_size =
38593851
le32_to_cpu(ss_info->PhysicalBytesPerSectorForPerf);

0 commit comments

Comments
 (0)