| Index: net/socket/ssl_client_socket_nss.cc
|
| diff --git a/net/socket/ssl_client_socket_nss.cc b/net/socket/ssl_client_socket_nss.cc
|
| index e1ac396ddca57605860c9225718862f4258f029a..2863181db725c0a39d6aea14b946bc88dcddc6d1 100644
|
| --- a/net/socket/ssl_client_socket_nss.cc
|
| +++ b/net/socket/ssl_client_socket_nss.cc
|
| @@ -447,7 +447,7 @@ SSLClientSocketNSS::SSLClientSocketNSS(ClientSocketHandle* transport_socket,
|
| host_and_port_(host_and_port),
|
| ssl_config_(ssl_config),
|
| old_user_connect_callback_(NULL),
|
| - user_read_callback_(NULL),
|
| + old_user_read_callback_(NULL),
|
| user_write_callback_(NULL),
|
| user_read_buf_len_(0),
|
| user_write_buf_len_(0),
|
| @@ -576,7 +576,7 @@ int SSLClientSocketNSS::Connect(OldCompletionCallback* callback) {
|
| EnterFunction("");
|
| DCHECK(transport_.get());
|
| DCHECK(next_handshake_state_ == STATE_NONE);
|
| - DCHECK(!user_read_callback_);
|
| + DCHECK(!old_user_read_callback_);
|
| DCHECK(!user_write_callback_);
|
| DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null());
|
| DCHECK(!user_read_buf_);
|
| @@ -624,7 +624,7 @@ int SSLClientSocketNSS::Connect(const CompletionCallback& callback) {
|
| EnterFunction("");
|
| DCHECK(transport_.get());
|
| DCHECK(next_handshake_state_ == STATE_NONE);
|
| - DCHECK(!user_read_callback_);
|
| + DCHECK(!old_user_read_callback_);
|
| DCHECK(!user_write_callback_);
|
| DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null());
|
| DCHECK(!user_read_buf_);
|
| @@ -695,7 +695,8 @@ void SSLClientSocketNSS::Disconnect() {
|
| transport_recv_busy_ = false;
|
| old_user_connect_callback_ = NULL;
|
| user_connect_callback_.Reset();
|
| - user_read_callback_ = NULL;
|
| + old_user_read_callback_ = NULL;
|
| + user_read_callback_.Reset();
|
| user_write_callback_ = NULL;
|
| user_read_buf_ = NULL;
|
| user_read_buf_len_ = 0;
|
| @@ -815,7 +816,31 @@ int SSLClientSocketNSS::Read(IOBuffer* buf, int buf_len,
|
| EnterFunction(buf_len);
|
| DCHECK(completed_handshake_);
|
| DCHECK(next_handshake_state_ == STATE_NONE);
|
| - DCHECK(!user_read_callback_);
|
| + DCHECK(!old_user_read_callback_ && user_read_callback_.is_null());
|
| + DCHECK(!old_user_connect_callback_);
|
| + DCHECK(!user_read_buf_);
|
| + DCHECK(nss_bufs_);
|
| +
|
| + user_read_buf_ = buf;
|
| + user_read_buf_len_ = buf_len;
|
| +
|
| + int rv = DoReadLoop(OK);
|
| +
|
| + if (rv == ERR_IO_PENDING) {
|
| + old_user_read_callback_ = callback;
|
| + } else {
|
| + user_read_buf_ = NULL;
|
| + user_read_buf_len_ = 0;
|
| + }
|
| + LeaveFunction(rv);
|
| + return rv;
|
| +}
|
| +int SSLClientSocketNSS::Read(IOBuffer* buf, int buf_len,
|
| + const CompletionCallback& callback) {
|
| + EnterFunction(buf_len);
|
| + DCHECK(completed_handshake_);
|
| + DCHECK(next_handshake_state_ == STATE_NONE);
|
| + DCHECK(!old_user_read_callback_ && user_read_callback_.is_null());
|
| DCHECK(!old_user_connect_callback_);
|
| DCHECK(!user_read_buf_);
|
| DCHECK(nss_bufs_);
|
| @@ -1200,15 +1225,23 @@ void SSLClientSocketNSS::UpdateConnectionStatus() {
|
| void SSLClientSocketNSS::DoReadCallback(int rv) {
|
| EnterFunction(rv);
|
| DCHECK(rv != ERR_IO_PENDING);
|
| - DCHECK(user_read_callback_);
|
| + DCHECK(old_user_read_callback_ || user_read_callback_.is_null());
|
|
|
| - // Since Run may result in Read being called, clear |user_read_callback_|
|
| + // Since Run may result in Read being called, clear |old_user_read_callback_|
|
| // up front.
|
| - OldCompletionCallback* c = user_read_callback_;
|
| - user_read_callback_ = NULL;
|
| - user_read_buf_ = NULL;
|
| - user_read_buf_len_ = 0;
|
| - c->Run(rv);
|
| + if (old_user_read_callback_) {
|
| + OldCompletionCallback* c = old_user_read_callback_;
|
| + old_user_read_callback_ = NULL;
|
| + user_read_buf_ = NULL;
|
| + user_read_buf_len_ = 0;
|
| + c->Run(rv);
|
| + } else {
|
| + CompletionCallback c = user_read_callback_;
|
| + user_read_callback_.Reset();
|
| + user_read_buf_ = NULL;
|
| + user_read_buf_len_ = 0;
|
| + c.Run(rv);
|
| + }
|
| LeaveFunction("");
|
| }
|
|
|
| @@ -1864,7 +1897,7 @@ int SSLClientSocketNSS::DoVerifyCertComplete(int result) {
|
|
|
| completed_handshake_ = true;
|
|
|
| - if (user_read_callback_) {
|
| + if (old_user_read_callback_ || !user_read_callback_.is_null()) {
|
| int rv = DoReadLoop(OK);
|
| if (rv != ERR_IO_PENDING)
|
| DoReadCallback(rv);
|
|
|