diff --git a/src/format/KeePass2XmlReader.cpp b/src/format/KeePass2XmlReader.cpp index ac8495a2..735d6a12 100644 --- a/src/format/KeePass2XmlReader.cpp +++ b/src/format/KeePass2XmlReader.cpp @@ -51,12 +51,18 @@ void KeePass2XmlReader::readDatabase(QIODevice* device, Database* db, KeePass2Ra m_tmpParent = new Group(); + bool rootGroupParsed = false; + if (!m_xml.error() && m_xml.readNextStartElement()) { if (m_xml.name() == "KeePassFile") { - parseKeePassFile(); + rootGroupParsed = parseKeePassFile(); } } + if (!m_xml.error() && !rootGroupParsed) { + raiseError(28); + } + if (!m_xml.error()) { if (!m_tmpParent->children().isEmpty()) { qWarning("KeePass2XmlReader::readDatabase: found %d invalid group reference(s)", @@ -141,21 +147,25 @@ QByteArray KeePass2XmlReader::headerHash() return m_headerHash; } -void KeePass2XmlReader::parseKeePassFile() +bool KeePass2XmlReader::parseKeePassFile() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "KeePassFile"); + bool rootParsed = false; + while (!m_xml.error() && m_xml.readNextStartElement()) { if (m_xml.name() == "Meta") { parseMeta(); } else if (m_xml.name() == "Root") { - parseRoot(); + rootParsed = parseRoot(); } else { skipCurrentElement(); } } + + return rootParsed; } void KeePass2XmlReader::parseMeta() @@ -409,10 +419,12 @@ void KeePass2XmlReader::parseCustomDataItem() } } -void KeePass2XmlReader::parseRoot() +bool KeePass2XmlReader::parseRoot() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Root"); + bool groupParsed = false; + while (!m_xml.error() && m_xml.readNextStartElement()) { if (m_xml.name() == "Group") { Group* rootGroup = parseGroup(); @@ -420,6 +432,7 @@ void KeePass2XmlReader::parseRoot() Group* oldRoot = m_db->rootGroup(); m_db->setRootGroup(rootGroup); delete oldRoot; + groupParsed = true; } } else if (m_xml.name() == "DeletedObjects") { @@ -429,6 +442,8 @@ void KeePass2XmlReader::parseRoot() skipCurrentElement(); } } + + return groupParsed; } Group* KeePass2XmlReader::parseGroup() diff --git a/src/format/KeePass2XmlReader.h b/src/format/KeePass2XmlReader.h index e86c8145..bfae0fd9 100644 --- a/src/format/KeePass2XmlReader.h +++ b/src/format/KeePass2XmlReader.h @@ -49,7 +49,7 @@ public: QByteArray headerHash(); private: - void parseKeePassFile(); + bool parseKeePassFile(); void parseMeta(); void parseMemoryProtection(); void parseCustomIcons(); @@ -57,7 +57,7 @@ private: void parseBinaries(); void parseCustomData(); void parseCustomDataItem(); - void parseRoot(); + bool parseRoot(); Group* parseGroup(); void parseDeletedObjects(); void parseDeletedObject();