[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