From 6d4044ad43ae1424a256eb1c26992301e7c64f4a Mon Sep 17 00:00:00 2001 From: Dimitri van Heesch Date: Tue, 26 Aug 2014 20:18:51 +0200 Subject: Fix potential crash when reading tag file which contained nested java classes using generics Also fixed a parse error when reading a tag file with a Java-style enum --- src/doxygen.cpp | 13 ++++++++++--- src/tagreader.cpp | 9 ++++++++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/doxygen.cpp b/src/doxygen.cpp index 533e6ef..5492dc9 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -1037,9 +1037,16 @@ static Definition *buildScopeFromQualifiedName(const QCString name, else // scope is a namespace { } - // make the parent/child scope relation - prevScope->addInnerCompound(innerScope); - innerScope->setOuterScope(prevScope); + if (innerScope) + { + // make the parent/child scope relation + prevScope->addInnerCompound(innerScope); + innerScope->setOuterScope(prevScope); + } + else // current scope is a class, so return only the namespace part... + { + return prevScope; + } // proceed to the next scope fragment p=idx+l+2; prevScope=innerScope; diff --git a/src/tagreader.cpp b/src/tagreader.cpp index 23b8f13..50909ee 100644 --- a/src/tagreader.cpp +++ b/src/tagreader.cpp @@ -95,7 +95,7 @@ class TagMemberInfo class TagClassInfo { public: - enum Kind { Class, Struct, Union, Interface, Exception, Protocol, Category }; + enum Kind { Class, Struct, Union, Interface, Exception, Protocol, Category, Enum }; TagClassInfo() { bases=0, templateArguments=0; members.setAutoDelete(TRUE); isObjC=FALSE; } ~TagClassInfo() { delete bases; delete templateArguments; } QCString name; @@ -301,6 +301,12 @@ class TagFileParser : public QXmlDefaultHandler m_curClass->kind = TagClassInfo::Interface; m_state = InClass; } + else if (kind=="enum") + { + m_curClass = new TagClassInfo; + m_curClass->kind = TagClassInfo::Enum; + m_state = InClass; + } else if (kind=="exception") { m_curClass = new TagClassInfo; @@ -1286,6 +1292,7 @@ void TagFileParser::buildLists(Entry *root) case TagClassInfo::Struct: ce->spec = Entry::Struct; break; case TagClassInfo::Union: ce->spec = Entry::Union; break; case TagClassInfo::Interface: ce->spec = Entry::Interface; break; + case TagClassInfo::Enum: ce->spec = Entry::Enum; break; case TagClassInfo::Exception: ce->spec = Entry::Exception; break; case TagClassInfo::Protocol: ce->spec = Entry::Protocol; break; case TagClassInfo::Category: ce->spec = Entry::Category; break; -- cgit v0.12