[PATCH 2/2] Fix parameter validation for endElement()
Nikolay Sivov
nsivov at codeweavers.com
Thu Aug 25 05:07:17 CDT 2011
---
dlls/msxml3/mxwriter.c | 3 +-
dlls/msxml3/tests/saxreader.c | 130 ++++++++++++++++++++++++++++-------------
2 files changed, 92 insertions(+), 41 deletions(-)
diff --git a/dlls/msxml3/mxwriter.c b/dlls/msxml3/mxwriter.c
index 0ac5974..843ea4a 100644
--- a/dlls/msxml3/mxwriter.c
+++ b/dlls/msxml3/mxwriter.c
@@ -801,7 +801,8 @@ static HRESULT WINAPI mxwriter_saxcontent_endElement(
TRACE("(%p)->(%s %s %s)\n", This, debugstr_wn(namespaceUri, nnamespaceUri),
debugstr_wn(local_name, nlocal_name), debugstr_wn(QName, nQName));
- if (!namespaceUri || !local_name || !QName) return E_INVALIDARG;
+ if ((!namespaceUri || !local_name || !QName) && This->class_version != MSXML6)
+ return E_INVALIDARG;
xmlOutputBufferWriteString(This->buffer, "</");
s = xmlchar_from_wchar(QName);
diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c
index 5d14614..8bb30d9 100644
--- a/dlls/msxml3/tests/saxreader.c
+++ b/dlls/msxml3/tests/saxreader.c
@@ -1380,8 +1380,15 @@ static void test_mxwriter_startenddocument(void)
free_bstrs();
}
-struct writer_startelement_t {
+enum startendtype
+{
+ StartElement,
+ EndElement
+};
+
+struct writer_startendelement_t {
const GUID *clsid;
+ enum startendtype type;
const char *uri;
const char *local_name;
const char *qname;
@@ -1389,55 +1396,94 @@ struct writer_startelement_t {
HRESULT hr;
};
-static const struct writer_startelement_t writer_startelement[] = {
+static const struct writer_startendelement_t writer_startendelement[] = {
/* 0 */
- { &CLSID_MXXMLWriter, NULL, NULL, NULL, NULL, E_INVALIDARG },
- { &CLSID_MXXMLWriter30, NULL, NULL, NULL, NULL, E_INVALIDARG },
- { &CLSID_MXXMLWriter40, NULL, NULL, NULL, NULL, E_INVALIDARG },
- { &CLSID_MXXMLWriter60, NULL, NULL, NULL, "<>", S_OK },
- { &CLSID_MXXMLWriter, "uri", NULL, NULL, NULL, E_INVALIDARG },
+ { &CLSID_MXXMLWriter, StartElement, NULL, NULL, NULL, NULL, E_INVALIDARG },
+ { &CLSID_MXXMLWriter30, StartElement, NULL, NULL, NULL, NULL, E_INVALIDARG },
+ { &CLSID_MXXMLWriter40, StartElement, NULL, NULL, NULL, NULL, E_INVALIDARG },
+ { &CLSID_MXXMLWriter60, StartElement, NULL, NULL, NULL, "<>", S_OK },
+ { &CLSID_MXXMLWriter, StartElement, "uri", NULL, NULL, NULL, E_INVALIDARG },
/* 5 */
- { &CLSID_MXXMLWriter30, "uri", NULL, NULL, NULL, E_INVALIDARG },
- { &CLSID_MXXMLWriter40, "uri", NULL, NULL, NULL, E_INVALIDARG },
- { &CLSID_MXXMLWriter60, "uri", NULL, NULL, "<>", S_OK },
- { &CLSID_MXXMLWriter, NULL, "local", NULL, NULL, E_INVALIDARG },
- { &CLSID_MXXMLWriter30, NULL, "local", NULL, NULL, E_INVALIDARG },
+ { &CLSID_MXXMLWriter30, StartElement, "uri", NULL, NULL, NULL, E_INVALIDARG },
+ { &CLSID_MXXMLWriter40, StartElement, "uri", NULL, NULL, NULL, E_INVALIDARG },
+ { &CLSID_MXXMLWriter60, StartElement, "uri", NULL, NULL, "<>", S_OK },
+ { &CLSID_MXXMLWriter, StartElement, NULL, "local", NULL, NULL, E_INVALIDARG },
+ { &CLSID_MXXMLWriter30, StartElement, NULL, "local", NULL, NULL, E_INVALIDARG },
/* 10 */
- { &CLSID_MXXMLWriter40, NULL, "local", NULL, NULL, E_INVALIDARG },
- { &CLSID_MXXMLWriter60, NULL, "local", NULL, "<>", S_OK },
- { &CLSID_MXXMLWriter, NULL, NULL, "qname", NULL, E_INVALIDARG },
- { &CLSID_MXXMLWriter30, NULL, NULL, "qname", NULL, E_INVALIDARG },
- { &CLSID_MXXMLWriter40, NULL, NULL, "qname", NULL, E_INVALIDARG },
+ { &CLSID_MXXMLWriter40, StartElement, NULL, "local", NULL, NULL, E_INVALIDARG },
+ { &CLSID_MXXMLWriter60, StartElement, NULL, "local", NULL, "<>", S_OK },
+ { &CLSID_MXXMLWriter, StartElement, NULL, NULL, "qname", NULL, E_INVALIDARG },
+ { &CLSID_MXXMLWriter30, StartElement, NULL, NULL, "qname", NULL, E_INVALIDARG },
+ { &CLSID_MXXMLWriter40, StartElement, NULL, NULL, "qname", NULL, E_INVALIDARG },
/* 15 */
- { &CLSID_MXXMLWriter60, NULL, NULL, "qname", "<qname>", S_OK },
- { &CLSID_MXXMLWriter, "uri", "local", "qname", "<qname>", S_OK },
- { &CLSID_MXXMLWriter30, "uri", "local", "qname", "<qname>", S_OK },
- { &CLSID_MXXMLWriter40, "uri", "local", "qname", "<qname>", S_OK },
- { &CLSID_MXXMLWriter60, "uri", "local", "qname", "<qname>", S_OK },
+ { &CLSID_MXXMLWriter60, StartElement, NULL, NULL, "qname", "<qname>", S_OK },
+ { &CLSID_MXXMLWriter, StartElement, "uri", "local", "qname", "<qname>", S_OK },
+ { &CLSID_MXXMLWriter30, StartElement, "uri", "local", "qname", "<qname>", S_OK },
+ { &CLSID_MXXMLWriter40, StartElement, "uri", "local", "qname", "<qname>", S_OK },
+ { &CLSID_MXXMLWriter60, StartElement, "uri", "local", "qname", "<qname>", S_OK },
/* 20 */
- { &CLSID_MXXMLWriter, "uri", "local", NULL, NULL, E_INVALIDARG },
- { &CLSID_MXXMLWriter30, "uri", "local", NULL, NULL, E_INVALIDARG },
- { &CLSID_MXXMLWriter40, "uri", "local", NULL, NULL, E_INVALIDARG },
- { &CLSID_MXXMLWriter60, "uri", "local", NULL, "<>", S_OK },
- { &CLSID_MXXMLWriter, "uri", "local", "uri:local", "<uri:local>", S_OK },
+ { &CLSID_MXXMLWriter, StartElement, "uri", "local", NULL, NULL, E_INVALIDARG },
+ { &CLSID_MXXMLWriter30, StartElement, "uri", "local", NULL, NULL, E_INVALIDARG },
+ { &CLSID_MXXMLWriter40, StartElement, "uri", "local", NULL, NULL, E_INVALIDARG },
+ { &CLSID_MXXMLWriter60, StartElement, "uri", "local", NULL, "<>", S_OK },
+ { &CLSID_MXXMLWriter, StartElement, "uri", "local", "uri:local", "<uri:local>", S_OK },
/* 25 */
- { &CLSID_MXXMLWriter30, "uri", "local", "uri:local", "<uri:local>", S_OK },
- { &CLSID_MXXMLWriter40, "uri", "local", "uri:local", "<uri:local>", S_OK },
- { &CLSID_MXXMLWriter60, "uri", "local", "uri:local", "<uri:local>", S_OK },
- { &CLSID_MXXMLWriter, "uri", "local", "uri:local2", "<uri:local2>", S_OK },
- { &CLSID_MXXMLWriter30, "uri", "local", "uri:local2", "<uri:local2>", S_OK },
+ { &CLSID_MXXMLWriter30, StartElement, "uri", "local", "uri:local", "<uri:local>", S_OK },
+ { &CLSID_MXXMLWriter40, StartElement, "uri", "local", "uri:local", "<uri:local>", S_OK },
+ { &CLSID_MXXMLWriter60, StartElement, "uri", "local", "uri:local", "<uri:local>", S_OK },
+ { &CLSID_MXXMLWriter, StartElement, "uri", "local", "uri:local2", "<uri:local2>", S_OK },
+ { &CLSID_MXXMLWriter30, StartElement, "uri", "local", "uri:local2", "<uri:local2>", S_OK },
/* 30 */
- { &CLSID_MXXMLWriter40, "uri", "local", "uri:local2", "<uri:local2>", S_OK },
- { &CLSID_MXXMLWriter60, "uri", "local", "uri:local2", "<uri:local2>", S_OK }
+ { &CLSID_MXXMLWriter40, StartElement, "uri", "local", "uri:local2", "<uri:local2>", S_OK },
+ { &CLSID_MXXMLWriter60, StartElement, "uri", "local", "uri:local2", "<uri:local2>", S_OK },
+ /* endElement tests */
+ { &CLSID_MXXMLWriter, EndElement, NULL, NULL, NULL, NULL, E_INVALIDARG },
+ { &CLSID_MXXMLWriter30, EndElement, NULL, NULL, NULL, NULL, E_INVALIDARG },
+ { &CLSID_MXXMLWriter40, EndElement, NULL, NULL, NULL, NULL, E_INVALIDARG },
+ /* 35 */
+ { &CLSID_MXXMLWriter60, EndElement, NULL, NULL, NULL, "</>", S_OK },
+ { &CLSID_MXXMLWriter, EndElement, "uri", NULL, NULL, NULL, E_INVALIDARG },
+ { &CLSID_MXXMLWriter30, EndElement, "uri", NULL, NULL, NULL, E_INVALIDARG },
+ { &CLSID_MXXMLWriter40, EndElement, "uri", NULL, NULL, NULL, E_INVALIDARG },
+ { &CLSID_MXXMLWriter60, EndElement, "uri", NULL, NULL, "</>", S_OK },
+ /* 40 */
+ { &CLSID_MXXMLWriter, EndElement, NULL, "local", NULL, NULL, E_INVALIDARG },
+ { &CLSID_MXXMLWriter30, EndElement, NULL, "local", NULL, NULL, E_INVALIDARG },
+ { &CLSID_MXXMLWriter40, EndElement, NULL, "local", NULL, NULL, E_INVALIDARG },
+ { &CLSID_MXXMLWriter60, EndElement, NULL, "local", NULL, "</>", S_OK },
+ { &CLSID_MXXMLWriter, EndElement, NULL, NULL, "qname", NULL, E_INVALIDARG },
+ /* 45 */
+ { &CLSID_MXXMLWriter30, EndElement, NULL, NULL, "qname", NULL, E_INVALIDARG },
+ { &CLSID_MXXMLWriter40, EndElement, NULL, NULL, "qname", NULL, E_INVALIDARG },
+ { &CLSID_MXXMLWriter60, EndElement, NULL, NULL, "qname", "</qname>", S_OK },
+ { &CLSID_MXXMLWriter, EndElement, "uri", "local", "qname", "</qname>", S_OK },
+ { &CLSID_MXXMLWriter30, EndElement, "uri", "local", "qname", "</qname>", S_OK },
+ /* 50 */
+ { &CLSID_MXXMLWriter40, EndElement, "uri", "local", "qname", "</qname>", S_OK },
+ { &CLSID_MXXMLWriter60, EndElement, "uri", "local", "qname", "</qname>", S_OK },
+ { &CLSID_MXXMLWriter, EndElement, "uri", "local", NULL, NULL, E_INVALIDARG },
+ { &CLSID_MXXMLWriter30, EndElement, "uri", "local", NULL, NULL, E_INVALIDARG },
+ { &CLSID_MXXMLWriter40, EndElement, "uri", "local", NULL, NULL, E_INVALIDARG },
+ /* 55 */
+ { &CLSID_MXXMLWriter60, EndElement, "uri", "local", NULL, "</>", S_OK },
+ { &CLSID_MXXMLWriter, EndElement, "uri", "local", "uri:local", "</uri:local>", S_OK },
+ { &CLSID_MXXMLWriter30, EndElement, "uri", "local", "uri:local", "</uri:local>", S_OK },
+ { &CLSID_MXXMLWriter40, EndElement, "uri", "local", "uri:local", "</uri:local>", S_OK },
+ { &CLSID_MXXMLWriter60, EndElement, "uri", "local", "uri:local", "</uri:local>", S_OK },
+ /* 60 */
+ { &CLSID_MXXMLWriter, EndElement, "uri", "local", "uri:local2", "</uri:local2>", S_OK },
+ { &CLSID_MXXMLWriter30, EndElement, "uri", "local", "uri:local2", "</uri:local2>", S_OK },
+ { &CLSID_MXXMLWriter40, EndElement, "uri", "local", "uri:local2", "</uri:local2>", S_OK },
+ { &CLSID_MXXMLWriter60, EndElement, "uri", "local", "uri:local2", "</uri:local2>", S_OK }
};
-static void test_mxwriter_startelement(void)
+static void test_mxwriter_startendelement_batch(void)
{
int i;
- for (i = 0; i < sizeof(writer_startelement)/sizeof(struct writer_startelement_t); i++)
+ for (i = 0; i < sizeof(writer_startendelement)/sizeof(struct writer_startendelement_t); i++)
{
- const struct writer_startelement_t *ptr = &writer_startelement[i];
+ const struct writer_startendelement_t *ptr = &writer_startendelement[i];
ISAXContentHandler *content;
IMXWriter *writer;
HRESULT hr;
@@ -1455,8 +1501,12 @@ static void test_mxwriter_startelement(void)
hr = ISAXContentHandler_startDocument(content);
EXPECT_HR(hr, S_OK);
- hr = ISAXContentHandler_startElement(content, _bstr_(ptr->uri), lstrlen(ptr->uri),
- _bstr_(ptr->local_name), lstrlen(ptr->local_name), _bstr_(ptr->qname), lstrlen(ptr->qname), NULL);
+ if (ptr->type == StartElement)
+ hr = ISAXContentHandler_startElement(content, _bstr_(ptr->uri), lstrlen(ptr->uri),
+ _bstr_(ptr->local_name), lstrlen(ptr->local_name), _bstr_(ptr->qname), lstrlen(ptr->qname), NULL);
+ else
+ hr = ISAXContentHandler_endElement(content, _bstr_(ptr->uri), lstrlen(ptr->uri),
+ _bstr_(ptr->local_name), lstrlen(ptr->local_name), _bstr_(ptr->qname), lstrlen(ptr->qname));
ok(hr == ptr->hr, "test %d: got 0x%08x, expected 0x%08x\n", i, hr, ptr->hr);
/* test output */
@@ -1488,7 +1538,7 @@ static void test_mxwriter_startendelement(void)
VARIANT dest;
HRESULT hr;
- test_mxwriter_startelement();
+ test_mxwriter_startendelement_batch();
hr = CoCreateInstance(&CLSID_MXXMLWriter, NULL, CLSCTX_INPROC_SERVER,
&IID_IMXWriter, (void**)&writer);
--
1.5.6.5
--------------030003010802040804090101--
More information about the wine-patches
mailing list