Index: net/socket/client_socket_pool_base.cc |
diff --git a/net/socket/client_socket_pool_base.cc b/net/socket/client_socket_pool_base.cc |
index 99011bed65aa8e7b70ce60879d7f7ee8ea7c5ab0..31bec818325a56abc88d07f67e38193d5e844e9b 100644 |
--- a/net/socket/client_socket_pool_base.cc |
+++ b/net/socket/client_socket_pool_base.cc |
@@ -332,6 +332,10 @@ void ClientSocketPoolBaseHelper::OnBackupSocketTimerFired( |
void ClientSocketPoolBaseHelper::CancelRequest( |
const std::string& group_name, const ClientSocketHandle* handle) { |
+ // Running callbacks can cause the last outside reference to be released. |
+ // Hold onto a reference. |
+ scoped_refptr<ClientSocketPoolBaseHelper> ref_holder(this); |
+ |
CHECK(ContainsKey(group_map_, group_name)); |
Group& group = group_map_[group_name]; |
@@ -470,6 +474,10 @@ void ClientSocketPoolBaseHelper::DecrementIdleCount() { |
void ClientSocketPoolBaseHelper::DoReleaseSocket(const std::string& group_name, |
ClientSocket* socket) { |
+ // Running callbacks can cause the last outside reference to be released. |
+ // Hold onto a reference. |
+ scoped_refptr<ClientSocketPoolBaseHelper> ref_holder(this); |
+ |
GroupMap::iterator i = group_map_.find(group_name); |
CHECK(i != group_map_.end()); |
@@ -563,6 +571,10 @@ int ClientSocketPoolBaseHelper::FindTopStalledGroup(Group** group, |
void ClientSocketPoolBaseHelper::OnConnectJobComplete( |
int result, ConnectJob* job) { |
+ // Running callbacks can cause the last outside reference to be released. |
+ // Hold onto a reference. |
+ scoped_refptr<ClientSocketPoolBaseHelper> ref_holder(this); |
+ |
DCHECK_NE(ERR_IO_PENDING, result); |
const std::string group_name = job->group_name(); |
GroupMap::iterator group_it = group_map_.find(group_name); |
@@ -611,6 +623,7 @@ void ClientSocketPoolBaseHelper::OnConnectJobComplete( |
} |
void ClientSocketPoolBaseHelper::OnIPAddressChanged() { |
+ CancelAllConnectJobs(); |
CloseIdleSockets(); |
} |