[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