diff options
Diffstat (limited to 'fs/cifs')
-rw-r--r-- | fs/cifs/transport.c | 139 |
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 | ||
667 | out: | 670 | out: |
@@ -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 | ||
851 | out: | 856 | out: |