Nikolay Sivov : oleaut32: Fix parameter validation in CreateStdDispatch().

Alexandre Julliard julliard at winehq.org
Wed Jan 29 14:53:32 CST 2014


Module: wine
Branch: master
Commit: e9debeb642cd193a1aaea6b96eef85816a9f6463
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=e9debeb642cd193a1aaea6b96eef85816a9f6463

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Wed Jan 29 08:19:33 2014 +0400

oleaut32: Fix parameter validation in CreateStdDispatch().

---

 dlls/oleaut32/dispatch.c       |   65 ++++++++++++++++---------------------
 dlls/oleaut32/tests/dispatch.c |   70 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 98 insertions(+), 37 deletions(-)

diff --git a/dlls/oleaut32/dispatch.c b/dlls/oleaut32/dispatch.c
index 760f8aa..f743bcb 100644
--- a/dlls/oleaut32/dispatch.c
+++ b/dlls/oleaut32/dispatch.c
@@ -39,8 +39,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(ole);
 
-static IDispatch * StdDispatch_Construct(IUnknown * punkOuter, void * pvThis, ITypeInfo * pTypeInfo);
-
 /******************************************************************************
  *		DispInvoke (OLEAUT32.30)
  *
@@ -169,32 +167,6 @@ done:
     return hr;
 }
 
-/******************************************************************************
- * CreateStdDispatch [OLEAUT32.32]
- *
- * Create and return a standard IDispatch object.
- *
- * RETURNS
- *  Success: S_OK. ppunkStdDisp contains the new object.
- *  Failure: An HRESULT error code.
- *
- * NOTES
- *  Outer unknown appears to be completely ignored.
- */
-HRESULT WINAPI CreateStdDispatch(
-        IUnknown* punkOuter,
-        void* pvThis,
-	ITypeInfo* ptinfo,
-	IUnknown** ppunkStdDisp)
-{
-    TRACE("(%p, %p, %p, %p)\n", punkOuter, pvThis, ptinfo, ppunkStdDisp);
-
-    *ppunkStdDisp = (LPUNKNOWN)StdDispatch_Construct(punkOuter, pvThis, ptinfo);
-    if (!*ppunkStdDisp)
-        return E_OUTOFMEMORY;
-    return S_OK;
-}
-
 
 /******************************************************************************
  * IDispatch {OLEAUT32}
@@ -451,25 +423,44 @@ static const IDispatchVtbl StdDispatch_VTable =
   StdDispatch_Invoke
 };
 
-static IDispatch * StdDispatch_Construct(
-  IUnknown * punkOuter,
-  void * pvThis,
-  ITypeInfo * pTypeInfo)
+/******************************************************************************
+ * CreateStdDispatch [OLEAUT32.32]
+ *
+ * Create and return a standard IDispatch object.
+ *
+ * RETURNS
+ *  Success: S_OK. ppunkStdDisp contains the new object.
+ *  Failure: An HRESULT error code.
+ *
+ * NOTES
+ *  Outer unknown appears to be completely ignored.
+ */
+HRESULT WINAPI CreateStdDispatch(
+        IUnknown* punkOuter,
+        void* pvThis,
+	ITypeInfo* ptinfo,
+	IUnknown** stddisp)
 {
-    StdDispatch * pStdDispatch;
+    StdDispatch *pStdDispatch;
+
+    TRACE("(%p, %p, %p, %p)\n", punkOuter, pvThis, ptinfo, stddisp);
+
+    if (!pvThis || !ptinfo || !stddisp)
+        return E_INVALIDARG;
 
     pStdDispatch = CoTaskMemAlloc(sizeof(StdDispatch));
     if (!pStdDispatch)
-        return &pStdDispatch->IDispatch_iface;
+        return E_OUTOFMEMORY;
 
     pStdDispatch->IDispatch_iface.lpVtbl = &StdDispatch_VTable;
     pStdDispatch->pvThis = pvThis;
-    pStdDispatch->pTypeInfo = pTypeInfo;
+    pStdDispatch->pTypeInfo = ptinfo;
     pStdDispatch->ref = 1;
 
     /* we keep a reference to the type info so prevent it from
      * being destroyed until we are done with it */
-    ITypeInfo_AddRef(pTypeInfo);
+    ITypeInfo_AddRef(ptinfo);
+    *stddisp = (IUnknown*)&pStdDispatch->IDispatch_iface;
 
-    return &pStdDispatch->IDispatch_iface;
+    return S_OK;
 }
diff --git a/dlls/oleaut32/tests/dispatch.c b/dlls/oleaut32/tests/dispatch.c
index 0f52241..ff63a7d 100644
--- a/dlls/oleaut32/tests/dispatch.c
+++ b/dlls/oleaut32/tests/dispatch.c
@@ -18,6 +18,9 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
+#define COBJMACROS
+#define CONST_VTABLE
+
 #include <wine/test.h>
 #include <windef.h>
 #include <winbase.h>
@@ -267,7 +270,74 @@ static void test_DispGetParam(void)
     VariantClear(&result);
 }
 
+static HRESULT WINAPI unk_QI(IUnknown *iface, REFIID riid, void **obj)
+{
+    if (IsEqualIID(riid, &IID_IUnknown))
+    {
+        *obj = iface;
+        return S_OK;
+    }
+    else
+    {
+        *obj = NULL;
+        return E_NOINTERFACE;
+    }
+}
+
+static ULONG WINAPI unk_AddRef(IUnknown *iface)
+{
+    return 2;
+}
+
+static ULONG WINAPI unk_Release(IUnknown *iface)
+{
+    return 1;
+}
+
+static const IUnknownVtbl unkvtbl =
+{
+    unk_QI,
+    unk_AddRef,
+    unk_Release
+};
+
+static IUnknown test_unk = { &unkvtbl };
+
+static void test_CreateStdDispatch(void)
+{
+    static const WCHAR stdole2W[] = {'s','t','d','o','l','e','2','.','t','l','b',0};
+    ITypeLib *tl;
+    ITypeInfo *ti;
+    IUnknown *unk;
+    HRESULT hr;
+
+    hr = CreateStdDispatch(NULL, NULL, NULL, NULL);
+    ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+
+    hr = CreateStdDispatch(NULL, NULL, NULL, &unk);
+    ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+
+    hr = LoadTypeLib(stdole2W, &tl);
+    ok(hr == S_OK, "got %08x\n", hr);
+    hr = ITypeLib_GetTypeInfoOfGuid(tl, &IID_IUnknown, &ti);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ITypeLib_Release(tl);
+
+    hr = CreateStdDispatch(NULL, &test_unk, NULL, &unk);
+    ok(hr == E_INVALIDARG, "got %08x\n", hr);
+
+    hr = CreateStdDispatch(NULL, NULL, ti, &unk);
+    ok(hr == E_INVALIDARG, "got %08x\n", hr);
+
+    hr = CreateStdDispatch(NULL, &test_unk, ti, &unk);
+    ok(hr == S_OK, "got %08x\n", hr);
+    IUnknown_Release(unk);
+
+    ITypeInfo_Release(ti);
+}
+
 START_TEST(dispatch)
 {
     test_DispGetParam();
+    test_CreateStdDispatch();
 }




More information about the wine-cvs mailing list