Skip to content

Commit 62432a3

Browse files
dhowellssmfrench
authored andcommitted
cifs: Clean up some places where an extra kvec[] was required for rfc1002
Clean up some places where previously an extra element in the kvec array was being used to hold an rfc1002 header for SMB1 (a previous patch removed this and generated it on the fly as for SMB2/3). Signed-off-by: David Howells <dhowells@redhat.com> Reviewed-by: Paulo Alcantara (Red Hat) <pc@manguebit.org> cc: Shyam Prasad N <sprasad@microsoft.com> cc: Tom Talpey <tom@talpey.com> cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org Signed-off-by: Steve French <stfrench@microsoft.com>
1 parent 6be0958 commit 62432a3

5 files changed

Lines changed: 39 additions & 82 deletions

File tree

fs/smb/client/cifsencrypt.c

Lines changed: 12 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -86,26 +86,21 @@ static int cifs_sig_iter(const struct iov_iter *iter, size_t maxsize,
8686
int __cifs_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server,
8787
char *signature, struct cifs_calc_sig_ctx *ctx)
8888
{
89-
int i;
89+
struct iov_iter iter;
9090
ssize_t rc;
91-
struct kvec *iov = rqst->rq_iov;
92-
int n_vec = rqst->rq_nvec;
91+
size_t size = 0;
9392

94-
for (i = 0; i < n_vec; i++) {
95-
if (iov[i].iov_len == 0)
96-
continue;
97-
if (iov[i].iov_base == NULL) {
98-
cifs_dbg(VFS, "null iovec entry\n");
99-
return -EIO;
100-
}
93+
for (int i = 0; i < rqst->rq_nvec; i++)
94+
size += rqst->rq_iov[i].iov_len;
10195

102-
rc = cifs_sig_update(ctx, iov[i].iov_base, iov[i].iov_len);
103-
if (rc) {
104-
cifs_dbg(VFS, "%s: Could not update with payload\n",
105-
__func__);
106-
return rc;
107-
}
108-
}
96+
iov_iter_kvec(&iter, ITER_SOURCE, rqst->rq_iov, rqst->rq_nvec, size);
97+
98+
if (iov_iter_count(&iter) <= 4)
99+
return -EIO;
100+
101+
rc = cifs_sig_iter(&iter, iov_iter_count(&iter), ctx);
102+
if (rc < 0)
103+
return rc;
109104

110105
rc = cifs_sig_iter(&rqst->rq_iter, iov_iter_count(&rqst->rq_iter), ctx);
111106
if (rc < 0)
@@ -186,29 +181,6 @@ int cifs_sign_rqst(struct smb_rqst *rqst, struct TCP_Server_Info *server,
186181
return rc;
187182
}
188183

189-
int cifs_sign_smbv(struct kvec *iov, int n_vec, struct TCP_Server_Info *server,
190-
__u32 *pexpected_response_sequence)
191-
{
192-
struct smb_rqst rqst = { .rq_iov = iov,
193-
.rq_nvec = n_vec };
194-
195-
return cifs_sign_rqst(&rqst, server, pexpected_response_sequence);
196-
}
197-
198-
/* must be called with server->srv_mutex held */
199-
int cifs_sign_smb(struct smb_hdr *cifs_pdu, unsigned int pdu_len,
200-
struct TCP_Server_Info *server,
201-
__u32 *pexpected_response_sequence_number)
202-
{
203-
struct kvec iov[1] = {
204-
[0].iov_base = (char *)cifs_pdu,
205-
[0].iov_len = pdu_len,
206-
};
207-
208-
return cifs_sign_smbv(iov, ARRAY_SIZE(iov), server,
209-
pexpected_response_sequence_number);
210-
}
211-
212184
int cifs_verify_signature(struct smb_rqst *rqst,
213185
struct TCP_Server_Info *server,
214186
__u32 expected_sequence_number)

fs/smb/client/cifsproto.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ extern void cifs_buf_release(void *);
3030
extern struct smb_hdr *cifs_small_buf_get(void);
3131
extern void cifs_small_buf_release(void *);
3232
extern void free_rsp_buf(int, void *);
33-
extern int smb_send(struct TCP_Server_Info *, struct smb_hdr *,
34-
unsigned int /* length */);
3533
extern int smb_send_kvec(struct TCP_Server_Info *server,
3634
struct msghdr *msg,
3735
size_t *sent);
@@ -562,11 +560,6 @@ extern void tconInfoFree(struct cifs_tcon *tcon, enum smb3_tcon_ref_trace trace)
562560

563561
extern int cifs_sign_rqst(struct smb_rqst *rqst, struct TCP_Server_Info *server,
564562
__u32 *pexpected_response_sequence_number);
565-
int cifs_sign_smbv(struct kvec *iov, int n_vec, struct TCP_Server_Info *server,
566-
__u32 *pexpected_response_sequence);
567-
int cifs_sign_smb(struct smb_hdr *cifs_pdu, unsigned int pdu_len,
568-
struct TCP_Server_Info *server,
569-
__u32 *pexpected_response_sequence_number);
570563
int cifs_verify_signature(struct smb_rqst *rqst,
571564
struct TCP_Server_Info *server,
572565
__u32 expected_sequence_number);

fs/smb/client/cifstransport.c

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -70,22 +70,6 @@ alloc_mid(const struct smb_hdr *smb_buffer, struct TCP_Server_Info *server)
7070
return temp;
7171
}
7272

73-
int
74-
smb_send(struct TCP_Server_Info *server, struct smb_hdr *smb_buffer,
75-
unsigned int smb_buf_length)
76-
{
77-
struct kvec iov[1] = {
78-
[0].iov_base = smb_buffer,
79-
[0].iov_len = smb_buf_length,
80-
};
81-
struct smb_rqst rqst = {
82-
.rq_iov = iov,
83-
.rq_nvec = ARRAY_SIZE(iov),
84-
};
85-
86-
return __smb_send_rqst(server, 1, &rqst);
87-
}
88-
8973
static int allocate_mid(struct cifs_ses *ses, struct smb_hdr *in_buf,
9074
struct mid_q_entry **ppmidQ)
9175
{
@@ -369,15 +353,15 @@ int SendReceiveBlockingLock(const unsigned int xid, struct cifs_tcon *tcon,
369353
return rc;
370354
}
371355

372-
rc = cifs_sign_smb(in_buf, in_len, server, &mid->sequence_number);
356+
rc = cifs_sign_rqst(&rqst, server, &mid->sequence_number);
373357
if (rc) {
374358
delete_mid(mid);
375359
cifs_server_unlock(server);
376360
return rc;
377361
}
378362

379363
mid->mid_state = MID_REQUEST_SUBMITTED;
380-
rc = smb_send(server, in_buf, in_len);
364+
rc = __smb_send_rqst(server, 1, &rqst);
381365
cifs_save_when_sent(mid);
382366

383367
if (rc < 0)

fs/smb/client/smb1ops.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,21 @@ static int
3333
send_nt_cancel(struct TCP_Server_Info *server, struct smb_rqst *rqst,
3434
struct mid_q_entry *mid)
3535
{
36-
int rc = 0;
3736
struct smb_hdr *in_buf = (struct smb_hdr *)rqst->rq_iov[0].iov_base;
38-
unsigned int in_len = rqst->rq_iov[0].iov_len;
37+
struct kvec iov[1];
38+
struct smb_rqst crqst = { .rq_iov = iov, .rq_nvec = 1 };
39+
int rc = 0;
3940

4041
/* +2 for BCC field */
4142
in_buf->Command = SMB_COM_NT_CANCEL;
4243
in_buf->WordCount = 0;
4344
put_bcc(0, in_buf);
4445

46+
iov[0].iov_base = in_buf;
47+
iov[0].iov_len = sizeof(struct smb_hdr) + 2;
48+
4549
cifs_server_lock(server);
46-
rc = cifs_sign_smb(in_buf, in_len, server, &mid->sequence_number);
50+
rc = cifs_sign_rqst(&crqst, server, &mid->sequence_number);
4751
if (rc) {
4852
cifs_server_unlock(server);
4953
return rc;
@@ -55,7 +59,7 @@ send_nt_cancel(struct TCP_Server_Info *server, struct smb_rqst *rqst,
5559
* after signing here.
5660
*/
5761
--server->sequence_number;
58-
rc = smb_send(server, in_buf, in_len);
62+
rc = __smb_send_rqst(server, 1, &crqst);
5963
if (rc < 0)
6064
server->sequence_number--;
6165

fs/smb/client/transport.c

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -994,6 +994,9 @@ compound_send_recv(const unsigned int xid, struct cifs_ses *ses,
994994
if ((ses->ses_status == SES_NEW) || (optype & CIFS_NEG_OP) || (optype & CIFS_SESS_OP)) {
995995
spin_unlock(&ses->ses_lock);
996996

997+
if (WARN_ON_ONCE(num_rqst != 1 || !resp_iov))
998+
return -EINVAL;
999+
9971000
cifs_server_lock(server);
9981001
smb311_update_preauth_hash(ses, server, rqst[0].rq_iov, rqst[0].rq_nvec);
9991002
cifs_server_unlock(server);
@@ -1041,22 +1044,23 @@ compound_send_recv(const unsigned int xid, struct cifs_ses *ses,
10411044
goto out;
10421045
}
10431046

1044-
buf = (char *)mid[i]->resp_buf;
1045-
resp_iov[i].iov_base = buf;
1046-
resp_iov[i].iov_len = mid[i]->resp_buf_size;
1047-
1048-
if (mid[i]->large_buf)
1049-
resp_buf_type[i] = CIFS_LARGE_BUFFER;
1050-
else
1051-
resp_buf_type[i] = CIFS_SMALL_BUFFER;
1052-
10531047
rc = server->ops->check_receive(mid[i], server,
1054-
flags & CIFS_LOG_ERROR);
1048+
flags & CIFS_LOG_ERROR);
1049+
1050+
if (resp_iov) {
1051+
buf = (char *)mid[i]->resp_buf;
1052+
resp_iov[i].iov_base = buf;
1053+
resp_iov[i].iov_len = mid[i]->resp_buf_size;
10551054

1056-
/* mark it so buf will not be freed by delete_mid */
1057-
if ((flags & CIFS_NO_RSP_BUF) == 0)
1058-
mid[i]->resp_buf = NULL;
1055+
if (mid[i]->large_buf)
1056+
resp_buf_type[i] = CIFS_LARGE_BUFFER;
1057+
else
1058+
resp_buf_type[i] = CIFS_SMALL_BUFFER;
10591059

1060+
/* mark it so buf will not be freed by delete_mid */
1061+
if ((flags & CIFS_NO_RSP_BUF) == 0)
1062+
mid[i]->resp_buf = NULL;
1063+
}
10601064
}
10611065

10621066
/*

0 commit comments

Comments
 (0)