Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(333)

Side by Side Diff: net/socket/ssl_client_socket_openssl.cc

Issue 16907002: Update Android to use scoped_refptr<T>::get() rather than implicit "operator T*" (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebased Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/quic/crypto/crypto_server_config.cc ('k') | net/ssl/openssl_client_key_store_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // OpenSSL binding for SSLClientSocket. The class layout and general principle 5 // OpenSSL binding for SSLClientSocket. The class layout and general principle
6 // of operation is derived from SSLClientSocketNSS. 6 // of operation is derived from SSLClientSocketNSS.
7 7
8 #include "net/socket/ssl_client_socket_openssl.h" 8 #include "net/socket/ssl_client_socket_openssl.h"
9 9
10 #include <openssl/err.h> 10 #include <openssl/err.h>
(...skipping 572 matching lines...) Expand 10 before | Expand all | Expand 10 after
583 cert_authorities_.push_back(std::string( 583 cert_authorities_.push_back(std::string(
584 reinterpret_cast<const char*>(str), 584 reinterpret_cast<const char*>(str),
585 static_cast<size_t>(length))); 585 static_cast<size_t>(length)));
586 OPENSSL_free(str); 586 OPENSSL_free(str);
587 } 587 }
588 588
589 return -1; // Suspends handshake. 589 return -1; // Suspends handshake.
590 } 590 }
591 591
592 // Second pass: a client certificate should have been selected. 592 // Second pass: a client certificate should have been selected.
593 if (ssl_config_.client_cert) { 593 if (ssl_config_.client_cert.get()) {
594 // A note about ownership: FetchClientCertPrivateKey() increments 594 // A note about ownership: FetchClientCertPrivateKey() increments
595 // the reference count of the EVP_PKEY. Ownership of this reference 595 // the reference count of the EVP_PKEY. Ownership of this reference
596 // is passed directly to OpenSSL, which will release the reference 596 // is passed directly to OpenSSL, which will release the reference
597 // using EVP_PKEY_free() when the SSL object is destroyed. 597 // using EVP_PKEY_free() when the SSL object is destroyed.
598 OpenSSLClientKeyStore::ScopedEVP_PKEY privkey; 598 OpenSSLClientKeyStore::ScopedEVP_PKEY privkey;
599 if (OpenSSLClientKeyStore::GetInstance()->FetchClientCertPrivateKey( 599 if (OpenSSLClientKeyStore::GetInstance()->FetchClientCertPrivateKey(
600 ssl_config_.client_cert.get(), &privkey)) { 600 ssl_config_.client_cert.get(), &privkey)) {
601 // TODO(joth): (copied from NSS) We should wait for server certificate 601 // TODO(joth): (copied from NSS) We should wait for server certificate
602 // verification before sending our credentials. See http://crbug.com/13934 602 // verification before sending our credentials. See http://crbug.com/13934
603 *x509 = X509Certificate::DupOSCertHandle( 603 *x509 = X509Certificate::DupOSCertHandle(
604 ssl_config_.client_cert->os_cert_handle()); 604 ssl_config_.client_cert->os_cert_handle());
605 *pkey = privkey.release(); 605 *pkey = privkey.release();
606 return 1; 606 return 1;
607 } 607 }
608 LOG(WARNING) << "Client cert found without private key"; 608 LOG(WARNING) << "Client cert found without private key";
609 } 609 }
610 610
611 // Send no client certificate. 611 // Send no client certificate.
612 return 0; 612 return 0;
613 } 613 }
614 614
615 // SSLClientSocket methods 615 // SSLClientSocket methods
616 616
617 bool SSLClientSocketOpenSSL::GetSSLInfo(SSLInfo* ssl_info) { 617 bool SSLClientSocketOpenSSL::GetSSLInfo(SSLInfo* ssl_info) {
618 ssl_info->Reset(); 618 ssl_info->Reset();
619 if (!server_cert_) 619 if (!server_cert_.get())
620 return false; 620 return false;
621 621
622 ssl_info->cert = server_cert_verify_result_.verified_cert; 622 ssl_info->cert = server_cert_verify_result_.verified_cert;
623 ssl_info->cert_status = server_cert_verify_result_.cert_status; 623 ssl_info->cert_status = server_cert_verify_result_.cert_status;
624 ssl_info->is_issued_by_known_root = 624 ssl_info->is_issued_by_known_root =
625 server_cert_verify_result_.is_issued_by_known_root; 625 server_cert_verify_result_.is_issued_by_known_root;
626 ssl_info->public_key_hashes = 626 ssl_info->public_key_hashes =
627 server_cert_verify_result_.public_key_hashes; 627 server_cert_verify_result_.public_key_hashes;
628 ssl_info->client_cert_sent = 628 ssl_info->client_cert_sent =
629 ssl_config_.send_client_cert && ssl_config_.client_cert; 629 ssl_config_.send_client_cert && ssl_config_.client_cert.get();
630 ssl_info->channel_id_sent = WasChannelIDSent(); 630 ssl_info->channel_id_sent = WasChannelIDSent();
631 631
632 const SSL_CIPHER* cipher = SSL_get_current_cipher(ssl_); 632 const SSL_CIPHER* cipher = SSL_get_current_cipher(ssl_);
633 CHECK(cipher); 633 CHECK(cipher);
634 ssl_info->security_bits = SSL_CIPHER_get_bits(cipher, NULL); 634 ssl_info->security_bits = SSL_CIPHER_get_bits(cipher, NULL);
635 const COMP_METHOD* compression = SSL_get_current_compression(ssl_); 635 const COMP_METHOD* compression = SSL_get_current_compression(ssl_);
636 636
637 ssl_info->connection_status = EncodeSSLConnectionStatus( 637 ssl_info->connection_status = EncodeSSLConnectionStatus(
638 SSL_CIPHER_get_id(cipher), 638 SSL_CIPHER_get_id(cipher),
639 compression ? compression->type : 0, 639 compression ? compression->type : 0,
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
920 } 920 }
921 921
922 npn_proto_.assign(reinterpret_cast<const char*>(*out), *outlen); 922 npn_proto_.assign(reinterpret_cast<const char*>(*out), *outlen);
923 server_protos_.assign(reinterpret_cast<const char*>(in), inlen); 923 server_protos_.assign(reinterpret_cast<const char*>(in), inlen);
924 DVLOG(2) << "next protocol: '" << npn_proto_ << "' status: " << npn_status_; 924 DVLOG(2) << "next protocol: '" << npn_proto_ << "' status: " << npn_status_;
925 #endif 925 #endif
926 return SSL_TLSEXT_ERR_OK; 926 return SSL_TLSEXT_ERR_OK;
927 } 927 }
928 928
929 int SSLClientSocketOpenSSL::DoVerifyCert(int result) { 929 int SSLClientSocketOpenSSL::DoVerifyCert(int result) {
930 DCHECK(server_cert_); 930 DCHECK(server_cert_.get());
931 GotoState(STATE_VERIFY_CERT_COMPLETE); 931 GotoState(STATE_VERIFY_CERT_COMPLETE);
932 932
933 CertStatus cert_status; 933 CertStatus cert_status;
934 if (ssl_config_.IsAllowedBadCert(server_cert_, &cert_status)) { 934 if (ssl_config_.IsAllowedBadCert(server_cert_.get(), &cert_status)) {
935 VLOG(1) << "Received an expected bad cert with status: " << cert_status; 935 VLOG(1) << "Received an expected bad cert with status: " << cert_status;
936 server_cert_verify_result_.Reset(); 936 server_cert_verify_result_.Reset();
937 server_cert_verify_result_.cert_status = cert_status; 937 server_cert_verify_result_.cert_status = cert_status;
938 server_cert_verify_result_.verified_cert = server_cert_; 938 server_cert_verify_result_.verified_cert = server_cert_;
939 return OK; 939 return OK;
940 } 940 }
941 941
942 int flags = 0; 942 int flags = 0;
943 if (ssl_config_.rev_checking_enabled) 943 if (ssl_config_.rev_checking_enabled)
944 flags |= CertVerifier::VERIFY_REV_CHECKING_ENABLED; 944 flags |= CertVerifier::VERIFY_REV_CHECKING_ENABLED;
945 if (ssl_config_.verify_ev_cert) 945 if (ssl_config_.verify_ev_cert)
946 flags |= CertVerifier::VERIFY_EV_CERT; 946 flags |= CertVerifier::VERIFY_EV_CERT;
947 if (ssl_config_.cert_io_enabled) 947 if (ssl_config_.cert_io_enabled)
948 flags |= CertVerifier::VERIFY_CERT_IO_ENABLED; 948 flags |= CertVerifier::VERIFY_CERT_IO_ENABLED;
949 verifier_.reset(new SingleRequestCertVerifier(cert_verifier_)); 949 verifier_.reset(new SingleRequestCertVerifier(cert_verifier_));
950 return verifier_->Verify( 950 return verifier_->Verify(
951 server_cert_, host_and_port_.host(), flags, 951 server_cert_.get(),
952 host_and_port_.host(),
953 flags,
952 NULL /* no CRL set */, 954 NULL /* no CRL set */,
953 &server_cert_verify_result_, 955 &server_cert_verify_result_,
954 base::Bind(&SSLClientSocketOpenSSL::OnHandshakeIOComplete, 956 base::Bind(&SSLClientSocketOpenSSL::OnHandshakeIOComplete,
955 base::Unretained(this)), 957 base::Unretained(this)),
956 net_log_); 958 net_log_);
957 } 959 }
958 960
959 int SSLClientSocketOpenSSL::DoVerifyCertComplete(int result) { 961 int SSLClientSocketOpenSSL::DoVerifyCertComplete(int result) {
960 verifier_.reset(); 962 verifier_.reset();
961 963
962 if (result == OK) { 964 if (result == OK) {
963 // TODO(joth): Work out if we need to remember the intermediate CA certs 965 // TODO(joth): Work out if we need to remember the intermediate CA certs
964 // when the server sends them to us, and do so here. 966 // when the server sends them to us, and do so here.
965 } else { 967 } else {
966 DVLOG(1) << "DoVerifyCertComplete error " << ErrorToString(result) 968 DVLOG(1) << "DoVerifyCertComplete error " << ErrorToString(result)
967 << " (" << result << ")"; 969 << " (" << result << ")";
968 } 970 }
969 971
970 completed_handshake_ = true; 972 completed_handshake_ = true;
971 // Exit DoHandshakeLoop and return the result to the caller to Connect. 973 // Exit DoHandshakeLoop and return the result to the caller to Connect.
972 DCHECK_EQ(STATE_NONE, next_handshake_state_); 974 DCHECK_EQ(STATE_NONE, next_handshake_state_);
973 return result; 975 return result;
974 } 976 }
975 977
976 X509Certificate* SSLClientSocketOpenSSL::UpdateServerCert() { 978 X509Certificate* SSLClientSocketOpenSSL::UpdateServerCert() {
977 if (server_cert_) 979 if (server_cert_.get())
978 return server_cert_; 980 return server_cert_.get();
979 981
980 crypto::ScopedOpenSSL<X509, X509_free> cert(SSL_get_peer_certificate(ssl_)); 982 crypto::ScopedOpenSSL<X509, X509_free> cert(SSL_get_peer_certificate(ssl_));
981 if (!cert.get()) { 983 if (!cert.get()) {
982 LOG(WARNING) << "SSL_get_peer_certificate returned NULL"; 984 LOG(WARNING) << "SSL_get_peer_certificate returned NULL";
983 return NULL; 985 return NULL;
984 } 986 }
985 987
986 // Unlike SSL_get_peer_certificate, SSL_get_peer_cert_chain does not 988 // Unlike SSL_get_peer_certificate, SSL_get_peer_cert_chain does not
987 // increment the reference so sk_X509_free does not need to be called. 989 // increment the reference so sk_X509_free does not need to be called.
988 STACK_OF(X509)* chain = SSL_get_peer_cert_chain(ssl_); 990 STACK_OF(X509)* chain = SSL_get_peer_cert_chain(ssl_);
989 X509Certificate::OSCertHandles intermediates; 991 X509Certificate::OSCertHandles intermediates;
990 if (chain) { 992 if (chain) {
991 for (int i = 0; i < sk_X509_num(chain); ++i) 993 for (int i = 0; i < sk_X509_num(chain); ++i)
992 intermediates.push_back(sk_X509_value(chain, i)); 994 intermediates.push_back(sk_X509_value(chain, i));
993 } 995 }
994 server_cert_ = X509Certificate::CreateFromHandle(cert.get(), intermediates); 996 server_cert_ = X509Certificate::CreateFromHandle(cert.get(), intermediates);
995 DCHECK(server_cert_); 997 DCHECK(server_cert_.get());
996 998
997 return server_cert_; 999 return server_cert_.get();
998 } 1000 }
999 1001
1000 bool SSLClientSocketOpenSSL::DoTransportIO() { 1002 bool SSLClientSocketOpenSSL::DoTransportIO() {
1001 bool network_moved = false; 1003 bool network_moved = false;
1002 int rv; 1004 int rv;
1003 // Read and write as much data as possible. The loop is necessary because 1005 // Read and write as much data as possible. The loop is necessary because
1004 // Write() may return synchronously. 1006 // Write() may return synchronously.
1005 do { 1007 do {
1006 rv = BufferSend(); 1008 rv = BufferSend();
1007 if (rv != ERR_IO_PENDING && rv != 0) 1009 if (rv != ERR_IO_PENDING && rv != 0)
1008 network_moved = true; 1010 network_moved = true;
1009 } while (rv > 0); 1011 } while (rv > 0);
1010 if (!transport_recv_eof_ && BufferRecv() != ERR_IO_PENDING) 1012 if (!transport_recv_eof_ && BufferRecv() != ERR_IO_PENDING)
1011 network_moved = true; 1013 network_moved = true;
1012 return network_moved; 1014 return network_moved;
1013 } 1015 }
1014 1016
1015 int SSLClientSocketOpenSSL::BufferSend(void) { 1017 int SSLClientSocketOpenSSL::BufferSend(void) {
1016 if (transport_send_busy_) 1018 if (transport_send_busy_)
1017 return ERR_IO_PENDING; 1019 return ERR_IO_PENDING;
1018 1020
1019 if (!send_buffer_) { 1021 if (!send_buffer_.get()) {
1020 // Get a fresh send buffer out of the send BIO. 1022 // Get a fresh send buffer out of the send BIO.
1021 size_t max_read = BIO_ctrl_pending(transport_bio_); 1023 size_t max_read = BIO_ctrl_pending(transport_bio_);
1022 if (!max_read) 1024 if (!max_read)
1023 return 0; // Nothing pending in the OpenSSL write BIO. 1025 return 0; // Nothing pending in the OpenSSL write BIO.
1024 send_buffer_ = new DrainableIOBuffer(new IOBuffer(max_read), max_read); 1026 send_buffer_ = new DrainableIOBuffer(new IOBuffer(max_read), max_read);
1025 int read_bytes = BIO_read(transport_bio_, send_buffer_->data(), max_read); 1027 int read_bytes = BIO_read(transport_bio_, send_buffer_->data(), max_read);
1026 DCHECK_GT(read_bytes, 0); 1028 DCHECK_GT(read_bytes, 0);
1027 CHECK_EQ(static_cast<int>(max_read), read_bytes); 1029 CHECK_EQ(static_cast<int>(max_read), read_bytes);
1028 } 1030 }
1029 1031
1030 int rv = transport_->socket()->Write( 1032 int rv = transport_->socket()->Write(
1031 send_buffer_, 1033 send_buffer_.get(),
1032 send_buffer_->BytesRemaining(), 1034 send_buffer_->BytesRemaining(),
1033 base::Bind(&SSLClientSocketOpenSSL::BufferSendComplete, 1035 base::Bind(&SSLClientSocketOpenSSL::BufferSendComplete,
1034 base::Unretained(this))); 1036 base::Unretained(this)));
1035 if (rv == ERR_IO_PENDING) { 1037 if (rv == ERR_IO_PENDING) {
1036 transport_send_busy_ = true; 1038 transport_send_busy_ = true;
1037 } else { 1039 } else {
1038 TransportWriteComplete(rv); 1040 TransportWriteComplete(rv);
1039 } 1041 }
1040 return rv; 1042 return rv;
1041 } 1043 }
1042 1044
1043 void SSLClientSocketOpenSSL::BufferSendComplete(int result) { 1045 void SSLClientSocketOpenSSL::BufferSendComplete(int result) {
1044 transport_send_busy_ = false; 1046 transport_send_busy_ = false;
1045 TransportWriteComplete(result); 1047 TransportWriteComplete(result);
1046 OnSendComplete(result); 1048 OnSendComplete(result);
1047 } 1049 }
1048 1050
1049 void SSLClientSocketOpenSSL::TransportWriteComplete(int result) { 1051 void SSLClientSocketOpenSSL::TransportWriteComplete(int result) {
1050 DCHECK(ERR_IO_PENDING != result); 1052 DCHECK(ERR_IO_PENDING != result);
1051 if (result < 0) { 1053 if (result < 0) {
1052 // Got a socket write error; close the BIO to indicate this upward. 1054 // Got a socket write error; close the BIO to indicate this upward.
1053 DVLOG(1) << "TransportWriteComplete error " << result; 1055 DVLOG(1) << "TransportWriteComplete error " << result;
1054 (void)BIO_shutdown_wr(transport_bio_); 1056 (void)BIO_shutdown_wr(transport_bio_);
1055 BIO_set_mem_eof_return(transport_bio_, 0); 1057 BIO_set_mem_eof_return(transport_bio_, 0);
1056 send_buffer_ = NULL; 1058 send_buffer_ = NULL;
1057 } else { 1059 } else {
1058 DCHECK(send_buffer_); 1060 DCHECK(send_buffer_.get());
1059 send_buffer_->DidConsume(result); 1061 send_buffer_->DidConsume(result);
1060 DCHECK_GE(send_buffer_->BytesRemaining(), 0); 1062 DCHECK_GE(send_buffer_->BytesRemaining(), 0);
1061 if (send_buffer_->BytesRemaining() <= 0) 1063 if (send_buffer_->BytesRemaining() <= 0)
1062 send_buffer_ = NULL; 1064 send_buffer_ = NULL;
1063 } 1065 }
1064 } 1066 }
1065 1067
1066 int SSLClientSocketOpenSSL::BufferRecv(void) { 1068 int SSLClientSocketOpenSSL::BufferRecv(void) {
1067 if (transport_recv_busy_) 1069 if (transport_recv_busy_)
1068 return ERR_IO_PENDING; 1070 return ERR_IO_PENDING;
(...skipping 15 matching lines...) Expand all
1084 // (and constantly allocating new IOBuffers), a single Read() request to 1086 // (and constantly allocating new IOBuffers), a single Read() request to
1085 // fill |transport_bio_| is issued. As long as an SSL client socket cannot 1087 // fill |transport_bio_| is issued. As long as an SSL client socket cannot
1086 // be gracefully shutdown (via SSL close alerts) and re-used for non-SSL 1088 // be gracefully shutdown (via SSL close alerts) and re-used for non-SSL
1087 // traffic, this over-subscribed Read()ing will not cause issues. 1089 // traffic, this over-subscribed Read()ing will not cause issues.
1088 size_t max_write = BIO_ctrl_get_write_guarantee(transport_bio_); 1090 size_t max_write = BIO_ctrl_get_write_guarantee(transport_bio_);
1089 if (!max_write) 1091 if (!max_write)
1090 return ERR_IO_PENDING; 1092 return ERR_IO_PENDING;
1091 1093
1092 recv_buffer_ = new IOBuffer(max_write); 1094 recv_buffer_ = new IOBuffer(max_write);
1093 int rv = transport_->socket()->Read( 1095 int rv = transport_->socket()->Read(
1094 recv_buffer_, max_write, 1096 recv_buffer_.get(),
1097 max_write,
1095 base::Bind(&SSLClientSocketOpenSSL::BufferRecvComplete, 1098 base::Bind(&SSLClientSocketOpenSSL::BufferRecvComplete,
1096 base::Unretained(this))); 1099 base::Unretained(this)));
1097 if (rv == ERR_IO_PENDING) { 1100 if (rv == ERR_IO_PENDING) {
1098 transport_recv_busy_ = true; 1101 transport_recv_busy_ = true;
1099 } else { 1102 } else {
1100 TransportReadComplete(rv); 1103 TransportReadComplete(rv);
1101 } 1104 }
1102 return rv; 1105 return rv;
1103 } 1106 }
1104 1107
1105 void SSLClientSocketOpenSSL::BufferRecvComplete(int result) { 1108 void SSLClientSocketOpenSSL::BufferRecvComplete(int result) {
1106 TransportReadComplete(result); 1109 TransportReadComplete(result);
1107 OnRecvComplete(result); 1110 OnRecvComplete(result);
1108 } 1111 }
1109 1112
1110 void SSLClientSocketOpenSSL::TransportReadComplete(int result) { 1113 void SSLClientSocketOpenSSL::TransportReadComplete(int result) {
1111 DCHECK(ERR_IO_PENDING != result); 1114 DCHECK(ERR_IO_PENDING != result);
1112 if (result <= 0) { 1115 if (result <= 0) {
1113 DVLOG(1) << "TransportReadComplete result " << result; 1116 DVLOG(1) << "TransportReadComplete result " << result;
1114 // Received 0 (end of file) or an error. Either way, bubble it up to the 1117 // Received 0 (end of file) or an error. Either way, bubble it up to the
1115 // SSL layer via the BIO. TODO(joth): consider stashing the error code, to 1118 // SSL layer via the BIO. TODO(joth): consider stashing the error code, to
1116 // relay up to the SSL socket client (i.e. via DoReadCallback). 1119 // relay up to the SSL socket client (i.e. via DoReadCallback).
1117 if (result == 0) 1120 if (result == 0)
1118 transport_recv_eof_ = true; 1121 transport_recv_eof_ = true;
1119 BIO_set_mem_eof_return(transport_bio_, 0); 1122 BIO_set_mem_eof_return(transport_bio_, 0);
1120 (void)BIO_shutdown_wr(transport_bio_); 1123 (void)BIO_shutdown_wr(transport_bio_);
1121 } else { 1124 } else {
1122 DCHECK(recv_buffer_); 1125 DCHECK(recv_buffer_.get());
1123 int ret = BIO_write(transport_bio_, recv_buffer_->data(), result); 1126 int ret = BIO_write(transport_bio_, recv_buffer_->data(), result);
1124 // A write into a memory BIO should always succeed. 1127 // A write into a memory BIO should always succeed.
1125 CHECK_EQ(result, ret); 1128 CHECK_EQ(result, ret);
1126 } 1129 }
1127 recv_buffer_ = NULL; 1130 recv_buffer_ = NULL;
1128 transport_recv_busy_ = false; 1131 transport_recv_busy_ = false;
1129 } 1132 }
1130 1133
1131 void SSLClientSocketOpenSSL::DoConnectCallback(int rv) { 1134 void SSLClientSocketOpenSSL::DoConnectCallback(int rv) {
1132 if (!user_connect_callback_.is_null()) { 1135 if (!user_connect_callback_.is_null()) {
(...skipping 17 matching lines...) Expand all
1150 OnHandshakeIOComplete(result); 1153 OnHandshakeIOComplete(result);
1151 return; 1154 return;
1152 } 1155 }
1153 1156
1154 // OnSendComplete may need to call DoPayloadRead while the renegotiation 1157 // OnSendComplete may need to call DoPayloadRead while the renegotiation
1155 // handshake is in progress. 1158 // handshake is in progress.
1156 int rv_read = ERR_IO_PENDING; 1159 int rv_read = ERR_IO_PENDING;
1157 int rv_write = ERR_IO_PENDING; 1160 int rv_write = ERR_IO_PENDING;
1158 bool network_moved; 1161 bool network_moved;
1159 do { 1162 do {
1160 if (user_read_buf_) 1163 if (user_read_buf_.get())
1161 rv_read = DoPayloadRead(); 1164 rv_read = DoPayloadRead();
1162 if (user_write_buf_) 1165 if (user_write_buf_.get())
1163 rv_write = DoPayloadWrite(); 1166 rv_write = DoPayloadWrite();
1164 network_moved = DoTransportIO(); 1167 network_moved = DoTransportIO();
1165 } while (rv_read == ERR_IO_PENDING && 1168 } while (rv_read == ERR_IO_PENDING && rv_write == ERR_IO_PENDING &&
1166 rv_write == ERR_IO_PENDING && 1169 (user_read_buf_.get() || user_write_buf_.get()) && network_moved);
1167 (user_read_buf_ || user_write_buf_) &&
1168 network_moved);
1169 1170
1170 // Performing the Read callback may cause |this| to be deleted. If this 1171 // Performing the Read callback may cause |this| to be deleted. If this
1171 // happens, the Write callback should not be invoked. Guard against this by 1172 // happens, the Write callback should not be invoked. Guard against this by
1172 // holding a WeakPtr to |this| and ensuring it's still valid. 1173 // holding a WeakPtr to |this| and ensuring it's still valid.
1173 base::WeakPtr<SSLClientSocketOpenSSL> guard(weak_factory_.GetWeakPtr()); 1174 base::WeakPtr<SSLClientSocketOpenSSL> guard(weak_factory_.GetWeakPtr());
1174 if (user_read_buf_ && rv_read != ERR_IO_PENDING) 1175 if (user_read_buf_.get() && rv_read != ERR_IO_PENDING)
1175 DoReadCallback(rv_read); 1176 DoReadCallback(rv_read);
1176 1177
1177 if (!guard.get()) 1178 if (!guard.get())
1178 return; 1179 return;
1179 1180
1180 if (user_write_buf_ && rv_write != ERR_IO_PENDING) 1181 if (user_write_buf_.get() && rv_write != ERR_IO_PENDING)
1181 DoWriteCallback(rv_write); 1182 DoWriteCallback(rv_write);
1182 } 1183 }
1183 1184
1184 void SSLClientSocketOpenSSL::OnRecvComplete(int result) { 1185 void SSLClientSocketOpenSSL::OnRecvComplete(int result) {
1185 if (next_handshake_state_ == STATE_HANDSHAKE) { 1186 if (next_handshake_state_ == STATE_HANDSHAKE) {
1186 // In handshake phase. 1187 // In handshake phase.
1187 OnHandshakeIOComplete(result); 1188 OnHandshakeIOComplete(result);
1188 return; 1189 return;
1189 } 1190 }
1190 1191
1191 // Network layer received some data, check if client requested to read 1192 // Network layer received some data, check if client requested to read
1192 // decrypted data. 1193 // decrypted data.
1193 if (!user_read_buf_) 1194 if (!user_read_buf_.get())
1194 return; 1195 return;
1195 1196
1196 int rv = DoReadLoop(result); 1197 int rv = DoReadLoop(result);
1197 if (rv != ERR_IO_PENDING) 1198 if (rv != ERR_IO_PENDING)
1198 DoReadCallback(rv); 1199 DoReadCallback(rv);
1199 } 1200 }
1200 1201
1201 bool SSLClientSocketOpenSSL::IsConnected() const { 1202 bool SSLClientSocketOpenSSL::IsConnected() const {
1202 // If the handshake has not yet completed. 1203 // If the handshake has not yet completed.
1203 if (!completed_handshake_) 1204 if (!completed_handshake_)
1204 return false; 1205 return false;
1205 // If an asynchronous operation is still pending. 1206 // If an asynchronous operation is still pending.
1206 if (user_read_buf_ || user_write_buf_) 1207 if (user_read_buf_.get() || user_write_buf_.get())
1207 return true; 1208 return true;
1208 1209
1209 return transport_->socket()->IsConnected(); 1210 return transport_->socket()->IsConnected();
1210 } 1211 }
1211 1212
1212 bool SSLClientSocketOpenSSL::IsConnectedAndIdle() const { 1213 bool SSLClientSocketOpenSSL::IsConnectedAndIdle() const {
1213 // If the handshake has not yet completed. 1214 // If the handshake has not yet completed.
1214 if (!completed_handshake_) 1215 if (!completed_handshake_)
1215 return false; 1216 return false;
1216 // If an asynchronous operation is still pending. 1217 // If an asynchronous operation is still pending.
1217 if (user_read_buf_ || user_write_buf_) 1218 if (user_read_buf_.get() || user_write_buf_.get())
1218 return false; 1219 return false;
1219 // If there is data waiting to be sent, or data read from the network that 1220 // If there is data waiting to be sent, or data read from the network that
1220 // has not yet been consumed. 1221 // has not yet been consumed.
1221 if (BIO_ctrl_pending(transport_bio_) > 0 || 1222 if (BIO_ctrl_pending(transport_bio_) > 0 ||
1222 BIO_ctrl_wpending(transport_bio_) > 0) { 1223 BIO_ctrl_wpending(transport_bio_) > 0) {
1223 return false; 1224 return false;
1224 } 1225 }
1225 1226
1226 return transport_->socket()->IsConnectedAndIdle(); 1227 return transport_->socket()->IsConnectedAndIdle();
1227 } 1228 }
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
1419 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv, 1420 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv,
1420 user_write_buf_->data()); 1421 user_write_buf_->data());
1421 return rv; 1422 return rv;
1422 } 1423 }
1423 1424
1424 int err = SSL_get_error(ssl_, rv); 1425 int err = SSL_get_error(ssl_, rv);
1425 return MapOpenSSLError(err, err_tracer); 1426 return MapOpenSSLError(err, err_tracer);
1426 } 1427 }
1427 1428
1428 } // namespace net 1429 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/crypto/crypto_server_config.cc ('k') | net/ssl/openssl_client_key_store_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698