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

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

Issue 2411033003: Drop buffers in idle SSLClientSockets (and SSLServerSockets). (Closed)
Patch Set: rsleevi comments Created 4 years, 2 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
« no previous file with comments | « net/socket/ssl_client_socket_impl.h ('k') | net/socket/ssl_client_socket_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 #include "net/socket/ssl_client_socket_impl.h" 5 #include "net/socket/ssl_client_socket_impl.h"
6 6
7 #include <errno.h> 7 #include <errno.h>
8 #include <openssl/bio.h> 8 #include <openssl/bio.h>
9 #include <openssl/bytestring.h> 9 #include <openssl/bytestring.h>
10 #include <openssl/err.h> 10 #include <openssl/err.h>
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 ssl_info.handshake_type == SSLInfo::HANDSHAKE_RESUME); 193 ssl_info.handshake_type == SSLInfo::HANDSHAKE_RESUME);
194 dict->SetInteger("cipher_suite", SSLConnectionStatusToCipherSuite( 194 dict->SetInteger("cipher_suite", SSLConnectionStatusToCipherSuite(
195 ssl_info.connection_status)); 195 ssl_info.connection_status));
196 196
197 dict->SetString("next_proto", SSLClientSocket::NextProtoToString( 197 dict->SetString("next_proto", SSLClientSocket::NextProtoToString(
198 socket->GetNegotiatedProtocol())); 198 socket->GetNegotiatedProtocol()));
199 199
200 return std::move(dict); 200 return std::move(dict);
201 } 201 }
202 202
203 int GetBufferSize(const char* field_trial) {
204 // Get buffer sizes from field trials, if possible. If values not present,
205 // use default. Also make sure values are in reasonable range.
206 int buffer_size = kDefaultOpenSSLBufferSize;
207 #if !defined(OS_NACL)
208 int override_buffer_size;
209 if (base::StringToInt(base::FieldTrialList::FindFullName(field_trial),
210 &override_buffer_size)) {
211 buffer_size = override_buffer_size;
212 buffer_size = std::max(buffer_size, 1000);
213 buffer_size = std::min(buffer_size, 2 * kDefaultOpenSSLBufferSize);
214 }
215 #endif // !defined(OS_NACL)
216 return buffer_size;
217 }
218
203 } // namespace 219 } // namespace
204 220
205 class SSLClientSocketImpl::SSLContext { 221 class SSLClientSocketImpl::SSLContext {
206 public: 222 public:
207 static SSLContext* GetInstance() { 223 static SSLContext* GetInstance() {
208 return base::Singleton<SSLContext>::get(); 224 return base::Singleton<SSLContext>::get();
209 } 225 }
210 SSL_CTX* ssl_ctx() { return ssl_ctx_.get(); } 226 SSL_CTX* ssl_ctx() { return ssl_ctx_.get(); }
211 SSLClientSessionCache* session_cache() { return &session_cache_; } 227 SSLClientSessionCache* session_cache() { return &session_cache_; }
212 228
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
469 SSLClientSocketImpl::SSLContext* context = 485 SSLClientSocketImpl::SSLContext* context =
470 SSLClientSocketImpl::SSLContext::GetInstance(); 486 SSLClientSocketImpl::SSLContext::GetInstance();
471 context->session_cache()->Flush(); 487 context->session_cache()->Flush();
472 } 488 }
473 489
474 SSLClientSocketImpl::SSLClientSocketImpl( 490 SSLClientSocketImpl::SSLClientSocketImpl(
475 std::unique_ptr<ClientSocketHandle> transport_socket, 491 std::unique_ptr<ClientSocketHandle> transport_socket,
476 const HostPortPair& host_and_port, 492 const HostPortPair& host_and_port,
477 const SSLConfig& ssl_config, 493 const SSLConfig& ssl_config,
478 const SSLClientSocketContext& context) 494 const SSLClientSocketContext& context)
479 : transport_send_busy_(false), 495 : pending_read_error_(kNoPendingResult),
480 transport_recv_busy_(false),
481 pending_read_error_(kNoPendingResult),
482 pending_read_ssl_error_(SSL_ERROR_NONE), 496 pending_read_ssl_error_(SSL_ERROR_NONE),
483 transport_read_error_(OK),
484 transport_write_error_(OK),
485 server_cert_chain_(new PeerCertificateChain(NULL)), 497 server_cert_chain_(new PeerCertificateChain(NULL)),
486 completed_connect_(false), 498 completed_connect_(false),
487 was_ever_used_(false), 499 was_ever_used_(false),
488 cert_verifier_(context.cert_verifier), 500 cert_verifier_(context.cert_verifier),
489 cert_transparency_verifier_(context.cert_transparency_verifier), 501 cert_transparency_verifier_(context.cert_transparency_verifier),
490 channel_id_service_(context.channel_id_service), 502 channel_id_service_(context.channel_id_service),
491 tb_was_negotiated_(false), 503 tb_was_negotiated_(false),
492 tb_negotiated_param_(TB_PARAM_ECDSAP256), 504 tb_negotiated_param_(TB_PARAM_ECDSAP256),
493 tb_signature_map_(10), 505 tb_signature_map_(10),
494 transport_(std::move(transport_socket)), 506 transport_(std::move(transport_socket)),
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
626 return rv > OK ? OK : rv; 638 return rv > OK ? OK : rv;
627 } 639 }
628 640
629 void SSLClientSocketImpl::Disconnect() { 641 void SSLClientSocketImpl::Disconnect() {
630 disconnected_ = true; 642 disconnected_ = true;
631 643
632 // Shut down anything that may call us back. 644 // Shut down anything that may call us back.
633 cert_verifier_request_.reset(); 645 cert_verifier_request_.reset();
634 channel_id_request_.Cancel(); 646 channel_id_request_.Cancel();
635 weak_factory_.InvalidateWeakPtrs(); 647 weak_factory_.InvalidateWeakPtrs();
648 transport_adapter_.reset();
636 649
637 // Release user callbacks. 650 // Release user callbacks.
638 user_connect_callback_.Reset(); 651 user_connect_callback_.Reset();
639 user_read_callback_.Reset(); 652 user_read_callback_.Reset();
640 user_write_callback_.Reset(); 653 user_write_callback_.Reset();
641 user_read_buf_ = NULL; 654 user_read_buf_ = NULL;
642 user_read_buf_len_ = 0; 655 user_read_buf_len_ = 0;
643 user_write_buf_ = NULL; 656 user_write_buf_ = NULL;
644 user_write_buf_len_ = 0; 657 user_write_buf_len_ = 0;
645 658
(...skipping 17 matching lines...) Expand all
663 // disconnected. 676 // disconnected.
664 if (!completed_connect_ || disconnected_) 677 if (!completed_connect_ || disconnected_)
665 return false; 678 return false;
666 // If an asynchronous operation is still pending. 679 // If an asynchronous operation is still pending.
667 if (user_read_buf_.get() || user_write_buf_.get()) 680 if (user_read_buf_.get() || user_write_buf_.get())
668 return false; 681 return false;
669 682
670 // If there is data read from the network that has not yet been consumed, do 683 // If there is data read from the network that has not yet been consumed, do
671 // not treat the connection as idle. 684 // not treat the connection as idle.
672 // 685 //
673 // Note that this does not check |BIO_pending|, whether there is ciphertext 686 // Note that this does not check whether there is ciphertext that has not yet
674 // that has not yet been flushed to the network. |Write| returns early, so 687 // been flushed to the network. |Write| returns early, so this can cause race
675 // this can cause race conditions which cause a socket to not be treated 688 // conditions which cause a socket to not be treated reusable when it should
676 // reusable when it should be. See https://crbug.com/466147. 689 // be. See https://crbug.com/466147.
677 if (BIO_wpending(transport_bio_.get()) > 0) 690 if (transport_adapter_->HasPendingReadData())
678 return false; 691 return false;
679 692
680 return transport_->socket()->IsConnectedAndIdle(); 693 return transport_->socket()->IsConnectedAndIdle();
681 } 694 }
682 695
683 int SSLClientSocketImpl::GetPeerAddress(IPEndPoint* addressList) const { 696 int SSLClientSocketImpl::GetPeerAddress(IPEndPoint* addressList) const {
684 return transport_->socket()->GetPeerAddress(addressList); 697 return transport_->socket()->GetPeerAddress(addressList);
685 } 698 }
686 699
687 int SSLClientSocketImpl::GetLocalAddress(IPEndPoint* addressList) const { 700 int SSLClientSocketImpl::GetLocalAddress(IPEndPoint* addressList) const {
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
771 int64_t SSLClientSocketImpl::GetTotalReceivedBytes() const { 784 int64_t SSLClientSocketImpl::GetTotalReceivedBytes() const {
772 return transport_->socket()->GetTotalReceivedBytes(); 785 return transport_->socket()->GetTotalReceivedBytes();
773 } 786 }
774 787
775 int SSLClientSocketImpl::Read(IOBuffer* buf, 788 int SSLClientSocketImpl::Read(IOBuffer* buf,
776 int buf_len, 789 int buf_len,
777 const CompletionCallback& callback) { 790 const CompletionCallback& callback) {
778 user_read_buf_ = buf; 791 user_read_buf_ = buf;
779 user_read_buf_len_ = buf_len; 792 user_read_buf_len_ = buf_len;
780 793
781 int rv = DoReadLoop(); 794 int rv = DoPayloadRead();
782 795
783 if (rv == ERR_IO_PENDING) { 796 if (rv == ERR_IO_PENDING) {
784 user_read_callback_ = callback; 797 user_read_callback_ = callback;
785 } else { 798 } else {
786 if (rv > 0) 799 if (rv > 0)
787 was_ever_used_ = true; 800 was_ever_used_ = true;
788 user_read_buf_ = NULL; 801 user_read_buf_ = NULL;
789 user_read_buf_len_ = 0; 802 user_read_buf_len_ = 0;
790 } 803 }
791 804
792 return rv; 805 return rv;
793 } 806 }
794 807
795 int SSLClientSocketImpl::Write(IOBuffer* buf, 808 int SSLClientSocketImpl::Write(IOBuffer* buf,
796 int buf_len, 809 int buf_len,
797 const CompletionCallback& callback) { 810 const CompletionCallback& callback) {
798 user_write_buf_ = buf; 811 user_write_buf_ = buf;
799 user_write_buf_len_ = buf_len; 812 user_write_buf_len_ = buf_len;
800 813
801 int rv = DoWriteLoop(); 814 int rv = DoPayloadWrite();
802 815
803 if (rv == ERR_IO_PENDING) { 816 if (rv == ERR_IO_PENDING) {
804 user_write_callback_ = callback; 817 user_write_callback_ = callback;
805 } else { 818 } else {
806 if (rv > 0) 819 if (rv > 0)
807 was_ever_used_ = true; 820 was_ever_used_ = true;
808 user_write_buf_ = NULL; 821 user_write_buf_ = NULL;
809 user_write_buf_len_ = 0; 822 user_write_buf_len_ = 0;
810 } 823 }
811 824
812 return rv; 825 return rv;
813 } 826 }
814 827
815 int SSLClientSocketImpl::SetReceiveBufferSize(int32_t size) { 828 int SSLClientSocketImpl::SetReceiveBufferSize(int32_t size) {
816 return transport_->socket()->SetReceiveBufferSize(size); 829 return transport_->socket()->SetReceiveBufferSize(size);
817 } 830 }
818 831
819 int SSLClientSocketImpl::SetSendBufferSize(int32_t size) { 832 int SSLClientSocketImpl::SetSendBufferSize(int32_t size) {
820 return transport_->socket()->SetSendBufferSize(size); 833 return transport_->socket()->SetSendBufferSize(size);
821 } 834 }
822 835
836 void SSLClientSocketImpl::OnReadReady() {
837 // During a renegotiation, either Read or Write calls may be blocked on a
838 // transport read.
839 RetryAllOperations();
840 }
841
842 void SSLClientSocketImpl::OnWriteReady() {
843 // During a renegotiation, either Read or Write calls may be blocked on a
844 // transport read.
845 RetryAllOperations();
846 }
847
823 int SSLClientSocketImpl::Init() { 848 int SSLClientSocketImpl::Init() {
824 DCHECK(!ssl_); 849 DCHECK(!ssl_);
825 DCHECK(!transport_bio_);
826 850
827 #if defined(USE_NSS_CERTS) 851 #if defined(USE_NSS_CERTS)
828 if (ssl_config_.cert_io_enabled) { 852 if (ssl_config_.cert_io_enabled) {
829 // TODO(davidben): Move this out of SSLClientSocket. See 853 // TODO(davidben): Move this out of SSLClientSocket. See
830 // https://crbug.com/539520. 854 // https://crbug.com/539520.
831 EnsureNSSHttpIOInit(); 855 EnsureNSSHttpIOInit();
832 } 856 }
833 #endif 857 #endif
834 858
835 SSLContext* context = SSLContext::GetInstance(); 859 SSLContext* context = SSLContext::GetInstance();
(...skipping 12 matching lines...) Expand all
848 if (!unused.AssignFromIPLiteral(host_and_port_.host()) && 872 if (!unused.AssignFromIPLiteral(host_and_port_.host()) &&
849 !SSL_set_tlsext_host_name(ssl_.get(), host_and_port_.host().c_str())) { 873 !SSL_set_tlsext_host_name(ssl_.get(), host_and_port_.host().c_str())) {
850 return ERR_UNEXPECTED; 874 return ERR_UNEXPECTED;
851 } 875 }
852 876
853 bssl::UniquePtr<SSL_SESSION> session = 877 bssl::UniquePtr<SSL_SESSION> session =
854 context->session_cache()->Lookup(GetSessionCacheKey()); 878 context->session_cache()->Lookup(GetSessionCacheKey());
855 if (session) 879 if (session)
856 SSL_set_session(ssl_.get(), session.get()); 880 SSL_set_session(ssl_.get(), session.get());
857 881
858 // Get read and write buffer sizes from field trials, if possible. If values 882 transport_adapter_.reset(new SocketBIOAdapter(
859 // not present, use default. Also make sure values are in reasonable range. 883 transport_->socket(), GetBufferSize("SSLBufferSizeRecv"),
860 int send_buffer_size = kDefaultOpenSSLBufferSize; 884 GetBufferSize("SSLBufferSizeSend"), this));
861 #if !defined(OS_NACL) 885 BIO* transport_bio = transport_adapter_->bio();
862 int override_send_buffer_size;
863 if (base::StringToInt(base::FieldTrialList::FindFullName("SSLBufferSizeSend"),
864 &override_send_buffer_size)) {
865 send_buffer_size = override_send_buffer_size;
866 send_buffer_size = std::max(send_buffer_size, 1000);
867 send_buffer_size =
868 std::min(send_buffer_size, 2 * kDefaultOpenSSLBufferSize);
869 }
870 #endif // !defined(OS_NACL)
871 send_buffer_ = new GrowableIOBuffer();
872 send_buffer_->SetCapacity(send_buffer_size);
873 886
874 int recv_buffer_size = kDefaultOpenSSLBufferSize; 887 BIO_up_ref(transport_bio); // SSL_set0_rbio takes ownership.
875 #if !defined(OS_NACL) 888 SSL_set0_rbio(ssl_.get(), transport_bio);
876 int override_recv_buffer_size;
877 if (base::StringToInt(base::FieldTrialList::FindFullName("SSLBufferSizeRecv"),
878 &override_recv_buffer_size)) {
879 recv_buffer_size = override_recv_buffer_size;
880 recv_buffer_size = std::max(recv_buffer_size, 1000);
881 recv_buffer_size =
882 std::min(recv_buffer_size, 2 * kDefaultOpenSSLBufferSize);
883 }
884 #endif // !defined(OS_NACL)
885 recv_buffer_ = new GrowableIOBuffer();
886 recv_buffer_->SetCapacity(recv_buffer_size);
887 889
888 BIO* ssl_bio = NULL; 890 BIO_up_ref(transport_bio); // SSL_set0_wbio takes ownership.
889 891 SSL_set0_wbio(ssl_.get(), transport_bio);
890 // SSLClientSocketImpl retains ownership of the BIO buffers.
891 BIO* transport_bio_raw;
892 if (!BIO_new_bio_pair_external_buf(
893 &ssl_bio, send_buffer_->capacity(),
894 reinterpret_cast<uint8_t*>(send_buffer_->data()), &transport_bio_raw,
895 recv_buffer_->capacity(),
896 reinterpret_cast<uint8_t*>(recv_buffer_->data())))
897 return ERR_UNEXPECTED;
898 transport_bio_.reset(transport_bio_raw);
899 DCHECK(ssl_bio);
900 DCHECK(transport_bio_);
901
902 // Install a callback on OpenSSL's end to plumb transport errors through.
903 BIO_set_callback(ssl_bio, &SSLClientSocketImpl::BIOCallback);
904 BIO_set_callback_arg(ssl_bio, reinterpret_cast<char*>(this));
905
906 SSL_set_bio(ssl_.get(), ssl_bio, ssl_bio);
907 892
908 DCHECK_LT(SSL3_VERSION, ssl_config_.version_min); 893 DCHECK_LT(SSL3_VERSION, ssl_config_.version_min);
909 DCHECK_LT(SSL3_VERSION, ssl_config_.version_max); 894 DCHECK_LT(SSL3_VERSION, ssl_config_.version_max);
910 if (!SSL_set_min_proto_version(ssl_.get(), ssl_config_.version_min) || 895 if (!SSL_set_min_proto_version(ssl_.get(), ssl_config_.version_min) ||
911 !SSL_set_max_proto_version(ssl_.get(), ssl_config_.version_max)) { 896 !SSL_set_max_proto_version(ssl_.get(), ssl_config_.version_max)) {
912 return ERR_UNEXPECTED; 897 return ERR_UNEXPECTED;
913 } 898 }
914 899
915 // OpenSSL defaults some options to on, others to off. To avoid ambiguity, 900 // OpenSSL defaults some options to on, others to off. To avoid ambiguity,
916 // set everything we care about to an absolute value. 901 // set everything we care about to an absolute value.
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
1024 void SSLClientSocketImpl::DoWriteCallback(int rv) { 1009 void SSLClientSocketImpl::DoWriteCallback(int rv) {
1025 // Since Run may result in Write being called, clear |user_write_callback_| 1010 // Since Run may result in Write being called, clear |user_write_callback_|
1026 // up front. 1011 // up front.
1027 if (rv > 0) 1012 if (rv > 0)
1028 was_ever_used_ = true; 1013 was_ever_used_ = true;
1029 user_write_buf_ = NULL; 1014 user_write_buf_ = NULL;
1030 user_write_buf_len_ = 0; 1015 user_write_buf_len_ = 0;
1031 base::ResetAndReturn(&user_write_callback_).Run(rv); 1016 base::ResetAndReturn(&user_write_callback_).Run(rv);
1032 } 1017 }
1033 1018
1034 bool SSLClientSocketImpl::DoTransportIO() {
1035 bool network_moved = false;
1036 int rv;
1037 // Read and write as much data as possible. The loop is necessary because
1038 // Write() may return synchronously.
1039 do {
1040 rv = BufferSend();
1041 if (rv != ERR_IO_PENDING && rv != 0)
1042 network_moved = true;
1043 } while (rv > 0);
1044 if (transport_read_error_ == OK && BufferRecv() != ERR_IO_PENDING)
1045 network_moved = true;
1046 return network_moved;
1047 }
1048
1049 // TODO(cbentzel): Remove including "base/threading/thread_local.h" and 1019 // TODO(cbentzel): Remove including "base/threading/thread_local.h" and
1050 // g_first_run_completed once crbug.com/424386 is fixed. 1020 // g_first_run_completed once crbug.com/424386 is fixed.
1051 base::LazyInstance<base::ThreadLocalBoolean>::Leaky g_first_run_completed = 1021 base::LazyInstance<base::ThreadLocalBoolean>::Leaky g_first_run_completed =
1052 LAZY_INSTANCE_INITIALIZER; 1022 LAZY_INSTANCE_INITIALIZER;
1053 1023
1054 int SSLClientSocketImpl::DoHandshake() { 1024 int SSLClientSocketImpl::DoHandshake() {
1055 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); 1025 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
1056 1026
1057 int rv; 1027 int rv;
1058 1028
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
1326 } 1296 }
1327 1297
1328 void SSLClientSocketImpl::OnHandshakeIOComplete(int result) { 1298 void SSLClientSocketImpl::OnHandshakeIOComplete(int result) {
1329 int rv = DoHandshakeLoop(result); 1299 int rv = DoHandshakeLoop(result);
1330 if (rv != ERR_IO_PENDING) { 1300 if (rv != ERR_IO_PENDING) {
1331 LogConnectEndEvent(rv); 1301 LogConnectEndEvent(rv);
1332 DoConnectCallback(rv); 1302 DoConnectCallback(rv);
1333 } 1303 }
1334 } 1304 }
1335 1305
1336 void SSLClientSocketImpl::OnSendComplete(int result) {
1337 if (next_handshake_state_ == STATE_HANDSHAKE) {
1338 // In handshake phase.
1339 OnHandshakeIOComplete(result);
1340 return;
1341 }
1342
1343 // During a renegotiation, a Read call may also be blocked on a transport
1344 // write, so retry both operations.
1345 PumpReadWriteEvents();
1346 }
1347
1348 void SSLClientSocketImpl::OnRecvComplete(int result) {
1349 TRACE_EVENT0("net", "SSLClientSocketImpl::OnRecvComplete");
1350 if (next_handshake_state_ == STATE_HANDSHAKE) {
1351 // In handshake phase.
1352 OnHandshakeIOComplete(result);
1353 return;
1354 }
1355
1356 // Network layer received some data, check if client requested to read
1357 // decrypted data.
1358 if (!user_read_buf_.get())
1359 return;
1360
1361 int rv = DoReadLoop();
1362 if (rv != ERR_IO_PENDING)
1363 DoReadCallback(rv);
1364 }
1365
1366 int SSLClientSocketImpl::DoHandshakeLoop(int last_io_result) { 1306 int SSLClientSocketImpl::DoHandshakeLoop(int last_io_result) {
1367 TRACE_EVENT0("net", "SSLClientSocketImpl::DoHandshakeLoop"); 1307 TRACE_EVENT0("net", "SSLClientSocketImpl::DoHandshakeLoop");
1368 int rv = last_io_result; 1308 int rv = last_io_result;
1369 do { 1309 do {
1370 // Default to STATE_NONE for next state. 1310 // Default to STATE_NONE for next state.
1371 // (This is a quirk carried over from the windows 1311 // (This is a quirk carried over from the windows
1372 // implementation. It makes reading the logs a bit harder.) 1312 // implementation. It makes reading the logs a bit harder.)
1373 // State handlers can and often do call GotoState just 1313 // State handlers can and often do call GotoState just
1374 // to stay in the current state. 1314 // to stay in the current state.
1375 State state = next_handshake_state_; 1315 State state = next_handshake_state_;
(...skipping 18 matching lines...) Expand all
1394 break; 1334 break;
1395 case STATE_VERIFY_CERT_COMPLETE: 1335 case STATE_VERIFY_CERT_COMPLETE:
1396 rv = DoVerifyCertComplete(rv); 1336 rv = DoVerifyCertComplete(rv);
1397 break; 1337 break;
1398 case STATE_NONE: 1338 case STATE_NONE:
1399 default: 1339 default:
1400 rv = ERR_UNEXPECTED; 1340 rv = ERR_UNEXPECTED;
1401 NOTREACHED() << "unexpected state" << state; 1341 NOTREACHED() << "unexpected state" << state;
1402 break; 1342 break;
1403 } 1343 }
1404
1405 bool network_moved = DoTransportIO();
1406 if (network_moved && next_handshake_state_ == STATE_HANDSHAKE) {
1407 // In general we exit the loop if rv is ERR_IO_PENDING. In this
1408 // special case we keep looping even if rv is ERR_IO_PENDING because
1409 // the transport IO may allow DoHandshake to make progress.
1410 rv = OK; // This causes us to stay in the loop.
1411 }
1412 } while (rv != ERR_IO_PENDING && next_handshake_state_ != STATE_NONE); 1344 } while (rv != ERR_IO_PENDING && next_handshake_state_ != STATE_NONE);
1413 return rv; 1345 return rv;
1414 } 1346 }
1415 1347
1416 int SSLClientSocketImpl::DoReadLoop() {
1417 bool network_moved;
1418 int rv;
1419 do {
1420 rv = DoPayloadRead();
1421 network_moved = DoTransportIO();
1422 } while (rv == ERR_IO_PENDING && network_moved);
1423
1424 return rv;
1425 }
1426
1427 int SSLClientSocketImpl::DoWriteLoop() {
1428 bool network_moved;
1429 int rv;
1430 do {
1431 rv = DoPayloadWrite();
1432 network_moved = DoTransportIO();
1433 } while (rv == ERR_IO_PENDING && network_moved);
1434
1435 return rv;
1436 }
1437
1438 int SSLClientSocketImpl::DoPayloadRead() { 1348 int SSLClientSocketImpl::DoPayloadRead() {
1439 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); 1349 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
1440 1350
1441 DCHECK_LT(0, user_read_buf_len_); 1351 DCHECK_LT(0, user_read_buf_len_);
1442 DCHECK(user_read_buf_.get()); 1352 DCHECK(user_read_buf_.get());
1443 1353
1444 int rv; 1354 int rv;
1445 if (pending_read_error_ != kNoPendingResult) { 1355 if (pending_read_error_ != kNoPendingResult) {
1446 rv = pending_read_error_; 1356 rv = pending_read_error_;
1447 pending_read_error_ = kNoPendingResult; 1357 pending_read_error_ = kNoPendingResult;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1504 pending_read_error_ = 0; 1414 pending_read_error_ = 0;
1505 } 1415 }
1506 1416
1507 if (total_bytes_read > 0) { 1417 if (total_bytes_read > 0) {
1508 // Return any bytes read to the caller. The error will be deferred to the 1418 // Return any bytes read to the caller. The error will be deferred to the
1509 // next call of DoPayloadRead. 1419 // next call of DoPayloadRead.
1510 rv = total_bytes_read; 1420 rv = total_bytes_read;
1511 1421
1512 // Do not treat insufficient data as an error to return in the next call to 1422 // Do not treat insufficient data as an error to return in the next call to
1513 // DoPayloadRead() - instead, let the call fall through to check SSL_read() 1423 // DoPayloadRead() - instead, let the call fall through to check SSL_read()
1514 // again. This is because DoTransportIO() may complete in between the next 1424 // again. The transport may have data available by then.
1515 // call to DoPayloadRead(), and thus it is important to check SSL_read() on
1516 // subsequent invocations to see if a complete record may now be read.
1517 if (pending_read_error_ == ERR_IO_PENDING) 1425 if (pending_read_error_ == ERR_IO_PENDING)
1518 pending_read_error_ = kNoPendingResult; 1426 pending_read_error_ = kNoPendingResult;
1519 } else { 1427 } else {
1520 // No bytes were returned. Return the pending read error immediately. 1428 // No bytes were returned. Return the pending read error immediately.
1521 DCHECK_NE(kNoPendingResult, pending_read_error_); 1429 DCHECK_NE(kNoPendingResult, pending_read_error_);
1522 rv = pending_read_error_; 1430 rv = pending_read_error_;
1523 pending_read_error_ = kNoPendingResult; 1431 pending_read_error_ = kNoPendingResult;
1524 } 1432 }
1525 1433
1526 if (rv >= 0) { 1434 if (rv >= 0) {
(...skipping 27 matching lines...) Expand all
1554 int net_error = MapLastOpenSSLError(ssl_error, err_tracer, &error_info); 1462 int net_error = MapLastOpenSSLError(ssl_error, err_tracer, &error_info);
1555 1463
1556 if (net_error != ERR_IO_PENDING) { 1464 if (net_error != ERR_IO_PENDING) {
1557 net_log_.AddEvent( 1465 net_log_.AddEvent(
1558 NetLogEventType::SSL_WRITE_ERROR, 1466 NetLogEventType::SSL_WRITE_ERROR,
1559 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info)); 1467 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info));
1560 } 1468 }
1561 return net_error; 1469 return net_error;
1562 } 1470 }
1563 1471
1564 void SSLClientSocketImpl::PumpReadWriteEvents() { 1472 void SSLClientSocketImpl::RetryAllOperations() {
1473 // SSL_do_handshake, SSL_read, and SSL_write may all be retried when blocked,
1474 // so retry all operations for simplicity. (Otherwise, SSL_get_error for each
1475 // operation may be remembered to retry only the blocked ones.)
1476
1477 if (next_handshake_state_ == STATE_HANDSHAKE) {
1478 // In handshake phase. The parameter to OnHandshakeIOComplete is unused.
1479 OnHandshakeIOComplete(OK);
1480 return;
1481 }
1482
1565 int rv_read = ERR_IO_PENDING; 1483 int rv_read = ERR_IO_PENDING;
1566 int rv_write = ERR_IO_PENDING; 1484 int rv_write = ERR_IO_PENDING;
1567 bool network_moved; 1485 if (user_read_buf_)
1568 do { 1486 rv_read = DoPayloadRead();
1569 if (user_read_buf_.get()) 1487 if (user_write_buf_)
1570 rv_read = DoPayloadRead(); 1488 rv_write = DoPayloadWrite();
1571 if (user_write_buf_.get())
1572 rv_write = DoPayloadWrite();
1573 network_moved = DoTransportIO();
1574 } while (rv_read == ERR_IO_PENDING && rv_write == ERR_IO_PENDING &&
1575 (user_read_buf_.get() || user_write_buf_.get()) && network_moved);
1576 1489
1577 // Performing the Read callback may cause |this| to be deleted. If this 1490 // Performing the Read callback may cause |this| to be deleted. If this
1578 // happens, the Write callback should not be invoked. Guard against this by 1491 // happens, the Write callback should not be invoked. Guard against this by
1579 // holding a WeakPtr to |this| and ensuring it's still valid. 1492 // holding a WeakPtr to |this| and ensuring it's still valid.
1580 base::WeakPtr<SSLClientSocketImpl> guard(weak_factory_.GetWeakPtr()); 1493 base::WeakPtr<SSLClientSocketImpl> guard(weak_factory_.GetWeakPtr());
1581 if (user_read_buf_.get() && rv_read != ERR_IO_PENDING) 1494 if (rv_read != ERR_IO_PENDING)
1582 DoReadCallback(rv_read); 1495 DoReadCallback(rv_read);
1583 1496
1584 if (!guard.get()) 1497 if (!guard.get())
1585 return; 1498 return;
1586 1499
1587 if (user_write_buf_.get() && rv_write != ERR_IO_PENDING) 1500 if (rv_write != ERR_IO_PENDING)
1588 DoWriteCallback(rv_write); 1501 DoWriteCallback(rv_write);
1589 } 1502 }
1590 1503
1591 int SSLClientSocketImpl::BufferSend(void) {
1592 if (transport_send_busy_)
1593 return ERR_IO_PENDING;
1594
1595 size_t buffer_read_offset;
1596 uint8_t* read_buf;
1597 size_t max_read;
1598 int status = BIO_zero_copy_get_read_buf(transport_bio_.get(), &read_buf,
1599 &buffer_read_offset, &max_read);
1600 DCHECK_EQ(status, 1); // Should never fail.
1601 if (!max_read)
1602 return 0; // Nothing pending in the OpenSSL write BIO.
1603 CHECK_EQ(read_buf, reinterpret_cast<uint8_t*>(send_buffer_->StartOfBuffer()));
1604 CHECK_LT(buffer_read_offset, static_cast<size_t>(send_buffer_->capacity()));
1605 send_buffer_->set_offset(buffer_read_offset);
1606
1607 int rv = transport_->socket()->Write(
1608 send_buffer_.get(), max_read,
1609 base::Bind(&SSLClientSocketImpl::BufferSendComplete,
1610 base::Unretained(this)));
1611 if (rv == ERR_IO_PENDING) {
1612 transport_send_busy_ = true;
1613 } else {
1614 TransportWriteComplete(rv);
1615 }
1616 return rv;
1617 }
1618
1619 int SSLClientSocketImpl::BufferRecv(void) {
1620 if (transport_recv_busy_)
1621 return ERR_IO_PENDING;
1622
1623 // Determine how much was requested from |transport_bio_| that was not
1624 // actually available.
1625 size_t requested = BIO_ctrl_get_read_request(transport_bio_.get());
1626 if (requested == 0) {
1627 // This is not a perfect match of error codes, as no operation is
1628 // actually pending. However, returning 0 would be interpreted as
1629 // a possible sign of EOF, which is also an inappropriate match.
1630 return ERR_IO_PENDING;
1631 }
1632
1633 // Known Issue: While only reading |requested| data is the more correct
1634 // implementation, it has the downside of resulting in frequent reads:
1635 // One read for the SSL record header (~5 bytes) and one read for the SSL
1636 // record body. Rather than issuing these reads to the underlying socket
1637 // (and constantly allocating new IOBuffers), a single Read() request to
1638 // fill |transport_bio_| is issued. As long as an SSL client socket cannot
1639 // be gracefully shutdown (via SSL close alerts) and re-used for non-SSL
1640 // traffic, this over-subscribed Read()ing will not cause issues.
1641
1642 size_t buffer_write_offset;
1643 uint8_t* write_buf;
1644 size_t max_write;
1645 int status = BIO_zero_copy_get_write_buf(transport_bio_.get(), &write_buf,
1646 &buffer_write_offset, &max_write);
1647 DCHECK_EQ(status, 1); // Should never fail.
1648 if (!max_write)
1649 return ERR_IO_PENDING;
1650
1651 CHECK_EQ(write_buf,
1652 reinterpret_cast<uint8_t*>(recv_buffer_->StartOfBuffer()));
1653 CHECK_LT(buffer_write_offset, static_cast<size_t>(recv_buffer_->capacity()));
1654
1655 recv_buffer_->set_offset(buffer_write_offset);
1656 int rv = transport_->socket()->Read(
1657 recv_buffer_.get(), max_write,
1658 base::Bind(&SSLClientSocketImpl::BufferRecvComplete,
1659 base::Unretained(this)));
1660 if (rv == ERR_IO_PENDING) {
1661 transport_recv_busy_ = true;
1662 } else {
1663 rv = TransportReadComplete(rv);
1664 }
1665 return rv;
1666 }
1667
1668 void SSLClientSocketImpl::BufferSendComplete(int result) {
1669 TransportWriteComplete(result);
1670 OnSendComplete(result);
1671 }
1672
1673 void SSLClientSocketImpl::BufferRecvComplete(int result) {
1674 result = TransportReadComplete(result);
1675 OnRecvComplete(result);
1676 }
1677
1678 void SSLClientSocketImpl::TransportWriteComplete(int result) {
1679 DCHECK(ERR_IO_PENDING != result);
1680 int bytes_written = 0;
1681 if (result < 0) {
1682 // Record the error. Save it to be reported in a future read or write on
1683 // transport_bio_'s peer.
1684 transport_write_error_ = result;
1685 } else {
1686 bytes_written = result;
1687 }
1688 DCHECK_GE(send_buffer_->RemainingCapacity(), bytes_written);
1689 int ret =
1690 BIO_zero_copy_get_read_buf_done(transport_bio_.get(), bytes_written);
1691 DCHECK_EQ(1, ret);
1692 transport_send_busy_ = false;
1693 }
1694
1695 int SSLClientSocketImpl::TransportReadComplete(int result) {
1696 DCHECK(ERR_IO_PENDING != result);
1697 // If an EOF, canonicalize to ERR_CONNECTION_CLOSED here so MapOpenSSLError
1698 // does not report success.
1699 if (result == 0)
1700 result = ERR_CONNECTION_CLOSED;
1701 int bytes_read = 0;
1702 if (result < 0) {
1703 // Received an error. Save it to be reported in a future read on
1704 // transport_bio_'s peer.
1705 transport_read_error_ = result;
1706 } else {
1707 bytes_read = result;
1708 }
1709 DCHECK_GE(recv_buffer_->RemainingCapacity(), bytes_read);
1710 int ret = BIO_zero_copy_get_write_buf_done(transport_bio_.get(), bytes_read);
1711 DCHECK_EQ(1, ret);
1712 transport_recv_busy_ = false;
1713 return result;
1714 }
1715
1716 int SSLClientSocketImpl::VerifyCT() { 1504 int SSLClientSocketImpl::VerifyCT() {
1717 const uint8_t* sct_list_raw; 1505 const uint8_t* sct_list_raw;
1718 size_t sct_list_len; 1506 size_t sct_list_len;
1719 SSL_get0_signed_cert_timestamp_list(ssl_.get(), &sct_list_raw, &sct_list_len); 1507 SSL_get0_signed_cert_timestamp_list(ssl_.get(), &sct_list_raw, &sct_list_len);
1720 std::string sct_list; 1508 std::string sct_list;
1721 if (sct_list_len > 0) 1509 if (sct_list_len > 0)
1722 sct_list.assign(reinterpret_cast<const char*>(sct_list_raw), sct_list_len); 1510 sct_list.assign(reinterpret_cast<const char*>(sct_list_raw), sct_list_len);
1723 1511
1724 // Note that this is a completely synchronous operation: The CT Log Verifier 1512 // Note that this is a completely synchronous operation: The CT Log Verifier
1725 // gets all the data it needs for SCT verification and does not do any 1513 // gets all the data it needs for SCT verification and does not do any
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
1905 return 0; 1693 return 0;
1906 } 1694 }
1907 if (old_der != new_der) { 1695 if (old_der != new_der) {
1908 LOG(ERROR) << "Server certificate changed between handshakes"; 1696 LOG(ERROR) << "Server certificate changed between handshakes";
1909 return 0; 1697 return 0;
1910 } 1698 }
1911 1699
1912 return 1; 1700 return 1;
1913 } 1701 }
1914 1702
1915 long SSLClientSocketImpl::MaybeReplayTransportError(BIO* bio,
1916 int cmd,
1917 const char* argp,
1918 int argi,
1919 long argl,
1920 long retvalue) {
1921 if (cmd == (BIO_CB_READ | BIO_CB_RETURN) && retvalue <= 0) {
1922 // If there is no more data in the buffer, report any pending errors that
1923 // were observed. Note that both the readbuf and the writebuf are checked
1924 // for errors, since the application may have encountered a socket error
1925 // while writing that would otherwise not be reported until the application
1926 // attempted to write again - which it may never do. See
1927 // https://crbug.com/249848.
1928 if (transport_read_error_ != OK) {
1929 OpenSSLPutNetError(FROM_HERE, transport_read_error_);
1930 return -1;
1931 }
1932 if (transport_write_error_ != OK) {
1933 OpenSSLPutNetError(FROM_HERE, transport_write_error_);
1934 return -1;
1935 }
1936 } else if (cmd == BIO_CB_WRITE) {
1937 // Because of the write buffer, this reports a failure from the previous
1938 // write payload. If the current payload fails to write, the error will be
1939 // reported in a future write or read to |bio|.
1940 if (transport_write_error_ != OK) {
1941 OpenSSLPutNetError(FROM_HERE, transport_write_error_);
1942 return -1;
1943 }
1944 }
1945 return retvalue;
1946 }
1947
1948 // static
1949 long SSLClientSocketImpl::BIOCallback(BIO* bio,
1950 int cmd,
1951 const char* argp,
1952 int argi,
1953 long argl,
1954 long retvalue) {
1955 SSLClientSocketImpl* socket =
1956 reinterpret_cast<SSLClientSocketImpl*>(BIO_get_callback_arg(bio));
1957 CHECK(socket);
1958 return socket->MaybeReplayTransportError(bio, cmd, argp, argi, argl,
1959 retvalue);
1960 }
1961
1962 void SSLClientSocketImpl::MaybeCacheSession() { 1703 void SSLClientSocketImpl::MaybeCacheSession() {
1963 // Only cache the session once both a new session has been established and the 1704 // Only cache the session once both a new session has been established and the
1964 // certificate has been verified. Due to False Start, these events may happen 1705 // certificate has been verified. Due to False Start, these events may happen
1965 // in either order. 1706 // in either order.
1966 if (!pending_session_ || !certificate_verified_) 1707 if (!pending_session_ || !certificate_verified_)
1967 return; 1708 return;
1968 1709
1969 SSLContext::GetInstance()->session_cache()->Insert(GetSessionCacheKey(), 1710 SSLContext::GetInstance()->session_cache()->Insert(GetSessionCacheKey(),
1970 pending_session_.get()); 1711 pending_session_.get());
1971 pending_session_ = nullptr; 1712 pending_session_ = nullptr;
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
2090 DCHECK_EQ(ERR_IO_PENDING, signature_result_); 1831 DCHECK_EQ(ERR_IO_PENDING, signature_result_);
2091 DCHECK(signature_.empty()); 1832 DCHECK(signature_.empty());
2092 DCHECK(ssl_config_.client_private_key); 1833 DCHECK(ssl_config_.client_private_key);
2093 1834
2094 net_log_.EndEventWithNetErrorCode(NetLogEventType::SSL_PRIVATE_KEY_OP, error); 1835 net_log_.EndEventWithNetErrorCode(NetLogEventType::SSL_PRIVATE_KEY_OP, error);
2095 1836
2096 signature_result_ = error; 1837 signature_result_ = error;
2097 if (signature_result_ == OK) 1838 if (signature_result_ == OK)
2098 signature_ = signature; 1839 signature_ = signature;
2099 1840
2100 if (next_handshake_state_ == STATE_HANDSHAKE) {
2101 OnHandshakeIOComplete(signature_result_);
2102 return;
2103 }
2104
2105 // During a renegotiation, either Read or Write calls may be blocked on an 1841 // During a renegotiation, either Read or Write calls may be blocked on an
2106 // asynchronous private key operation. 1842 // asynchronous private key operation.
2107 PumpReadWriteEvents(); 1843 RetryAllOperations();
2108 } 1844 }
2109 1845
2110 int SSLClientSocketImpl::TokenBindingAdd(const uint8_t** out, 1846 int SSLClientSocketImpl::TokenBindingAdd(const uint8_t** out,
2111 size_t* out_len, 1847 size_t* out_len,
2112 int* out_alert_value) { 1848 int* out_alert_value) {
2113 if (ssl_config_.token_binding_params.empty()) { 1849 if (ssl_config_.token_binding_params.empty()) {
2114 return 0; 1850 return 0;
2115 } 1851 }
2116 bssl::ScopedCBB output; 1852 bssl::ScopedCBB output;
2117 CBB parameters_list; 1853 CBB parameters_list;
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
2255 if (ERR_GET_REASON(info->error_code) == SSL_R_TLSV1_ALERT_ACCESS_DENIED && 1991 if (ERR_GET_REASON(info->error_code) == SSL_R_TLSV1_ALERT_ACCESS_DENIED &&
2256 !certificate_requested_) { 1992 !certificate_requested_) {
2257 net_error = ERR_SSL_PROTOCOL_ERROR; 1993 net_error = ERR_SSL_PROTOCOL_ERROR;
2258 } 1994 }
2259 } 1995 }
2260 1996
2261 return net_error; 1997 return net_error;
2262 } 1998 }
2263 1999
2264 } // namespace net 2000 } // namespace net
OLDNEW
« no previous file with comments | « net/socket/ssl_client_socket_impl.h ('k') | net/socket/ssl_client_socket_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698