summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAlbert Astals Cid <albert.astals@canonical.com>2014-01-22 15:14:34 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-01-22 15:25:06 +0100
commitef288db325d3c115e0cf5f458c657bdee60a432f (patch)
tree97b2c24b0e92acc94538d89ba234b5c46aedfee0 /src
parent2d8028d696a86102a7753f9d59fb41f4170181a8 (diff)
qdoc: Fix crash in Generator::generateInnerNode
Using an iterator is not a good idea since the generateInnerNode can end up adding new items to the childrenNode list and thus the iterator becomes invalid Without this patch i was getting this trace in valgrind ==19251== Invalid read of size 8 ==19251== at 0x474350: Generator::generateInnerNode(InnerNode*) (generator.cpp:1018) ==19251== by 0x4A422D: HtmlGenerator::generateTree() (htmlgenerator.cpp:276) ==19251== by 0x4AC369: processQdocconfFile(QString const&) (main.cpp:515) ==19251== by 0x40B894: main (main.cpp:669) ==19251== Address 0x943c1c0 is 0 bytes after a block of size 32 free'd ==19251== at 0x4C2C72E: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==19251== by 0x51676F2: QListData::realloc(int) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.2.0) ==19251== by 0x51677EE: QListData::append(int) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.2.0) ==19251== by 0x439BAB: QList<Node*>::append(Node* const&) (qlist.h:533) ==19251== by 0x4B46B3: InnerNode::addChild(Node*) (node.cpp:1262) ==19251== by 0x4B48DC: Node::Node(Node::Type, InnerNode*, QString const&) (node.cpp:179) ==19251== by 0x4B539F: InnerNode::InnerNode(Node::Type, InnerNode*, QString const&) (node.cpp:1193) ==19251== by 0x4B54EB: DocNode::DocNode(InnerNode*, QString const&, Node::SubType, Node::PageType) (node.cpp:1608) ==19251== by 0x4C0C5E: QDocDatabase::findQmlModule(QString const&) (node.h:535) ==19251== by 0x497EEA: HtmlGenerator::generateQmlRequisites(QmlClassNode*, CodeMarker*) (htmlgenerator.cpp:2005) ==19251== by 0x4995B9: HtmlGenerator::generateDocNode(DocNode*, CodeMarker*) (htmlgenerator.cpp:1533) ==19251== by 0x474508: Generator::generateInnerNode(InnerNode*) (generator.cpp:1010) ==19251== by 0x474372: Generator::generateInnerNode(InnerNode*) (generator.cpp:1019) ==19251== by 0x4A422D: HtmlGenerator::generateTree() (htmlgenerator.cpp:276) ==19251== by 0x4AC369: processQdocconfFile(QString const&) (main.cpp:515) ==19251== by 0x40B894: main (main.cpp:669) Change-Id: I7a6ae0a689ea5edddacf7f27f9dce95b26a441df Reviewed-by: Martin Smith <martin.smith@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/tools/qdoc/generator.cpp11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/tools/qdoc/generator.cpp b/src/tools/qdoc/generator.cpp
index 3cbba788c8..b14a79dfab 100644
--- a/src/tools/qdoc/generator.cpp
+++ b/src/tools/qdoc/generator.cpp
@@ -1013,12 +1013,13 @@ void Generator::generateInnerNode(InnerNode* node)
}
}
- NodeList::ConstIterator c = node->childNodes().constBegin();
- while (c != node->childNodes().constEnd()) {
- if ((*c)->isInnerNode() && (*c)->access() != Node::Private) {
- generateInnerNode((InnerNode*)*c);
+ int i = 0;
+ while (i < node->childNodes().count()) {
+ Node *c = node->childNodes().at(i);
+ if (c->isInnerNode() && c->access() != Node::Private) {
+ generateInnerNode((InnerNode*)c);
}
- ++c;
+ ++i;
}
}