From cab9b205c3fc803eb7e0b20c9b760b53936e38f3 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 22 Dec 2007 14:05:25 +0000 Subject: [PATCH] discard any pending messages for the socket being destroyed to avoid the problem with having them delivered to the next socket we create which reuses the same message number (patch 1856012) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@50893 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 4 ++++ src/msw/gsockmsw.cpp | 14 +++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/docs/changes.txt b/docs/changes.txt index 0f13127a54..a955d366ea 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -299,6 +299,10 @@ All (GUI): - Added wxWindow::GetNextSibling() and GetPrevSibling() +wxMSW: + +- Fix rare bug with messages delivered to wrong wxSocket (Tim Kosse) + 2.8.7 ----- diff --git a/src/msw/gsockmsw.cpp b/src/msw/gsockmsw.cpp index a1ada1918b..79969ac301 100644 --- a/src/msw/gsockmsw.cpp +++ b/src/msw/gsockmsw.cpp @@ -311,7 +311,19 @@ void GSocketMSWManager::Destroy_Socket(GSocket *socket) /* Remove the socket from the list */ EnterCriticalSection(&critical); if ( socket->IsOk() ) - socketList[(socket->m_msgnumber - WM_USER)] = NULL; + { + const int msgnum = socket->m_msgnumber; + + // we need to remove any pending messages for this socket to avoid having + // them sent to a new socket which could reuse the same message number as + // soon as we destroy this one + MSG msg; + while ( ::PeekMessage(&msg, hWin, msgnum, msgnum, PM_REMOVE) ) + ; + + socketList[msgnum - WM_USER] = NULL; + } + LeaveCriticalSection(&critical); }