Nikolay Sivov : msxml3: Handle passed BSTR argument as a WCHAR string in :: createProcessingInstruction().
Alexandre Julliard
julliard at winehq.org
Tue Oct 26 12:34:48 CDT 2010
Module: wine
Branch: master
Commit: adfd3058212e4caa71777fae1364fb8dfdd07c62
URL: http://source.winehq.org/git/wine.git/?a=commit;h=adfd3058212e4caa71777fae1364fb8dfdd07c62
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Tue Oct 26 02:06:52 2010 +0400
msxml3: Handle passed BSTR argument as a WCHAR string in ::createProcessingInstruction().
---
dlls/msxml3/domdoc.c | 6 +-----
dlls/msxml3/msxml_private.h | 1 +
dlls/msxml3/node.c | 18 ++++++++++++++----
dlls/msxml3/tests/domdoc.c | 23 +++++++++++++++++++++++
4 files changed, 39 insertions(+), 9 deletions(-)
diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index 12710a8..78500e6 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -1597,15 +1597,11 @@ static HRESULT WINAPI domdoc_createProcessingInstruction(
hr = IXMLDOMDocument3_createNode(iface, type, target, NULL, &node);
if (hr == S_OK)
{
- VARIANT v_data;
xmlnode *node_obj;
/* this is to bypass check in ::put_data() that blocks "<?xml" PIs */
node_obj = get_node_obj(node);
- V_VT(&v_data) = VT_BSTR;
- V_BSTR(&v_data) = data;
-
- hr = node_put_value(node_obj, &v_data);
+ hr = node_set_content(node_obj, data);
IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMProcessingInstruction, (void**)pi);
IXMLDOMNode_Release(node);
diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h
index fcf3dc0..bccce1c 100644
--- a/dlls/msxml3/msxml_private.h
+++ b/dlls/msxml3/msxml_private.h
@@ -162,6 +162,7 @@ extern xmlnode *get_node_obj(IXMLDOMNode*);
extern HRESULT node_get_nodeName(xmlnode*,BSTR*);
extern HRESULT node_get_content(xmlnode*,VARIANT*);
+extern HRESULT node_set_content(xmlnode*,LPCWSTR);
extern HRESULT node_put_value(xmlnode*,VARIANT*);
extern HRESULT node_get_parent(xmlnode*,IXMLDOMNode**);
extern HRESULT node_get_child_nodes(xmlnode*,IXMLDOMNodeList**);
diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index 5b7d49d..3e8665f 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -138,10 +138,22 @@ HRESULT node_get_content(xmlnode *This, VARIANT *value)
return S_OK;
}
+HRESULT node_set_content(xmlnode *This, LPCWSTR value)
+{
+ xmlChar *str;
+
+ str = xmlChar_from_wchar(value);
+ if(!str)
+ return E_OUTOFMEMORY;
+
+ xmlNodeSetContent(This->node, str);
+ heap_free(str);
+ return S_OK;
+}
+
HRESULT node_put_value(xmlnode *This, VARIANT *value)
{
VARIANT string_value;
- xmlChar *str;
HRESULT hr;
VariantInit(&string_value);
@@ -151,11 +163,9 @@ HRESULT node_put_value(xmlnode *This, VARIANT *value)
return hr;
}
- str = xmlChar_from_wchar(V_BSTR(&string_value));
+ hr = node_set_content(This, V_BSTR(&string_value));
VariantClear(&string_value);
- xmlNodeSetContent(This->node, str);
- heap_free(str);
return S_OK;
}
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 8821b25..80557f3 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -7125,6 +7125,28 @@ static void test_events(void)
IXMLDOMDocument_Release(doc);
}
+static void test_createProcessingInstruction(void)
+{
+ static const WCHAR bodyW[] = {'t','e','s','t',0};
+ IXMLDOMProcessingInstruction *pi;
+ IXMLDOMDocument *doc;
+ WCHAR buff[10];
+ HRESULT hr;
+
+ doc = create_document(&IID_IXMLDOMDocument);
+ if (!doc) return;
+
+ /* test for BSTR handling, pass broken BSTR */
+ memcpy(&buff[2], bodyW, sizeof(bodyW));
+ /* just a big length */
+ *(DWORD*)buff = 0xf0f0;
+ hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("test"), &buff[2], &pi);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ IXMLDOMProcessingInstruction_Release(pi);
+ IXMLDOMDocument_Release(doc);
+}
+
START_TEST(domdoc)
{
IXMLDOMDocument *doc;
@@ -7186,6 +7208,7 @@ START_TEST(domdoc)
test_default_properties();
test_selectSingleNode();
test_events();
+ test_createProcessingInstruction();
CoUninitialize();
}
More information about the wine-cvs
mailing list