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