aboutsummaryrefslogtreecommitdiffstats
path: root/fs/cifs
diff options
context:
space:
mode:
Diffstat (limited to 'fs/cifs')
-rw-r--r--fs/cifs/transport.c139
1 files changed, 72 insertions, 67 deletions
diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c
index 01b3aa5f928b..ca015e60002a 100644
--- a/fs/cifs/transport.c
+++ b/fs/cifs/transport.c
@@ -619,49 +619,52 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses,
619 cERROR(1, ("Frame too large received. Length: %d Xid: %d", 619 cERROR(1, ("Frame too large received. Length: %d Xid: %d",
620 receive_len, xid)); 620 receive_len, xid));
621 rc = -EIO; 621 rc = -EIO;
622 } else { /* rcvd frame is ok */ 622 goto out;
623 if (midQ->resp_buf && 623 }
624 (midQ->midState == MID_RESPONSE_RECEIVED)) {
625 624
626 iov[0].iov_base = (char *)midQ->resp_buf; 625 /* rcvd frame is ok */
627 if (midQ->largeBuf)
628 *pRespBufType = CIFS_LARGE_BUFFER;
629 else
630 *pRespBufType = CIFS_SMALL_BUFFER;
631 iov[0].iov_len = receive_len + 4;
632 626
633 dump_smb(midQ->resp_buf, 80); 627 if (midQ->resp_buf &&
634 /* convert the length into a more usable form */ 628 (midQ->midState == MID_RESPONSE_RECEIVED)) {
635 if ((receive_len > 24) && 629
636 (ses->server->secMode & (SECMODE_SIGN_REQUIRED | 630 iov[0].iov_base = (char *)midQ->resp_buf;
637 SECMODE_SIGN_ENABLED))) { 631 if (midQ->largeBuf)
638 rc = cifs_verify_signature(midQ->resp_buf, 632 *pRespBufType = CIFS_LARGE_BUFFER;
633 else
634 *pRespBufType = CIFS_SMALL_BUFFER;
635 iov[0].iov_len = receive_len + 4;
636
637 dump_smb(midQ->resp_buf, 80);
638 /* convert the length into a more usable form */
639 if ((receive_len > 24) &&
640 (ses->server->secMode & (SECMODE_SIGN_REQUIRED |
641 SECMODE_SIGN_ENABLED))) {
642 rc = cifs_verify_signature(midQ->resp_buf,
639 &ses->server->mac_signing_key, 643 &ses->server->mac_signing_key,
640 midQ->sequence_number+1); 644 midQ->sequence_number+1);
641 if (rc) { 645 if (rc) {
642 cERROR(1, ("Unexpected SMB signature")); 646 cERROR(1, ("Unexpected SMB signature"));
643 /* BB FIXME add code to kill session */ 647 /* BB FIXME add code to kill session */
644 }
645 } 648 }
646
647 /* BB special case reconnect tid and uid here? */
648 rc = map_smb_to_linux_error(midQ->resp_buf,
649 flags & CIFS_LOG_ERROR);
650
651 /* convert ByteCount if necessary */
652 if (receive_len >= sizeof(struct smb_hdr) - 4
653 /* do not count RFC1001 header */ +
654 (2 * midQ->resp_buf->WordCount) + 2 /* bcc */ )
655 BCC(midQ->resp_buf) =
656 le16_to_cpu(BCC_LE(midQ->resp_buf));
657 if ((flags & CIFS_NO_RESP) == 0)
658 midQ->resp_buf = NULL; /* mark it so buf will
659 not be freed by
660 DeleteMidQEntry */
661 } else {
662 rc = -EIO;
663 cFYI(1, ("Bad MID state?"));
664 } 649 }
650
651 /* BB special case reconnect tid and uid here? */
652 rc = map_smb_to_linux_error(midQ->resp_buf,
653 flags & CIFS_LOG_ERROR);
654
655 /* convert ByteCount if necessary */
656 if (receive_len >= sizeof(struct smb_hdr) - 4
657 /* do not count RFC1001 header */ +
658 (2 * midQ->resp_buf->WordCount) + 2 /* bcc */ )
659 BCC(midQ->resp_buf) =
660 le16_to_cpu(BCC_LE(midQ->resp_buf));
661 if ((flags & CIFS_NO_RESP) == 0)
662 midQ->resp_buf = NULL; /* mark it so buf will
663 not be freed by
664 DeleteMidQEntry */
665 } else {
666 rc = -EIO;
667 cFYI(1, ("Bad MID state?"));
665 } 668 }
666 669
667out: 670out:
@@ -809,43 +812,45 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses,
809 cERROR(1, ("Frame too large received. Length: %d Xid: %d", 812 cERROR(1, ("Frame too large received. Length: %d Xid: %d",
810 receive_len, xid)); 813 receive_len, xid));
811 rc = -EIO; 814 rc = -EIO;
812 } else { /* rcvd frame is ok */ 815 goto out;
813 816 }
814 if (midQ->resp_buf && out_buf
815 && (midQ->midState == MID_RESPONSE_RECEIVED)) {
816 out_buf->smb_buf_length = receive_len;
817 memcpy((char *)out_buf + 4,
818 (char *)midQ->resp_buf + 4,
819 receive_len);
820 817
821 dump_smb(out_buf, 92); 818 /* rcvd frame is ok */
822 /* convert the length into a more usable form */ 819
823 if ((receive_len > 24) && 820 if (midQ->resp_buf && out_buf
824 (ses->server->secMode & (SECMODE_SIGN_REQUIRED | 821 && (midQ->midState == MID_RESPONSE_RECEIVED)) {
825 SECMODE_SIGN_ENABLED))) { 822 out_buf->smb_buf_length = receive_len;
826 rc = cifs_verify_signature(out_buf, 823 memcpy((char *)out_buf + 4,
824 (char *)midQ->resp_buf + 4,
825 receive_len);
826
827 dump_smb(out_buf, 92);
828 /* convert the length into a more usable form */
829 if ((receive_len > 24) &&
830 (ses->server->secMode & (SECMODE_SIGN_REQUIRED |
831 SECMODE_SIGN_ENABLED))) {
832 rc = cifs_verify_signature(out_buf,
827 &ses->server->mac_signing_key, 833 &ses->server->mac_signing_key,
828 midQ->sequence_number+1); 834 midQ->sequence_number+1);
829 if (rc) { 835 if (rc) {
830 cERROR(1, ("Unexpected SMB signature")); 836 cERROR(1, ("Unexpected SMB signature"));
831 /* BB FIXME add code to kill session */ 837 /* BB FIXME add code to kill session */
832 }
833 } 838 }
839 }
834 840
835 *pbytes_returned = out_buf->smb_buf_length; 841 *pbytes_returned = out_buf->smb_buf_length;
836 842
837 /* BB special case reconnect tid and uid here? */ 843 /* BB special case reconnect tid and uid here? */
838 rc = map_smb_to_linux_error(out_buf, 0 /* no log */ ); 844 rc = map_smb_to_linux_error(out_buf, 0 /* no log */ );
839 845
840 /* convert ByteCount if necessary */ 846 /* convert ByteCount if necessary */
841 if (receive_len >= sizeof(struct smb_hdr) - 4 847 if (receive_len >= sizeof(struct smb_hdr) - 4
842 /* do not count RFC1001 header */ + 848 /* do not count RFC1001 header */ +
843 (2 * out_buf->WordCount) + 2 /* bcc */ ) 849 (2 * out_buf->WordCount) + 2 /* bcc */ )
844 BCC(out_buf) = le16_to_cpu(BCC_LE(out_buf)); 850 BCC(out_buf) = le16_to_cpu(BCC_LE(out_buf));
845 } else { 851 } else {
846 rc = -EIO; 852 rc = -EIO;
847 cERROR(1, ("Bad MID state?")); 853 cERROR(1, ("Bad MID state?"));
848 }
849 } 854 }
850 855
851out: 856out: