| 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 02ac58710b5a6e52abbd4ef3c2d5bb7c0dbb4bbd..4f042bbf19cbd8c7d58cc439a9110ef1f27f9bb1 100644
|
| --- a/net/socket/client_socket_pool_base.cc
|
| +++ b/net/socket/client_socket_pool_base.cc
|
| @@ -243,17 +243,29 @@ void ClientSocketPoolBaseHelper::RequestSockets(
|
|
|
| Group* group = GetOrCreateGroup(group_name);
|
|
|
| + // RequestSocketsInternal() may delete the group.
|
| + bool deleted_group = false;
|
| +
|
| for (int num_iterations_left = num_sockets;
|
| group->NumActiveSocketSlots() < num_sockets &&
|
| num_iterations_left > 0 ; num_iterations_left--) {
|
| int rv = RequestSocketInternal(group_name, &request);
|
| if (rv < 0 && rv != ERR_IO_PENDING) {
|
| // We're encountering a synchronous error. Give up.
|
| + if (!ContainsKey(group_map_, group_name))
|
| + deleted_group = true;
|
| + break;
|
| + }
|
| + if (!ContainsKey(group_map_, group_name)) {
|
| + // Unexpected. The group should only be getting deleted on synchronous
|
| + // error.
|
| + NOTREACHED();
|
| + deleted_group = true;
|
| break;
|
| }
|
| }
|
|
|
| - if (group->IsEmpty())
|
| + if (!deleted_group && group->IsEmpty())
|
| RemoveGroup(group_name);
|
|
|
| request.net_log().EndEvent(
|
|
|