summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Hartmann <peter.hartmann@nokia.com>2010-03-05 10:28:32 (GMT)
committerPeter Hartmann <peter.hartmann@nokia.com>2010-03-05 13:14:26 (GMT)
commit4b3b9b792dfe2d25a271f042f23df22e8b9684f6 (patch)
treecdb6ab1c5cbc8cbde956600aee7f3a4e8b676f63
parent3fdad84b40b62979844c2d37d16093a0b67222df (diff)
downloadQt-4b3b9b792dfe2d25a271f042f23df22e8b9684f6.zip
Qt-4b3b9b792dfe2d25a271f042f23df22e8b9684f6.tar.gz
Qt-4b3b9b792dfe2d25a271f042f23df22e8b9684f6.tar.bz2
QDom: prevent infinite loop when cloning a DTD
we forgot to advance the pointer to the current node. Reviewed-by: Frans Englich Task-number: QTBUG-8398
-rw-r--r--src/xml/dom/qdom.cpp1
-rw-r--r--tests/auto/qdom/tst_qdom.cpp25
2 files changed, 26 insertions, 0 deletions
diff --git a/src/xml/dom/qdom.cpp b/src/xml/dom/qdom.cpp
index 8d9ae4f..0150515 100644
--- a/src/xml/dom/qdom.cpp
+++ b/src/xml/dom/qdom.cpp
@@ -3487,6 +3487,7 @@ QDomDocumentTypePrivate::QDomDocumentTypePrivate(QDomDocumentTypePrivate* n, boo
if (p->isNotation())
// Dont use normal insert function since we would create infinite recursion
notations->map.insertMulti(p->nodeName(), p);
+ p = p->next;
}
}
diff --git a/tests/auto/qdom/tst_qdom.cpp b/tests/auto/qdom/tst_qdom.cpp
index d1b2ea5..caf08d6 100644
--- a/tests/auto/qdom/tst_qdom.cpp
+++ b/tests/auto/qdom/tst_qdom.cpp
@@ -131,6 +131,7 @@ private slots:
void setContentWhitespace_data() const;
void taskQTBUG4595_dontAssertWhenDocumentSpecifiesUnknownEncoding() const;
+ void cloneDTD_QTBUG8398() const;
void cleanupTestCase() const;
@@ -1912,5 +1913,29 @@ void tst_QDom::taskQTBUG4595_dontAssertWhenDocumentSpecifiesUnknownEncoding() co
QVERIFY(true);
}
+void tst_QDom::cloneDTD_QTBUG8398() const
+{
+ QString dtd("<?xml version='1.0' encoding='UTF-8'?>\n"
+ "<!DOCTYPE first [\n"
+ "<!ENTITY secondFile SYSTEM 'second.xml'>\n"
+ "<!ENTITY thirdFile SYSTEM 'third.xml'>\n"
+ "]>\n"
+ "<first/>\n");
+ QDomDocument domDocument;
+ QVERIFY(domDocument.setContent(dtd));
+ QDomDocument domDocument2 = domDocument.cloneNode(true).toDocument();
+
+ // for some reason, our DOM implementation reverts the order of entities
+ QString expected("<?xml version='1.0' encoding='UTF-8'?>\n"
+ "<!DOCTYPE first [\n"
+ "<!ENTITY thirdFile SYSTEM 'third.xml'>\n"
+ "<!ENTITY secondFile SYSTEM 'second.xml'>\n"
+ "]>\n"
+ "<first/>\n");
+ QString output;
+ QTextStream stream(&output);
+ domDocument2.save(stream, 0);
+ QCOMPARE(output, expected);
+}
QTEST_MAIN(tst_QDom)
#include "tst_qdom.moc"