Index: ppapi/shared_impl/tcp_socket_shared.cc |
diff --git a/ppapi/shared_impl/tcp_socket_shared.cc b/ppapi/shared_impl/tcp_socket_shared.cc |
index 96566373b5ed8254c6487d4e92c2445dbf7f0765..801c77187b80ea0abe590e7e1facfdc6a60bdc18 100644 |
--- a/ppapi/shared_impl/tcp_socket_shared.cc |
+++ b/ppapi/shared_impl/tcp_socket_shared.cc |
@@ -44,9 +44,13 @@ void TCPSocketShared::OnConnectCompleted( |
int32_t result, |
const PP_NetAddress_Private& local_addr, |
const PP_NetAddress_Private& remote_addr) { |
+ // It is possible that |connect_callback_| is pending while |
+ // |connection_state_| is not BEFORE_CONNECT: DisconnectImpl() has been |
+ // called, but a ConnectCompleted notification came earlier than the task to |
+ // abort |connect_cllback_|. We don't want to udpate |connection_state_| or |
dmichael (off chromium)
2013/06/22 01:19:16
nit: cllback->callback, udpate->update
yzshen1
2013/06/22 04:58:19
Done. Thanks!
On 2013/06/22 01:19:16, dmichael wro
|
+ // other members in that case. |
if (connection_state_ != BEFORE_CONNECT || |
!TrackedCallback::IsPending(connect_callback_)) { |
- NOTREACHED(); |
return; |
} |
@@ -62,9 +66,13 @@ void TCPSocketShared::OnConnectCompleted( |
void TCPSocketShared::OnSSLHandshakeCompleted( |
bool succeeded, |
const PPB_X509Certificate_Fields& certificate_fields) { |
+ // It is possible that |ssl_handshake_callback_| is pending while |
+ // |connection_state_| is not CONNECT: DisconnectImpl() has been |
+ // called, but a SSLHandshakeCompleted notification came earlier than the task |
+ // to abort |ssl_handshake_callback_|. We don't want to udpate |
+ // |connection_state_| or other members in that case. |
if (connection_state_ != CONNECTED || |
!TrackedCallback::IsPending(ssl_handshake_callback_)) { |
- NOTREACHED(); |
return; |
} |
@@ -87,10 +95,12 @@ void TCPSocketShared::OnSSLHandshakeCompleted( |
void TCPSocketShared::OnReadCompleted(int32_t result, |
const std::string& data) { |
- if (!TrackedCallback::IsPending(read_callback_) || !read_buffer_) { |
- NOTREACHED(); |
+ // It is possible that |read_callback_| is pending while |read_buffer_| is |
+ // NULL: DisconnectImpl() has been called, but a ReadCompleted notification |
+ // came earlier than the task to abort |read_callback_|. We shouldn't access |
+ // the buffer in that case. The user may have released it. |
+ if (!TrackedCallback::IsPending(read_callback_) || !read_buffer_) |
return; |
- } |
result = OverridePPError(result); |
bool succeeded = result == PP_OK; |
@@ -107,10 +117,8 @@ void TCPSocketShared::OnReadCompleted(int32_t result, |
} |
void TCPSocketShared::OnWriteCompleted(int32_t result) { |
- if (!TrackedCallback::IsPending(write_callback_)) { |
- NOTREACHED(); |
+ if (!TrackedCallback::IsPending(write_callback_)) |
return; |
- } |
result = OverridePPError(result); |
write_callback_->Run(result); |