[PATCH v2] ole32: Avoid calling QueryContinueDrag recursively.

Roman Pišl rpisl at seznam.cz
Mon Feb 17 05:02:01 CST 2020


Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48569

Signed-off-by: Roman Pišl <rpisl at seznam.cz>
---
 dlls/ole32/ole2.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/dlls/ole32/ole2.c b/dlls/ole32/ole2.c
index 757458ad20..e971bcbf34 100644
--- a/dlls/ole32/ole2.c
+++ b/dlls/ole32/ole2.c
@@ -62,6 +62,7 @@ typedef struct tagTrackerWindowInfo
   DWORD        dwOKEffect;
   DWORD*       pdwEffect;
   BOOL       trackingDone;
+  BOOL         inTrackCall;
   HRESULT      returnValue;
 
   BOOL       escPressed;
@@ -766,6 +767,7 @@ HRESULT WINAPI DoDragDrop (
   trackerInfo.dwOKEffect        = dwOKEffect;
   trackerInfo.pdwEffect         = pdwEffect;
   trackerInfo.trackingDone      = FALSE;
+  trackerInfo.inTrackCall       = FALSE;
   trackerInfo.escPressed        = FALSE;
   trackerInfo.curTargetHWND     = 0;
   trackerInfo.curDragTarget     = 0;
@@ -2284,6 +2286,13 @@ static void OLEDD_TrackStateChange(TrackerWindowInfo* trackerInfo)
   HWND   hwndNewTarget = 0;
   POINT pt;
 
+  /*
+   * This method may be called from QueryContinueDrag again,
+   * (i.e. by running message loop) so avoid recursive call chain.
+   */
+  if (trackerInfo->inTrackCall) return;
+  trackerInfo->inTrackCall = TRUE;
+
   /*
    * Get the handle of the window under the mouse
    */
@@ -2329,6 +2338,8 @@ static void OLEDD_TrackStateChange(TrackerWindowInfo* trackerInfo)
   }
   else
     drag_end( trackerInfo );
+
+  trackerInfo->inTrackCall = FALSE;
 }
 
 /***
-- 
2.20.1




More information about the wine-devel mailing list