| Index: net/socket/ssl_client_socket_openssl.cc
|
| ===================================================================
|
| --- net/socket/ssl_client_socket_openssl.cc (revision 137212)
|
| +++ net/socket/ssl_client_socket_openssl.cc (working copy)
|
| @@ -416,6 +416,7 @@
|
| const SSLClientSocketContext& context)
|
| : transport_send_busy_(false),
|
| transport_recv_busy_(false),
|
| + transport_eof_(false),
|
| completed_handshake_(false),
|
| client_auth_cert_needed_(false),
|
| cert_verifier_(context.cert_verifier),
|
| @@ -718,6 +719,7 @@
|
| transport_send_busy_ = false;
|
| send_buffer_ = NULL;
|
| transport_recv_busy_ = false;
|
| + transport_eof_ = false;
|
| recv_buffer_ = NULL;
|
|
|
| user_connect_callback_.Reset();
|
| @@ -953,11 +955,15 @@
|
| return server_cert_;
|
| }
|
|
|
| +// TODO(wtc): port the ssl_client_socket_nss.cc change in
|
| +// http://codereview.chromium.org/7399025 to this file.
|
| bool SSLClientSocketOpenSSL::DoTransportIO() {
|
| bool network_moved = false;
|
| int nsent = BufferSend();
|
| + bool reached_eof = transport_eof_;
|
| int nreceived = BufferRecv();
|
| - network_moved = (nsent > 0 || nreceived >= 0);
|
| + if (nsent > 0 || nreceived > 0 || (!reached_eof && nreceived == 0))
|
| + network_moved = true;
|
| return network_moved;
|
| }
|
|
|
| @@ -1050,6 +1056,8 @@
|
| // Received 0 (end of file) or an error. Either way, bubble it up to the
|
| // SSL layer via the BIO. TODO(joth): consider stashing the error code, to
|
| // relay up to the SSL socket client (i.e. via DoReadCallback).
|
| + if (result == 0)
|
| + transport_eof_ = true;
|
| BIO_set_mem_eof_return(transport_bio_, 0);
|
| (void)BIO_shutdown_wr(transport_bio_);
|
| } else {
|
| @@ -1098,6 +1106,7 @@
|
| network_moved = DoTransportIO();
|
| } while (rv_read == ERR_IO_PENDING &&
|
| rv_write == ERR_IO_PENDING &&
|
| + (user_read_buf_ || user_write_buf_) &&
|
| network_moved);
|
|
|
| if (user_read_buf_ && rv_read != ERR_IO_PENDING)
|
|
|