[PATCH] Don't crash on ::DragLeave called without droptraget

Nikolay Sivov nsivov at codeweavers.com
Thu Mar 11 08:39:48 CST 2010


---
 dlls/shell32/shlview.c       |   22 +++++++++++++++-------
 dlls/shell32/tests/shlview.c |    8 ++++++++
 2 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/dlls/shell32/shlview.c b/dlls/shell32/shlview.c
index cf90982..7809344 100644
--- a/dlls/shell32/shlview.c
+++ b/dlls/shell32/shlview.c
@@ -2407,17 +2407,25 @@ static HRESULT WINAPI ISVDropTarget_DragOver(IDropTarget *iface, DWORD grfKeySta
     return drag_notify_subitem(This, grfKeyState, pt, pdwEffect);
 }
 
-static HRESULT WINAPI ISVDropTarget_DragLeave(IDropTarget *iface) {
+static HRESULT WINAPI ISVDropTarget_DragLeave(IDropTarget *iface)
+{
     IShellViewImpl *This = impl_from_IDropTarget(iface);
 
-    IDropTarget_DragLeave(This->pCurDropTarget);
+    if (This->pCurDropTarget)
+    {
+        IDropTarget_DragLeave(This->pCurDropTarget);
+        IDropTarget_Release(This->pCurDropTarget);
+        This->pCurDropTarget = NULL;
+    }
+
+    if (This->pCurDataObject)
+    {
+        IDataObject_Release(This->pCurDataObject);
+        This->pCurDataObject = NULL;
+    }
 
-    IDropTarget_Release(This->pCurDropTarget);
-    IDataObject_Release(This->pCurDataObject);
-    This->pCurDataObject = NULL;
-    This->pCurDropTarget = NULL;
     This->iDragOverItem = 0;
-     
+
     return S_OK;
 }
 
diff --git a/dlls/shell32/tests/shlview.c b/dlls/shell32/tests/shlview.c
index ac603c1..31f47c1 100644
--- a/dlls/shell32/tests/shlview.c
+++ b/dlls/shell32/tests/shlview.c
@@ -318,6 +318,7 @@ static void test_IShellView_CreateViewWindow(void)
     IShellFolder *desktop;
     FOLDERSETTINGS settings;
     IShellView *view;
+    IDropTarget *dt;
     HWND hwnd_view;
     HRESULT hr;
     RECT r = {0};
@@ -346,6 +347,13 @@ if (0)
     ok(hr == E_UNEXPECTED, "got (0x%08x)\n", hr);
     ok(hwnd_view == 0, "got %p\n", hwnd_view);
 
+    /* ::DragLeave without drag operation */
+    hr = IShellView_QueryInterface(view, &IID_IDropTarget, (void**)&dt);
+    ok(hr == S_OK, "got (0x%08x)\n", hr);
+    hr = IDropTarget_DragLeave(dt);
+    ok(hr == S_OK, "got (0x%08x)\n", hr);
+    IDropTarget_Release(dt);
+
     IShellView_Release(view);
     IShellFolder_Release(desktop);
 }
-- 
1.5.6.5


--=-KY3HHiyH8YGnQNqKZz+Y--




More information about the wine-patches mailing list