[PATCH 2/2] ole32: Avoid calling QueryContinueDrag recursively.

Huw Davies huw at codeweavers.com
Mon Feb 17 04:27:39 CST 2020


On Sun, Feb 16, 2020 at 02:05:36PM +0100, Roman Pišl wrote:
> 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 | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/dlls/ole32/ole2.c b/dlls/ole32/ole2.c
> index 757458ad20..9d404abba5 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;
> @@ -767,6 +768,7 @@ HRESULT WINAPI DoDragDrop (
>    trackerInfo.pdwEffect         = pdwEffect;
>    trackerInfo.trackingDone      = FALSE;
>    trackerInfo.escPressed        = FALSE;
> +  trackerInfo.inTrackCall       = FALSE;
>    trackerInfo.curTargetHWND     = 0;
>    trackerInfo.curDragTarget     = 0;
>  
> @@ -2163,7 +2165,11 @@ static LRESULT WINAPI OLEDD_DragTrackerWindowProc(
>      {
>        TrackerWindowInfo *trackerInfo = (TrackerWindowInfo*)GetWindowLongPtrA(hwnd, 0);
>        if (trackerInfo->trackingDone) break;
> +      if (trackerInfo->inTrackCall) break;
> +
> +      trackerInfo->inTrackCall = TRUE;
>        OLEDD_TrackStateChange(trackerInfo);
> +      trackerInfo->inTrackCall = FALSE;
>        break;
>      }
>      case WM_DESTROY:

There's a second call to OLEDD_TrackStateChange() in DoDragDrop().
It would probably be better to move the checking and setting of
inTrackCall into OLEDD_TrackStateChange() itself.

Huw.



More information about the wine-devel mailing list