diff options
Diffstat (limited to 'chromium/net/socket/tcp_socket_win.cc')
-rw-r--r-- | chromium/net/socket/tcp_socket_win.cc | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/chromium/net/socket/tcp_socket_win.cc b/chromium/net/socket/tcp_socket_win.cc index 7d76232f962..5f8cd5c3e86 100644 --- a/chromium/net/socket/tcp_socket_win.cc +++ b/chromium/net/socket/tcp_socket_win.cc @@ -636,11 +636,6 @@ void TCPSocketWin::Close() { socket_ = INVALID_SOCKET; } - if (accept_event_) { - WSACloseEvent(accept_event_); - accept_event_ = WSA_INVALID_EVENT; - } - if (!accept_callback_.is_null()) { accept_watcher_.StopWatching(); accept_socket_ = NULL; @@ -648,6 +643,11 @@ void TCPSocketWin::Close() { accept_callback_.Reset(); } + if (accept_event_) { + WSACloseEvent(accept_event_); + accept_event_ = WSA_INVALID_EVENT; + } + if (core_) { if (waiting_connect_) { // We closed the socket, so this notification will never come. @@ -742,6 +742,14 @@ void TCPSocketWin::OnObjectSignaled(HANDLE object) { accept_address_ = NULL; base::ResetAndReturn(&accept_callback_).Run(result); } + } else { + // This happens when a client opens a connection and closes it before we + // have a chance to accept it. + DCHECK(ev.lNetworkEvents == 0); + + // Start watching the next FD_ACCEPT event. + WSAEventSelect(socket_, accept_event_, FD_ACCEPT); + accept_watcher_.StartWatching(accept_event_, this); } } |