msi: Expand OLE automation interface parameter handling.

Misha Koshelev mk144210 at bcm.tmc.edu
Tue Feb 27 23:34:55 CST 2007


This applies on top of my other OLE automation patches. Added new
checks:
- Parameter we are looking for is not passed?
- Only set puArgErr if it is passed
- Make sure pVarResult is valid before we write to it
- Don't return S_FAIL. MSDN doesn't mention it in the Invoke help, so we
won't use it.

Changelog:

	* msi: Expand OLE automation interface parameter handling.
-------------- next part --------------
From 84a657b8c7e728392e33d64959c5327aa3ff02cc Mon Sep 17 00:00:00 2001
From: Misha Koshelev <mk144210 at bcm.tmc.edu>
Date: Tue, 27 Feb 2007 23:24:02 -0600
Subject: msi: Expand OLE automation interface parameter handling.
---
 dlls/msi/automation.c |   36 +++++++++++++++++++++---------------
 1 files changed, 21 insertions(+), 15 deletions(-)

diff --git a/dlls/msi/automation.c b/dlls/msi/automation.c
index ffa603a..7377a1f 100644
--- a/dlls/msi/automation.c
+++ b/dlls/msi/automation.c
@@ -579,11 +579,16 @@ #define V_DECLARE \
     HRESULT hr = S_OK; \
     memset(vararg, 0, sizeof(vararg));
 #define V_PREPARE(n, type) \
+    if (n >= pDispParams->cArgs) \
+    { \
+        hr = DISP_E_BADPARAMCOUNT; \
+        goto v_finish; \
+    } \
     VariantInit(&vararg[n]); \
     hr = VariantChangeTypeEx(&vararg[n], &pDispParams->rgvarg[n], lcid, 0, VT_##type); \
     if (FAILED(hr)) \
     { \
-        *puArgErr = n; \
+        if (puArgErr) *puArgErr = n;             \
         goto v_finish; \
     }
 #define V_PREPAREOPT(n, type) \
@@ -593,9 +598,13 @@ #define V_PREPAREOPT(n, type) \
 #define V_PREPARED(n) (V_VT(&vararg[n]) != VT_EMPTY)
 #define V(n, type) V_##type(&vararg[n])
 #define V_RETURN(value, type) \
+    if (pVarResult == NULL) \
+    { \
+        hr = DISP_E_PARAMNOTOPTIONAL; \
+        goto v_finish; \
+    } \
     V_VT(pVarResult) = VT_##type; \
     V_##type(pVarResult) = value;  
-#define V_FAIL hr = E_FAIL; 
 #define V_DEFAULT \
     default: \
         hr = DISP_E_MEMBERNOTFOUND;
@@ -640,8 +649,8 @@ HRESULT WINAPI RecordImpl_Invoke(
 	    } else if (wFlags & DISPATCH_PROPERTYPUT) {
                 V_PREPARE(1, I4);
                 V_PREPARE(0, BSTR);
-		if (MsiRecordSetStringW(This->msiHandle, V(1, I4), V(0, BSTR)) != ERROR_SUCCESS) 
-                    V_FAIL;
+		if ((ret = MsiRecordSetStringW(This->msiHandle, V(1, I4), V(0, BSTR))) != ERROR_SUCCESS)
+                    TRACE("MsiRecordSetString returned %d\n", ret);
 	    }
 	    break;
             
@@ -727,7 +736,7 @@ HRESULT WINAPI DatabaseImpl_Invoke(
                 V_PREPARE(0, BSTR);
 		if ((ret = MsiDatabaseOpenViewW(This->msiHandle, V(0, BSTR), &msiHandle)) == ERROR_SUCCESS) 
 		    create_automation_object(msiHandle, NULL, (LPVOID)&iDispatch, &DIID_View, ViewImpl_Invoke);
-		else TRACE("MsiDatabaseOpenViewW returned %d\n", ret);
+		else TRACE("MsiDatabaseOpenView returned %d\n", ret);
 	        V_RETURN(iDispatch, DISPATCH);
 	    }
 	    break;
@@ -772,18 +781,15 @@ HRESULT WINAPI SessionImpl_Invoke(
 	    } else if (wFlags & DISPATCH_PROPERTYPUT) {
                 V_PREPARE(1, BSTR);
                 V_PREPARE(0, BSTR);
-		if (MsiSetPropertyW(This->msiHandle, V(1, BSTR), V(0, BSTR)) != ERROR_SUCCESS) 
-                    V_FAIL;
+		if ((ret = MsiSetPropertyW(This->msiHandle, V(1, BSTR), V(0, BSTR))) != ERROR_SUCCESS) 
+                    TRACE("MsiSetProperty returned %d\n", ret);
 	    }
 	    break;
 
 	case DISPID_SESSION_LANGUAGE:
 	    if (wFlags & DISPATCH_PROPERTYGET) {
 		langId = MsiGetLanguage(This->msiHandle);
-		if (langId != ERROR_INVALID_HANDLE)
-		{
-                    V_RETURN(langId, I4);
-		} else V_FAIL;
+                V_RETURN(langId, I4);
 	    } 
 	    break;
 
@@ -794,8 +800,8 @@ HRESULT WINAPI SessionImpl_Invoke(
 	    } else if (wFlags & DISPATCH_PROPERTYPUT) {
                 V_PREPARE(1, I4);
                 V_PREPARE(0, BOOL);
-		if (MsiSetMode(This->msiHandle, V(1, I4), V(0, BOOL)) != ERROR_SUCCESS)
-                    V_FAIL;
+		if ((ret = MsiSetMode(This->msiHandle, V(1, I4), V(0, BOOL))) != ERROR_SUCCESS)
+                    TRACE("MsiSetMode returned %d\n", ret);
 	    }
 	    break;
 
@@ -838,8 +844,8 @@ HRESULT WINAPI SessionImpl_Invoke(
 	    } else if (wFlags & DISPATCH_PROPERTYPUT) {
                 V_PREPARE(1, BSTR);
                 V_PREPARE(0, I4);
-		if (MsiSetFeatureStateW(This->msiHandle, V(1, BSTR), V(0, I4)) != ERROR_SUCCESS)
-                    V_FAIL;
+		if ((ret = MsiSetFeatureStateW(This->msiHandle, V(1, BSTR), V(0, I4))) != ERROR_SUCCESS)
+                    TRACE("MsiSetFeatureState returned %d\n", ret);
 	    }
 	    break;
 
-- 
1.4.1



More information about the wine-patches mailing list