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>
This commit is contained in:
Albert Astals Cid 2014-01-22 15:14:34 +01:00 committed by The Qt Project
parent 2d8028d696
commit ef288db325

View File

@ -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;
}
}