From fe6d84d96e67113846801803c3ba1f20b26e123f Mon Sep 17 00:00:00 2001 From: Alex Trotsenko Date: Tue, 15 Jun 2021 13:05:49 +0300 Subject: QEventDispatcherWin32: suppress old {FD_CLOSE|FD_CONNECT} notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As with other network events, we must also ignore these notifications until WM_QT_ACTIVATENOTIFIERS message is received. Fixes: QTBUG-82835 Pick-to: 6.2 6.1 Change-Id: I0740bf22e8d1cb0e8b4eba7fc1a27ffe669973ff Reviewed-by: MÃ¥rten Nordheim --- src/corelib/kernel/qeventdispatcher_win.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/corelib/kernel/qeventdispatcher_win.cpp b/src/corelib/kernel/qeventdispatcher_win.cpp index 80297feef1..28099cda9f 100644 --- a/src/corelib/kernel/qeventdispatcher_win.cpp +++ b/src/corelib/kernel/qeventdispatcher_win.cpp @@ -622,9 +622,16 @@ void QEventDispatcherWin32::registerSocketNotifier(QSocketNotifier *notifier) } sd.event |= event; } else { - // Disable the events which could be implicitly re-enabled. Next activation - // of socket notifiers will reset the mask. - d->active_fd.insert(sockfd, QSockFd(event, FD_READ | FD_ACCEPT | FD_WRITE | FD_OOB)); + // Although WSAAsyncSelect(..., 0), which is called from + // unregisterSocketNotifier(), immediately disables event message + // posting for the socket, it is possible that messages could be + // waiting in the application message queue even if the socket was + // closed. Also, some events could be implicitly re-enabled due + // to system calls. Ignore these superfluous events until all + // pending notifications have been suppressed. Next activation of + // socket notifiers will reset the mask. + d->active_fd.insert(sockfd, QSockFd(event, FD_READ | FD_CLOSE | FD_ACCEPT | FD_WRITE + | FD_CONNECT | FD_OOB)); } d->postActivateSocketNotifiers(); -- cgit v1.2.3