Robert Shearman : oleaut32: Add validation for parameters in IPictureDisp:: Invoke.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Jul 28 07:15:25 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 25aff05e4a0b2147a2b10088d186082aca51aace
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=25aff05e4a0b2147a2b10088d186082aca51aace

Author: Robert Shearman <rob at codeweavers.com>
Date:   Fri Jul 28 01:22:02 2006 +0100

oleaut32: Add validation for parameters in IPictureDisp::Invoke.

Add some tests for IPictureDisp::Invoke.

---

 dlls/oleaut32/olepicture.c       |   37 +++++++++++++++++++++
 dlls/oleaut32/tests/olepicture.c |   66 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 103 insertions(+), 0 deletions(-)

diff --git a/dlls/oleaut32/olepicture.c b/dlls/oleaut32/olepicture.c
index a72919e..b2d9cf0 100644
--- a/dlls/oleaut32/olepicture.c
+++ b/dlls/oleaut32/olepicture.c
@@ -2048,6 +2048,43 @@ static HRESULT WINAPI OLEPictureImpl_Inv
   UINT*     puArgErr)
 {
   OLEPictureImpl *This = impl_from_IDispatch(iface);
+
+  /* validate parameters */
+
+  if (!IsEqualIID(riid, &IID_NULL))
+  {
+    ERR("riid was %s instead of IID_NULL\n", debugstr_guid(riid));
+    return DISP_E_UNKNOWNNAME;
+  }
+
+  if (!pDispParams)
+  {
+    ERR("null pDispParams not allowed\n");
+    return DISP_E_PARAMNOTOPTIONAL;
+  }
+
+  if (wFlags & DISPATCH_PROPERTYGET)
+  {
+    if (!pVarResult)
+    {
+      ERR("null pVarResult not allowed when DISPATCH_PROPERTYGET specified\n");
+      return DISP_E_PARAMNOTOPTIONAL;
+    }
+  }
+  else if (wFlags & DISPATCH_PROPERTYPUT)
+  {
+    if (pDispParams->cArgs != 1)
+    {
+      ERR("param count for DISPATCH_PROPERTYPUT was %d instead of 1\n", pDispParams->cArgs);
+      return DISP_E_BADPARAMCOUNT;
+    }
+  }
+  else
+  {
+    ERR("one of DISPATCH_PROPERTYGET or DISPATCH_PROPERTYPUT must be specified\n");
+    return DISP_E_MEMBERNOTFOUND;
+  }
+
   if (dispIdMember == DISPID_PICT_TYPE)
   {
     TRACE("DISPID_PICT_TYPE\n");
diff --git a/dlls/oleaut32/tests/olepicture.c b/dlls/oleaut32/tests/olepicture.c
index ada567a..b4a5697 100644
--- a/dlls/oleaut32/tests/olepicture.c
+++ b/dlls/oleaut32/tests/olepicture.c
@@ -44,6 +44,8 @@ static HMODULE hOleaut32;
 
 static HRESULT (WINAPI *pOleLoadPicture)(LPSTREAM,LONG,BOOL,REFIID,LPVOID*);
 
+#define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08lx\n", hr)
+
 /* 1x1 pixel gif */
 static const unsigned char gifimage[35] = {
 0x47,0x49,0x46,0x38,0x37,0x61,0x01,0x00,0x01,0x00,0x80,0x00,0x00,0xff,0xff,0xff,
@@ -285,6 +287,68 @@ static void test_empty_image_2(void) {
 	IPicture_Release (pic);
 }
 
+static void test_Invoke(void)
+{
+    IPictureDisp *picdisp;
+    HRESULT hr;
+    VARIANTARG vararg;
+    DISPPARAMS dispparams;
+    VARIANT varresult;
+    IStream *stream;
+    HGLOBAL hglob;
+    void *data;
+
+	hglob = GlobalAlloc (0, sizeof(gifimage));
+	data = GlobalLock(hglob);
+	memcpy(data, gifimage, sizeof(gifimage));
+    GlobalUnlock(hglob);
+
+	hr = CreateStreamOnHGlobal (hglob, FALSE, &stream);
+    ok_ole_success(hr, "CreateStreamOnHGlobal");
+
+	hr = pOleLoadPicture(stream, sizeof(gifimage), TRUE, &IID_IPictureDisp, (void **)&picdisp);
+    IStream_Release(stream);
+    ok_ole_success(hr, "OleLoadPicture");
+
+    V_VT(&vararg) = VT_BOOL;
+    V_BOOL(&vararg) = VARIANT_FALSE;
+    dispparams.cNamedArgs = 0;
+    dispparams.rgdispidNamedArgs = NULL;
+    dispparams.cArgs = 1;
+    dispparams.rgvarg = &vararg;
+    hr = IPictureDisp_Invoke(picdisp, DISPID_PICT_HPAL, &IID_IPictureDisp, 0, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, NULL);
+    ok(hr == DISP_E_UNKNOWNNAME, "IPictureDisp_Invoke should have returned DISP_E_UNKNOWNNAME instead of 0x%08lx\n", hr);
+    hr = IPictureDisp_Invoke(picdisp, DISPID_PICT_HPAL, &IID_IUnknown, 0, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, NULL);
+    ok(hr == DISP_E_UNKNOWNNAME, "IPictureDisp_Invoke should have returned DISP_E_UNKNOWNNAME instead of 0x%08lx\n", hr);
+
+    dispparams.cArgs = 0;
+    dispparams.rgvarg = NULL;
+    hr = IPictureDisp_Invoke(picdisp, DISPID_PICT_HPAL, &IID_NULL, 0, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, NULL);
+    ok(hr == DISP_E_BADPARAMCOUNT, "IPictureDisp_Invoke should have returned DISP_E_BADPARAMCOUNT instead of 0x%08lx\n", hr);
+
+    hr = IPictureDisp_Invoke(picdisp, DISPID_PICT_HPAL, &IID_NULL, 0, DISPATCH_PROPERTYPUT, NULL, NULL, NULL, NULL);
+    ok(hr == DISP_E_PARAMNOTOPTIONAL, "IPictureDisp_Invoke should have returned DISP_E_PARAMNOTOPTIONAL instead of 0x%08lx\n", hr);
+
+    hr = IPictureDisp_Invoke(picdisp, DISPID_PICT_HPAL, &IID_NULL, 0, DISPATCH_PROPERTYGET, NULL, NULL, NULL, NULL);
+    ok(hr == DISP_E_PARAMNOTOPTIONAL, "IPictureDisp_Invoke should have returned DISP_E_PARAMNOTOPTIONAL instead of 0x%08lx\n", hr);
+
+    hr = IPictureDisp_Invoke(picdisp, DISPID_PICT_HPAL, &IID_NULL, 0, DISPATCH_PROPERTYGET, NULL, &varresult, NULL, NULL);
+    ok(hr == DISP_E_PARAMNOTOPTIONAL, "IPictureDisp_Invoke should have returned DISP_E_PARAMNOTOPTIONAL instead of 0x%08lx\n", hr);
+
+    hr = IPictureDisp_Invoke(picdisp, DISPID_PICT_HPAL, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dispparams, &varresult, NULL, NULL);
+    ok_ole_success(hr, "IPictureDisp_Invoke");
+
+    hr = IPictureDisp_Invoke(picdisp, DISPID_PICT_HPAL, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &varresult, NULL, NULL);
+    ok(hr == DISP_E_MEMBERNOTFOUND, "IPictureDisp_Invoke should have returned DISP_E_MEMBERNOTFOUND instead of 0x%08lx\n", hr);
+
+    hr = IPictureDisp_Invoke(picdisp, 0xdeadbeef, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dispparams, &varresult, NULL, NULL);
+    todo_wine {
+    ok(hr == DISP_E_MEMBERNOTFOUND, "IPictureDisp_Invoke should have returned DISP_E_MEMBERNOTFOUND instead of 0x%08lx\n", hr);
+    }
+
+    IPictureDisp_Release(picdisp);
+}
+
 START_TEST(olepicture)
 {
 	hOleaut32 = LoadLibraryA("oleaut32.dll");
@@ -302,6 +366,8 @@ START_TEST(olepicture)
 	 */
 	test_empty_image();
 	test_empty_image_2();
+
+	test_Invoke();
 }
 
 




More information about the wine-cvs mailing list