Module: wine Branch: master Commit: ae2057cbb8cf5f60df061e8152e9f145f106549e URL: http://source.winehq.org/git/wine.git/?a=commit;h=ae2057cbb8cf5f60df061e8152...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Thu Mar 17 13:14:25 2011 +0300
msxml3: Clean formatting chars before passing to base64 decoder.
---
dlls/msxml3/element.c | 31 +++++++++++++++++++++++-------- dlls/msxml3/tests/domdoc.c | 37 ++++++++++++++++++++----------------- 2 files changed, 43 insertions(+), 25 deletions(-)
diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c index 61afb2d..5071244 100644 --- a/dlls/msxml3/element.c +++ b/dlls/msxml3/element.c @@ -459,7 +459,7 @@ static inline BYTE base64_to_byte(xmlChar c) return c-'a'+26; }
-static inline HRESULT VARIANT_from_DT(XDR_DT dt, xmlChar* str, VARIANT* v) +static inline HRESULT variant_from_dt(XDR_DT dt, xmlChar* str, VARIANT* v) { VARIANT src; HRESULT hr = S_OK; @@ -571,9 +571,25 @@ static inline HRESULT VARIANT_from_DT(XDR_DT dt, xmlChar* str, VARIANT* v) case DT_BIN_BASE64: { SAFEARRAYBOUND sab; + xmlChar *c1, *c2; int i, len;
- len = xmlStrlen(str); + /* remove all formatting chars */ + c1 = c2 = str; + len = 0; + while (*c2) + { + if ( *c2 == ' ' || *c2 == '\t' || + *c2 == '\n' || *c2 == '\r' ) + { + c2++; + continue; + } + *c1++ = *c2++; + len++; + } + + /* skip padding */ if(str[len-2] == '=') i = 2; else if(str[len-1] == '=') i = 1; else i = 0; @@ -719,23 +735,22 @@ static XDR_DT element_get_dt(xmlNodePtr node)
static HRESULT WINAPI domelem_get_nodeTypedValue( IXMLDOMElement *iface, - VARIANT* var1) + VARIANT* v) { domelem *This = impl_from_IXMLDOMElement( iface ); XDR_DT dt; xmlChar* content; HRESULT hr;
- TRACE("(%p)->(%p)\n", This, var1); + TRACE("(%p)->(%p)\n", This, v);
- if(!var1) - return E_INVALIDARG; + if(!v) return E_INVALIDARG;
- V_VT(var1) = VT_NULL; + V_VT(v) = VT_NULL;
dt = element_get_dt(get_element(This)); content = xmlNodeGetContent(get_element(This)); - hr = VARIANT_from_DT(dt, content, var1); + hr = variant_from_dt(dt, content, v); xmlFree(content);
return hr; diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 3e60e24..99553fd 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -373,6 +373,8 @@ static const CHAR szTypeValueXML[] = " <uuid dt:dt="uuid">333C7BC4-460F-11D0-BC04-0080C7055a83</uuid>\n" " <binhex dt:dt="bin.hex">fffca012003c</binhex>\n" " <binbase64 dt:dt="bin.base64">YmFzZTY0IHRlc3Q=</binbase64>\n" +" <binbase64_1 dt:dt="bin.base64">\nYmFzZTY0\nIHRlc3Q=\n</binbase64_1>\n" +" <binbase64_2 dt:dt="bin.base64">\nYmF\r\t z ZTY0\nIHRlc3Q=\n</binbase64_2>\n" "</root>";
static const CHAR szBasicTransformSSXMLPart1[] = @@ -5867,6 +5869,9 @@ static const nodetypedvalue_t get_nodetypedvalue[] = { { "root/r8", VT_R8, "0.412" }, { "root/float", VT_R8, "41221.421" }, { "root/uuid", VT_BSTR, "333C7BC4-460F-11D0-BC04-0080C7055a83" }, + { "root/binbase64", VT_ARRAY|VT_UI1, "base64 test" }, + { "root/binbase64_1", VT_ARRAY|VT_UI1, "base64 test" }, + { "root/binbase64_2", VT_ARRAY|VT_UI1, "base64 test" }, { 0 } };
@@ -5938,21 +5943,6 @@ static void test_nodeTypedValue(void) IXMLDOMNode_Release(node); }
- hr = IXMLDOMDocument_selectSingleNode(doc, _bstr_("root/binbase64"), &node); - ok(hr == S_OK, "ret %08x\n", hr ); - { - BYTE bytes[] = {0x62,0x61,0x73,0x65,0x36,0x34,0x20,0x74,0x65,0x73,0x74}; - - hr = IXMLDOMNode_get_nodeTypedValue(node, &value); - ok(hr == S_OK, "ret %08x\n", hr ); - ok(V_VT(&value) == (VT_ARRAY|VT_UI1), "incorrect type\n"); - ok(V_ARRAY(&value)->rgsabound[0].cElements == 11, "incorrect array size\n"); - if(V_ARRAY(&value)->rgsabound[0].cElements == 11) - ok(!memcmp(bytes, V_ARRAY(&value)->pvData, sizeof(bytes)), "incorrect value\n"); - VariantClear(&value); - IXMLDOMNode_Release(node); - } - hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("foo"), _bstr_("value"), &pi); ok(hr == S_OK, "ret %08x\n", hr ); { @@ -6042,6 +6032,12 @@ static void test_nodeTypedValue(void) ok(hr == S_OK, "ret %08x\n", hr ); ok(V_VT(&value) == entry->type, "incorrect type, expected %d, got %d\n", entry->type, V_VT(&value));
+ if (entry->type == (VT_ARRAY|VT_UI1)) + { + ok(V_ARRAY(&value)->rgsabound[0].cElements == strlen(entry->value), + "incorrect array size, got %d, expected %d\n", V_ARRAY(&value)->rgsabound[0].cElements, strlen(entry->value)); + } + if (entry->type != VT_BSTR) { if (entry->type == VT_DATE || @@ -6064,8 +6060,15 @@ static void test_nodeTypedValue(void) ok(hr == S_OK, "ret %08x\n", hr ); }
- ok(lstrcmpW( V_BSTR(&value), _bstr_(entry->value)) == 0, - "expected %s, got %s\n", entry->value, wine_dbgstr_w(V_BSTR(&value))); + /* for byte array from VT_ARRAY|VT_UI1 it's not a WCHAR buffer */ + if (entry->type == (VT_ARRAY|VT_UI1)) + { + ok(!memcmp( V_BSTR(&value), entry->value, strlen(entry->value)), + "expected %s", entry->value); + } + else + ok(lstrcmpW( V_BSTR(&value), _bstr_(entry->value)) == 0, + "expected %s, got %s\n", entry->value, wine_dbgstr_w(V_BSTR(&value))); } else ok(lstrcmpW( V_BSTR(&value), _bstr_(entry->value)) == 0,