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

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

Issue 10391174: Port two SSLClientSocketNSS fixes to SSLClientSocketOpenSSL. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Remove the unnecessary loop around BufferSend in DoTransportIO Created 8 years, 7 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/socket/ssl_client_socket_openssl.h ('k') | no next file » | 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/ssl.h> 10 #include <openssl/ssl.h>
(...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 context->session_cache()->Flush(); 409 context->session_cache()->Flush();
410 } 410 }
411 411
412 SSLClientSocketOpenSSL::SSLClientSocketOpenSSL( 412 SSLClientSocketOpenSSL::SSLClientSocketOpenSSL(
413 ClientSocketHandle* transport_socket, 413 ClientSocketHandle* transport_socket,
414 const HostPortPair& host_and_port, 414 const HostPortPair& host_and_port,
415 const SSLConfig& ssl_config, 415 const SSLConfig& ssl_config,
416 const SSLClientSocketContext& context) 416 const SSLClientSocketContext& context)
417 : transport_send_busy_(false), 417 : transport_send_busy_(false),
418 transport_recv_busy_(false), 418 transport_recv_busy_(false),
419 transport_recv_eof_(false),
419 completed_handshake_(false), 420 completed_handshake_(false),
420 client_auth_cert_needed_(false), 421 client_auth_cert_needed_(false),
421 cert_verifier_(context.cert_verifier), 422 cert_verifier_(context.cert_verifier),
422 ssl_(NULL), 423 ssl_(NULL),
423 transport_bio_(NULL), 424 transport_bio_(NULL),
424 transport_(transport_socket), 425 transport_(transport_socket),
425 host_and_port_(host_and_port), 426 host_and_port_(host_and_port),
426 ssl_config_(ssl_config), 427 ssl_config_(ssl_config),
427 ssl_session_cache_shard_(context.ssl_session_cache_shard), 428 ssl_session_cache_shard_(context.ssl_session_cache_shard),
428 trying_cached_session_(false), 429 trying_cached_session_(false),
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
711 } 712 }
712 713
713 // Shut down anything that may call us back. 714 // Shut down anything that may call us back.
714 verifier_.reset(); 715 verifier_.reset();
715 transport_->socket()->Disconnect(); 716 transport_->socket()->Disconnect();
716 717
717 // Null all callbacks, delete all buffers. 718 // Null all callbacks, delete all buffers.
718 transport_send_busy_ = false; 719 transport_send_busy_ = false;
719 send_buffer_ = NULL; 720 send_buffer_ = NULL;
720 transport_recv_busy_ = false; 721 transport_recv_busy_ = false;
722 transport_recv_eof_ = false;
721 recv_buffer_ = NULL; 723 recv_buffer_ = NULL;
722 724
723 user_connect_callback_.Reset(); 725 user_connect_callback_.Reset();
724 user_read_callback_.Reset(); 726 user_read_callback_.Reset();
725 user_write_callback_.Reset(); 727 user_write_callback_.Reset();
726 user_read_buf_ = NULL; 728 user_read_buf_ = NULL;
727 user_read_buf_len_ = 0; 729 user_read_buf_len_ = 0;
728 user_write_buf_ = NULL; 730 user_write_buf_ = NULL;
729 user_write_buf_len_ = 0; 731 user_write_buf_len_ = 0;
730 732
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
948 intermediates.push_back(sk_X509_value(chain, i)); 950 intermediates.push_back(sk_X509_value(chain, i));
949 } 951 }
950 server_cert_ = X509Certificate::CreateFromHandle(cert.get(), intermediates); 952 server_cert_ = X509Certificate::CreateFromHandle(cert.get(), intermediates);
951 DCHECK(server_cert_); 953 DCHECK(server_cert_);
952 954
953 return server_cert_; 955 return server_cert_;
954 } 956 }
955 957
956 bool SSLClientSocketOpenSSL::DoTransportIO() { 958 bool SSLClientSocketOpenSSL::DoTransportIO() {
957 bool network_moved = false; 959 bool network_moved = false;
958 int nsent = BufferSend(); 960 if (BufferSend() > 0)
959 int nreceived = BufferRecv(); 961 network_moved = true;
960 network_moved = (nsent > 0 || nreceived >= 0); 962 if (!transport_recv_eof_ && BufferRecv() >= 0)
963 network_moved = true;
961 return network_moved; 964 return network_moved;
962 } 965 }
963 966
964 int SSLClientSocketOpenSSL::BufferSend(void) { 967 int SSLClientSocketOpenSSL::BufferSend(void) {
965 if (transport_send_busy_) 968 if (transport_send_busy_)
966 return ERR_IO_PENDING; 969 return ERR_IO_PENDING;
967 970
968 if (!send_buffer_) { 971 if (!send_buffer_) {
969 // Get a fresh send buffer out of the send BIO. 972 // Get a fresh send buffer out of the send BIO.
970 size_t max_read = BIO_ctrl_pending(transport_bio_); 973 size_t max_read = BIO_ctrl_pending(transport_bio_);
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
1043 OnRecvComplete(result); 1046 OnRecvComplete(result);
1044 } 1047 }
1045 1048
1046 void SSLClientSocketOpenSSL::TransportReadComplete(int result) { 1049 void SSLClientSocketOpenSSL::TransportReadComplete(int result) {
1047 DCHECK(ERR_IO_PENDING != result); 1050 DCHECK(ERR_IO_PENDING != result);
1048 if (result <= 0) { 1051 if (result <= 0) {
1049 DVLOG(1) << "TransportReadComplete result " << result; 1052 DVLOG(1) << "TransportReadComplete result " << result;
1050 // Received 0 (end of file) or an error. Either way, bubble it up to the 1053 // Received 0 (end of file) or an error. Either way, bubble it up to the
1051 // SSL layer via the BIO. TODO(joth): consider stashing the error code, to 1054 // SSL layer via the BIO. TODO(joth): consider stashing the error code, to
1052 // relay up to the SSL socket client (i.e. via DoReadCallback). 1055 // relay up to the SSL socket client (i.e. via DoReadCallback).
1056 if (result == 0)
1057 transport_recv_eof_ = true;
1053 BIO_set_mem_eof_return(transport_bio_, 0); 1058 BIO_set_mem_eof_return(transport_bio_, 0);
1054 (void)BIO_shutdown_wr(transport_bio_); 1059 (void)BIO_shutdown_wr(transport_bio_);
1055 } else { 1060 } else {
1056 DCHECK(recv_buffer_); 1061 DCHECK(recv_buffer_);
1057 int ret = BIO_write(transport_bio_, recv_buffer_->data(), result); 1062 int ret = BIO_write(transport_bio_, recv_buffer_->data(), result);
1058 // A write into a memory BIO should always succeed. 1063 // A write into a memory BIO should always succeed.
1059 CHECK_EQ(result, ret); 1064 CHECK_EQ(result, ret);
1060 } 1065 }
1061 recv_buffer_ = NULL; 1066 recv_buffer_ = NULL;
1062 transport_recv_busy_ = false; 1067 transport_recv_busy_ = false;
(...skipping 28 matching lines...) Expand all
1091 int rv_write = ERR_IO_PENDING; 1096 int rv_write = ERR_IO_PENDING;
1092 bool network_moved; 1097 bool network_moved;
1093 do { 1098 do {
1094 if (user_read_buf_) 1099 if (user_read_buf_)
1095 rv_read = DoPayloadRead(); 1100 rv_read = DoPayloadRead();
1096 if (user_write_buf_) 1101 if (user_write_buf_)
1097 rv_write = DoPayloadWrite(); 1102 rv_write = DoPayloadWrite();
1098 network_moved = DoTransportIO(); 1103 network_moved = DoTransportIO();
1099 } while (rv_read == ERR_IO_PENDING && 1104 } while (rv_read == ERR_IO_PENDING &&
1100 rv_write == ERR_IO_PENDING && 1105 rv_write == ERR_IO_PENDING &&
1106 (user_read_buf_ || user_write_buf_) &&
1101 network_moved); 1107 network_moved);
1102 1108
1103 if (user_read_buf_ && rv_read != ERR_IO_PENDING) 1109 if (user_read_buf_ && rv_read != ERR_IO_PENDING)
1104 DoReadCallback(rv_read); 1110 DoReadCallback(rv_read);
1105 if (user_write_buf_ && rv_write != ERR_IO_PENDING) 1111 if (user_write_buf_ && rv_write != ERR_IO_PENDING)
1106 DoWriteCallback(rv_write); 1112 DoWriteCallback(rv_write);
1107 } 1113 }
1108 1114
1109 void SSLClientSocketOpenSSL::OnRecvComplete(int result) { 1115 void SSLClientSocketOpenSSL::OnRecvComplete(int result) {
1110 if (next_handshake_state_ == STATE_HANDSHAKE) { 1116 if (next_handshake_state_ == STATE_HANDSHAKE) {
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
1293 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv, 1299 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv,
1294 user_write_buf_->data()); 1300 user_write_buf_->data());
1295 return rv; 1301 return rv;
1296 } 1302 }
1297 1303
1298 int err = SSL_get_error(ssl_, rv); 1304 int err = SSL_get_error(ssl_, rv);
1299 return MapOpenSSLError(err, err_tracer); 1305 return MapOpenSSLError(err, err_tracer);
1300 } 1306 }
1301 1307
1302 } // namespace net 1308 } // namespace net
OLDNEW
« no previous file with comments | « net/socket/ssl_client_socket_openssl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698