Jacek Caban : mshtml: Correctly handle NULL BSTR in VARIANT in IDispatchEx implementation.
Alexandre Julliard
julliard at winehq.org
Wed Mar 2 12:23:49 CST 2011
Module: wine
Branch: master
Commit: b9975bf88e6c7cc9e37df7cd4de951e8b85dbb4b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b9975bf88e6c7cc9e37df7cd4de951e8b85dbb4b
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Mar 2 13:34:58 2011 +0100
mshtml: Correctly handle NULL BSTR in VARIANT in IDispatchEx implementation.
---
dlls/mshtml/dispex.c | 15 +++++++++++++--
dlls/mshtml/tests/script.c | 12 ++++++++++++
2 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c
index be949d5..4706309 100644
--- a/dlls/mshtml/dispex.c
+++ b/dlls/mshtml/dispex.c
@@ -334,6 +334,17 @@ static inline BOOL is_dynamic_dispid(DISPID id)
return DISPID_DYNPROP_0 <= id && id <= DISPID_DYNPROP_MAX;
}
+static HRESULT variant_copy(VARIANT *dest, VARIANT *src)
+{
+ if(V_VT(src) == VT_BSTR && !V_BSTR(src)) {
+ V_VT(dest) = VT_BSTR;
+ V_BSTR(dest) = NULL;
+ return S_OK;
+ }
+
+ return VariantCopy(dest, src);
+}
+
static inline dispex_dynamic_data_t *get_dynamic_data(DispatchEx *This, BOOL alloc)
{
return !alloc || This->dynamic_data
@@ -938,7 +949,7 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc
case DISPATCH_PROPERTYGET:
if(prop->flags & DYNPROP_DELETED)
return DISP_E_UNKNOWNNAME;
- return VariantCopy(pvarRes, &prop->var);
+ return variant_copy(pvarRes, &prop->var);
case DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYPUTREF:
case DISPATCH_PROPERTYPUT:
if(pdp->cArgs != 1 || (pdp->cNamedArgs == 1 && *pdp->rgdispidNamedArgs != DISPID_PROPERTYPUT)
@@ -949,7 +960,7 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc
TRACE("put %s\n", debugstr_variant(pdp->rgvarg));
VariantClear(&prop->var);
- hres = VariantCopy(&prop->var, pdp->rgvarg);
+ hres = variant_copy(&prop->var, pdp->rgvarg);
if(FAILED(hres))
return hres;
diff --git a/dlls/mshtml/tests/script.c b/dlls/mshtml/tests/script.c
index 761d440..35e6a9c 100644
--- a/dlls/mshtml/tests/script.c
+++ b/dlls/mshtml/tests/script.c
@@ -1986,6 +1986,18 @@ static void test_script_run(void)
ok(V_VT(&var) == VT_I4, "V_VT(var)=%d\n", V_VT(&var));
ok(V_I4(&var) == 300, "V_I4(&var) = %d\n", V_I4(&var));
+ V_VT(&var) = VT_BSTR;
+ V_BSTR(&var) = NULL;
+ dispex_propput(document, id, 0,&var);
+
+ VariantInit(&var);
+ memset(&dp, 0, sizeof(dp));
+ memset(&ei, 0, sizeof(ei));
+ hres = IDispatchEx_InvokeEx(document, id, LOCALE_NEUTRAL, INVOKE_PROPERTYGET, &dp, &var, &ei, NULL);
+ ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
+ ok(V_VT(&var) == VT_BSTR, "V_VT(var)=%d\n", V_VT(&var));
+ ok(!V_BSTR(&var), "V_BSTR(&var) = %s\n", wine_dbgstr_w(V_BSTR(&var)));
+
unk = (void*)0xdeadbeef;
hres = IDispatchEx_GetNameSpaceParent(window_dispex, &unk);
ok(hres == S_OK, "GetNameSpaceParent failed: %08x\n", hres);
More information about the wine-cvs
mailing list