From: Nikolay Sivov Date: Thu, 11 Mar 2010 14:39:48 +0000 (+0300) Subject: shell32/shellview: Don't crash on ::DragLeave called without droptraget. X-Git-Tag: wine-1.1.41~242 X-Git-Url: http://git.etersoft.ru/projects/?a=commitdiff_plain;h=345ab7d591bcc9c5d308a18f00d3f67aa6e887ce;p=wine%2Feterwine.git shell32/shellview: Don't crash on ::DragLeave called without droptraget. --- diff --git a/dlls/shell32/shlview.c b/dlls/shell32/shlview.c index cf9098281c..7809344f4a 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 ac603c11bd..31f47c1bb7 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); }