diff options
Diffstat (limited to 'fs/cifs/transport.c')
-rw-r--r-- | fs/cifs/transport.c | 43 |
1 files changed, 23 insertions, 20 deletions
diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c index 981ea0d8b9cd..7b98792150ea 100644 --- a/fs/cifs/transport.c +++ b/fs/cifs/transport.c | |||
@@ -206,7 +206,6 @@ smb_send(struct socket *ssocket, struct smb_hdr *smb_buffer, | |||
206 | return rc; | 206 | return rc; |
207 | } | 207 | } |
208 | 208 | ||
209 | #ifdef CONFIG_CIFS_EXPERIMENTAL | ||
210 | static int | 209 | static int |
211 | smb_send2(struct socket *ssocket, struct kvec *iov, int n_vec, | 210 | smb_send2(struct socket *ssocket, struct kvec *iov, int n_vec, |
212 | struct sockaddr *sin) | 211 | struct sockaddr *sin) |
@@ -299,7 +298,7 @@ smb_send2(struct socket *ssocket, struct kvec *iov, int n_vec, | |||
299 | 298 | ||
300 | int | 299 | int |
301 | SendReceive2(const unsigned int xid, struct cifsSesInfo *ses, | 300 | SendReceive2(const unsigned int xid, struct cifsSesInfo *ses, |
302 | struct kvec *iov, int n_vec, int *pbytes_returned, | 301 | struct kvec *iov, int n_vec, int * pRespBufType /* ret */, |
303 | const int long_op) | 302 | const int long_op) |
304 | { | 303 | { |
305 | int rc = 0; | 304 | int rc = 0; |
@@ -307,6 +306,8 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses, | |||
307 | unsigned long timeout; | 306 | unsigned long timeout; |
308 | struct mid_q_entry *midQ; | 307 | struct mid_q_entry *midQ; |
309 | struct smb_hdr *in_buf = iov[0].iov_base; | 308 | struct smb_hdr *in_buf = iov[0].iov_base; |
309 | |||
310 | *pRespBufType = CIFS_NO_BUFFER; /* no response buf yet */ | ||
310 | 311 | ||
311 | if (ses == NULL) { | 312 | if (ses == NULL) { |
312 | cERROR(1,("Null smb session")); | 313 | cERROR(1,("Null smb session")); |
@@ -392,8 +393,7 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses, | |||
392 | return -ENOMEM; | 393 | return -ENOMEM; |
393 | } | 394 | } |
394 | 395 | ||
395 | /* BB FIXME */ | 396 | rc = cifs_sign_smb2(iov, n_vec, ses->server, &midQ->sequence_number); |
396 | /* rc = cifs_sign_smb2(iov, n_vec, ses->server, &midQ->sequence_number); */ | ||
397 | 397 | ||
398 | midQ->midState = MID_REQUEST_SUBMITTED; | 398 | midQ->midState = MID_REQUEST_SUBMITTED; |
399 | #ifdef CONFIG_CIFS_STATS2 | 399 | #ifdef CONFIG_CIFS_STATS2 |
@@ -489,21 +489,23 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses, | |||
489 | receive_len, xid)); | 489 | receive_len, xid)); |
490 | rc = -EIO; | 490 | rc = -EIO; |
491 | } else { /* rcvd frame is ok */ | 491 | } else { /* rcvd frame is ok */ |
492 | |||
493 | if (midQ->resp_buf && | 492 | if (midQ->resp_buf && |
494 | (midQ->midState == MID_RESPONSE_RECEIVED)) { | 493 | (midQ->midState == MID_RESPONSE_RECEIVED)) { |
495 | in_buf->smb_buf_length = receive_len; | ||
496 | /* BB verify that length would not overrun small buf */ | ||
497 | memcpy((char *)in_buf + 4, | ||
498 | (char *)midQ->resp_buf + 4, | ||
499 | receive_len); | ||
500 | 494 | ||
501 | dump_smb(in_buf, 80); | 495 | iov[0].iov_base = (char *)midQ->resp_buf; |
496 | if(midQ->largeBuf) | ||
497 | *pRespBufType = CIFS_LARGE_BUFFER; | ||
498 | else | ||
499 | *pRespBufType = CIFS_SMALL_BUFFER; | ||
500 | iov[0].iov_len = receive_len + 4; | ||
501 | iov[1].iov_len = 0; | ||
502 | |||
503 | dump_smb(midQ->resp_buf, 80); | ||
502 | /* convert the length into a more usable form */ | 504 | /* convert the length into a more usable form */ |
503 | if((receive_len > 24) && | 505 | if((receive_len > 24) && |
504 | (ses->server->secMode & (SECMODE_SIGN_REQUIRED | | 506 | (ses->server->secMode & (SECMODE_SIGN_REQUIRED | |
505 | SECMODE_SIGN_ENABLED))) { | 507 | SECMODE_SIGN_ENABLED))) { |
506 | rc = cifs_verify_signature(in_buf, | 508 | rc = cifs_verify_signature(midQ->resp_buf, |
507 | ses->server->mac_signing_key, | 509 | ses->server->mac_signing_key, |
508 | midQ->sequence_number+1); | 510 | midQ->sequence_number+1); |
509 | if(rc) { | 511 | if(rc) { |
@@ -512,17 +514,19 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses, | |||
512 | } | 514 | } |
513 | } | 515 | } |
514 | 516 | ||
515 | *pbytes_returned = in_buf->smb_buf_length; | ||
516 | |||
517 | /* BB special case reconnect tid and uid here? */ | 517 | /* BB special case reconnect tid and uid here? */ |
518 | rc = map_smb_to_linux_error(in_buf); | 518 | /* BB special case Errbadpassword and pwdexpired here */ |
519 | rc = map_smb_to_linux_error(midQ->resp_buf); | ||
519 | 520 | ||
520 | /* convert ByteCount if necessary */ | 521 | /* convert ByteCount if necessary */ |
521 | if (receive_len >= | 522 | if (receive_len >= |
522 | sizeof (struct smb_hdr) - | 523 | sizeof (struct smb_hdr) - |
523 | 4 /* do not count RFC1001 header */ + | 524 | 4 /* do not count RFC1001 header */ + |
524 | (2 * in_buf->WordCount) + 2 /* bcc */ ) | 525 | (2 * midQ->resp_buf->WordCount) + 2 /* bcc */ ) |
525 | BCC(in_buf) = le16_to_cpu(BCC(in_buf)); | 526 | BCC(midQ->resp_buf) = |
527 | le16_to_cpu(BCC_LE(midQ->resp_buf)); | ||
528 | midQ->resp_buf = NULL; /* mark it so will not be freed | ||
529 | by DeleteMidQEntry */ | ||
526 | } else { | 530 | } else { |
527 | rc = -EIO; | 531 | rc = -EIO; |
528 | cFYI(1,("Bad MID state?")); | 532 | cFYI(1,("Bad MID state?")); |
@@ -548,7 +552,6 @@ out_unlock2: | |||
548 | 552 | ||
549 | return rc; | 553 | return rc; |
550 | } | 554 | } |
551 | #endif /* CIFS_EXPERIMENTAL */ | ||
552 | 555 | ||
553 | int | 556 | int |
554 | SendReceive(const unsigned int xid, struct cifsSesInfo *ses, | 557 | SendReceive(const unsigned int xid, struct cifsSesInfo *ses, |
@@ -786,10 +789,10 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses, | |||
786 | sizeof (struct smb_hdr) - | 789 | sizeof (struct smb_hdr) - |
787 | 4 /* do not count RFC1001 header */ + | 790 | 4 /* do not count RFC1001 header */ + |
788 | (2 * out_buf->WordCount) + 2 /* bcc */ ) | 791 | (2 * out_buf->WordCount) + 2 /* bcc */ ) |
789 | BCC(out_buf) = le16_to_cpu(BCC(out_buf)); | 792 | BCC(out_buf) = le16_to_cpu(BCC_LE(out_buf)); |
790 | } else { | 793 | } else { |
791 | rc = -EIO; | 794 | rc = -EIO; |
792 | cERROR(1,("Bad MID state? ")); | 795 | cERROR(1,("Bad MID state?")); |
793 | } | 796 | } |
794 | } | 797 | } |
795 | cifs_no_response_exit: | 798 | cifs_no_response_exit: |