From 558879234443ec4f1ca9366defb6509dcf1f6328 Mon Sep 17 00:00:00 2001 From: Felix Geyer Date: Sun, 14 Apr 2013 14:54:56 +0200 Subject: [PATCH] Make KeePass2XmlReader::parseGroup() safe against reordered xml elements. --- src/core/Group.cpp | 6 ++++++ src/core/Group.h | 1 + src/format/KeePass2XmlReader.cpp | 25 +++++++++++++++++++++---- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/core/Group.cpp b/src/core/Group.cpp index 989c9e1cc..0868a82ad 100644 --- a/src/core/Group.cpp +++ b/src/core/Group.cpp @@ -490,6 +490,12 @@ Group* Group::clone() const return clonedGroup; } +void Group::copyDataFrom(const Group* other) +{ + m_data = other->m_data; + m_lastTopVisibleEntry = other->m_lastTopVisibleEntry; +} + void Group::addEntry(Entry* entry) { Q_ASSERT(entry); diff --git a/src/core/Group.h b/src/core/Group.h index c7e4f4000..d22b6ef24 100644 --- a/src/core/Group.h +++ b/src/core/Group.h @@ -101,6 +101,7 @@ public: QList groupsRecursive(bool includeSelf) const; QSet customIconsRecursive() const; Group* clone() const; + void copyDataFrom(const Group* other); QList search(const QString& searchTerm, Qt::CaseSensitivity caseSensitivity, bool resolveInherit = true); diff --git a/src/format/KeePass2XmlReader.cpp b/src/format/KeePass2XmlReader.cpp index b63a0112e..2eb98fd88 100644 --- a/src/format/KeePass2XmlReader.cpp +++ b/src/format/KeePass2XmlReader.cpp @@ -411,7 +411,10 @@ Group* KeePass2XmlReader::parseGroup() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Group"); - Group* group = Q_NULLPTR; + Group* group = new Group(); + group->setUpdateTimeinfo(false); + QList children; + QList entries; while (!m_xml.error() && m_xml.readNextStartElement()) { if (m_xml.name() == "UUID") { Uuid uuid = readUuid(); @@ -419,7 +422,7 @@ Group* KeePass2XmlReader::parseGroup() raiseError(1); } else { - group = getGroup(uuid); + group->setUuid(uuid); } } else if (m_xml.name() == "Name") { @@ -493,13 +496,13 @@ Group* KeePass2XmlReader::parseGroup() else if (m_xml.name() == "Group") { Group* newGroup = parseGroup(); if (newGroup) { - newGroup->setParent(group); + children.append(newGroup); } } else if (m_xml.name() == "Entry") { Entry* newEntry = parseEntry(false); if (newEntry) { - newEntry->setGroup(group); + entries.append(newEntry); } } else { @@ -507,6 +510,20 @@ Group* KeePass2XmlReader::parseGroup() } } + Group* tmpGroup = group; + group = getGroup(tmpGroup->uuid()); + group->copyDataFrom(tmpGroup); + group->setUpdateTimeinfo(false); + delete tmpGroup; + + Q_FOREACH (Group* child, children) { + child->setParent(group); + } + + Q_FOREACH (Entry* entry, entries) { + entry->setGroup(group); + } + return group; }