summaryrefslogtreecommitdiff
path: root/chromium/net/socket/tcp_socket_win.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/socket/tcp_socket_win.cc')
-rw-r--r--chromium/net/socket/tcp_socket_win.cc18
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);
}
}