[1/5] msxml3: Don't use stream written value when saving to stream
Nikolay Sivov
nsivov at codeweavers.com
Mon Jul 9 00:07:10 CDT 2012
libxml2 uses return value to shrink buffers, and I've got at least one
application that returns wrong length here - in WCHARs instead of bytes.
-------------- next part --------------
>From 460166c45e0255f0c75bb1c5dd428673a089c86b Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
Date: Sat, 7 Jul 2012 12:13:08 +0400
Subject: [PATCH 1/5] Don't use stream written value when saving to stream
---
dlls/msxml3/domdoc.c | 3 +-
dlls/msxml3/tests/domdoc.c | 156 +++++++++++++++++++++++++++++++++++++++-----
2 files changed, 141 insertions(+), 18 deletions(-)
diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index 080eb3d..0c0df36 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -2328,13 +2328,14 @@ static int XMLCALL domdoc_stream_save_writecallback(void *ctx, const char *buffe
HRESULT hr;
hr = IStream_Write((IStream*)ctx, buffer, len, &written);
+ TRACE("0x%08x %p %d %u\n", hr, buffer, len, written);
if (hr != S_OK)
{
WARN("stream write error: 0x%08x\n", hr);
return -1;
}
else
- return written;
+ return len;
}
static int XMLCALL domdoc_stream_save_closecallback(void *ctx)
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 9919f4e..d51b863 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -1288,6 +1288,118 @@ static const IServiceProviderVtbl testprovVtbl =
testprov_t testprov = { { &testprovVtbl } };
+/* IStream */
+static HRESULT WINAPI istream_QueryInterface(IStream *iface, REFIID riid, void **ppvObject)
+{
+ *ppvObject = NULL;
+
+ if (IsEqualGUID(riid, &IID_IStream) ||
+ IsEqualGUID(riid, &IID_IUnknown))
+ *ppvObject = iface;
+ else
+ return E_NOINTERFACE;
+
+ return S_OK;
+}
+
+static ULONG WINAPI istream_AddRef(IStream *iface)
+{
+ return 2;
+}
+
+static ULONG WINAPI istream_Release(IStream *iface)
+{
+ return 1;
+}
+
+static HRESULT WINAPI istream_Read(IStream *iface, void *ptr, ULONG len, ULONG *pread)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI istream_Write(IStream *iface, const void *ptr, ULONG len, ULONG *written)
+{
+ *written = len/2;
+ return S_OK;
+}
+
+static HRESULT WINAPI istream_Seek(IStream *iface, LARGE_INTEGER move, DWORD origin, ULARGE_INTEGER *new_pos)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI istream_SetSize(IStream *iface, ULARGE_INTEGER size)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI istream_CopyTo(IStream *iface, IStream *stream, ULARGE_INTEGER len,
+ ULARGE_INTEGER *pread, ULARGE_INTEGER *written)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI istream_Commit(IStream *iface, DWORD flags)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI istream_Revert(IStream *iface)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI istream_LockRegion(IStream *iface, ULARGE_INTEGER offset,
+ ULARGE_INTEGER len, DWORD locktype)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI istream_UnlockRegion(IStream *iface, ULARGE_INTEGER offset,
+ ULARGE_INTEGER len, DWORD locktype)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI istream_Stat(IStream *iface, STATSTG *pstatstg, DWORD flag)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI istream_Clone(IStream *iface, IStream **stream)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static const IStreamVtbl StreamVtbl = {
+ istream_QueryInterface,
+ istream_AddRef,
+ istream_Release,
+ istream_Read,
+ istream_Write,
+ istream_Seek,
+ istream_SetSize,
+ istream_CopyTo,
+ istream_Commit,
+ istream_Revert,
+ istream_LockRegion,
+ istream_UnlockRegion,
+ istream_Stat,
+ istream_Clone
+};
+
+static IStream savestream = { &StreamVtbl };
+
#define EXPECT_CHILDREN(node) _expect_children((IXMLDOMNode*)node, __LINE__)
static void _expect_children(IXMLDOMNode *node, int line)
{
@@ -7124,10 +7236,10 @@ static void test_save(void)
{
IXMLDOMDocument *doc, *doc2;
IXMLDOMElement *root;
- VARIANT file, vDoc;
BSTR sOrig, sNew, filename;
char buffer[100];
DWORD read = 0;
+ VARIANT dest;
HANDLE hfile;
HRESULT hr;
@@ -7148,10 +7260,10 @@ static void test_save(void)
hr = IXMLDOMDocument_appendChild(doc, (IXMLDOMNode*)root, NULL);
EXPECT_HR(hr, S_OK);
- V_VT(&vDoc) = VT_UNKNOWN;
- V_UNKNOWN(&vDoc) = (IUnknown*)doc2;
+ V_VT(&dest) = VT_UNKNOWN;
+ V_UNKNOWN(&dest) = (IUnknown*)doc2;
- hr = IXMLDOMDocument_save(doc, vDoc);
+ hr = IXMLDOMDocument_save(doc, dest);
EXPECT_HR(hr, S_OK);
hr = IXMLDOMDocument_get_xml(doc, &sOrig);
@@ -7169,10 +7281,10 @@ static void test_save(void)
IXMLDOMDocument_Release(doc2);
/* save to path */
- V_VT(&file) = VT_BSTR;
- V_BSTR(&file) = _bstr_("test.xml");
+ V_VT(&dest) = VT_BSTR;
+ V_BSTR(&dest) = _bstr_("test.xml");
- hr = IXMLDOMDocument_save(doc, file);
+ hr = IXMLDOMDocument_save(doc, dest);
EXPECT_HR(hr, S_OK);
hfile = CreateFileA("test.xml", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
@@ -7188,24 +7300,34 @@ static void test_save(void)
/* save to path VT_BSTR | VT_BYREF */
filename = _bstr_("test.xml");
- V_VT(&file) = VT_BSTR | VT_BYREF;
- V_BSTRREF(&file) = &filename;
+ V_VT(&dest) = VT_BSTR | VT_BYREF;
+ V_BSTRREF(&dest) = &filename;
- hr = IXMLDOMDocument_save(doc, file);
+ hr = IXMLDOMDocument_save(doc, dest);
EXPECT_HR(hr, S_OK);
- IXMLDOMDocument_Release(doc);
-
hfile = CreateFileA("test.xml", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
ok(hfile != INVALID_HANDLE_VALUE, "Could not open file: %u\n", GetLastError());
if(hfile == INVALID_HANDLE_VALUE) return;
- ReadFile(hfile, buffer, sizeof(buffer), &read, NULL);
- ok(read != 0, "could not read file\n");
- ok(buffer[0] != '<' || buffer[1] != '?', "File contains processing instruction\n");
+ if (hfile != INVALID_HANDLE_VALUE)
+ {
+ ReadFile(hfile, buffer, sizeof(buffer), &read, NULL);
+ ok(read != 0, "could not read file\n");
+ ok(buffer[0] != '<' || buffer[1] != '?', "File contains processing instruction\n");
- CloseHandle(hfile);
- DeleteFile("test.xml");
+ CloseHandle(hfile);
+ DeleteFile("test.xml");
+ }
+
+ /* save to stream */
+ V_VT(&dest) = VT_UNKNOWN;
+ V_UNKNOWN(&dest) = (IUnknown*)&savestream;
+
+ hr = IXMLDOMDocument_save(doc, dest);
+ EXPECT_HR(hr, S_OK);
+
+ IXMLDOMDocument_Release(doc);
free_bstrs();
}
--
1.5.6.5
More information about the wine-patches
mailing list