Chromium Code Reviews| Index: net/socket/ssl_client_socket_openssl.cc |
| diff --git a/net/socket/ssl_client_socket_openssl.cc b/net/socket/ssl_client_socket_openssl.cc |
| index 79c299713573009f4972eb26fcc8fda6ff669fae..0b6d644815aca8aef3289191a7a0943dea5868b1 100644 |
| --- a/net/socket/ssl_client_socket_openssl.cc |
| +++ b/net/socket/ssl_client_socket_openssl.cc |
| @@ -391,7 +391,7 @@ SSLClientSocketOpenSSL::SSLClientSocketOpenSSL( |
| transport_send_busy_(false), |
| transport_recv_busy_(false), |
| old_user_connect_callback_(NULL), |
| - user_read_callback_(NULL), |
| + old_user_read_callback_(NULL), |
| user_write_callback_(NULL), |
| completed_handshake_(false), |
| client_auth_cert_needed_(false), |
| @@ -613,11 +613,19 @@ SSLClientSocket::NextProtoStatus SSLClientSocketOpenSSL::GetNextProto( |
| void SSLClientSocketOpenSSL::DoReadCallback(int rv) { |
| // Since Run may result in Read being called, clear |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); |
| + } |
| } |
| void SSLClientSocketOpenSSL::DoWriteCallback(int rv) { |
| @@ -701,7 +709,8 @@ void SSLClientSocketOpenSSL::Disconnect() { |
| 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; |
| @@ -1186,7 +1195,24 @@ int SSLClientSocketOpenSSL::Read(IOBuffer* buf, |
| int rv = DoReadLoop(OK); |
| if (rv == ERR_IO_PENDING) { |
| - user_read_callback_ = callback; |
| + old_user_read_callback_ = callback; |
| + } else { |
| + user_read_buf_ = NULL; |
| + user_read_buf_len_ = 0; |
| + } |
| + |
| + return rv; |
| +} |
| +int SSLClientSocketOpenSSL::Read(IOBuffer* buf, |
| + int buf_len, |
| + const CompletionCallback& callback) { |
| + user_read_buf_ = buf; |
| + user_read_buf_len_ = buf_len; |
| + |
| + int rv = DoReadLoop(OK); |
| + |
| + if (rv == ERR_IO_PENDING) { |
| + old_user_read_callback_ = callback; |
|
csilv
2011/12/07 00:03:48
user_read_callback_ = callback;
James Hawkins
2011/12/07 00:19:37
Done.
|
| } else { |
| user_read_buf_ = NULL; |
| user_read_buf_len_ = 0; |