[PATCH v3] ole32: OleGetClipboard(): zero output interface pointer on error ole32/tests: OleGetClipboard fails on locked clipboard; out iface ptr is zeroed

Paul Gofman gofmanp at gmail.com
Fri Jan 15 04:56:13 CST 2016


Signed-off-by: Paul Gofman <gofmanp at gmail.com>
---
 dlls/ole32/clipboard.c       |  1 +
 dlls/ole32/tests/clipboard.c | 20 ++++++++++++++++++++
 2 files changed, 21 insertions(+)

diff --git a/dlls/ole32/clipboard.c b/dlls/ole32/clipboard.c
index ca9520f..b871bbc 100644
--- a/dlls/ole32/clipboard.c
+++ b/dlls/ole32/clipboard.c
@@ -2201,6 +2201,7 @@ HRESULT WINAPI OleGetClipboard(IDataObject **obj)
     TRACE("(%p)\n", obj);
 
     if(!obj) return E_INVALIDARG;
+    *obj = NULL;
 
     if(FAILED(hr = get_ole_clipbrd(&clipbrd))) return hr;
 
diff --git a/dlls/ole32/tests/clipboard.c b/dlls/ole32/tests/clipboard.c
index c6ef736..888852b 100644
--- a/dlls/ole32/tests/clipboard.c
+++ b/dlls/ole32/tests/clipboard.c
@@ -1582,6 +1582,25 @@ static void test_multithreaded_clipboard(void)
     OleUninitialize();
 }
 
+static void test_get_clipboard_locked(void)
+{
+    HRESULT hr;
+    IDataObject *pDObj;
+
+    OleInitialize(NULL);
+
+    pDObj = (IDataObject *)0xdeadbeef;
+    /* lock clipboard */
+    OpenClipboard(NULL);
+    hr = OleGetClipboard(&pDObj);
+    todo_wine ok(hr == CLIPBRD_E_CANT_OPEN, "OleGetClipboard() got 0x%08x instead of 0x%08x\n", hr, CLIPBRD_E_CANT_OPEN);
+    todo_wine ok(pDObj == NULL, "OleGetClipboard() got 0x%p instead of NULL\n",pDObj);
+    if (pDObj) IUnknown_Release((IUnknown*)pDObj);
+    CloseClipboard();
+
+    OleUninitialize();
+}
+
 START_TEST(clipboard)
 {
     test_get_clipboard_unitialized();
@@ -1591,4 +1610,5 @@ START_TEST(clipboard)
     test_nonole_clipboard();
     test_getdatahere();
     test_multithreaded_clipboard();
+    test_get_clipboard_locked();
 }
-- 
2.5.0




More information about the wine-patches mailing list