From 396b2d10317e49de029def1f4061e03e383c9040 Mon Sep 17 00:00:00 2001 From: Michael Andreen Date: Mon, 29 Jul 2013 13:05:28 +0200 Subject: Fix crash in DiveComputerList::addDC() when importing from DM4. DiveComputerList::getExact() created a temporary QList with the DiveComputerNodes matching a specific model. A pointer to a node in the list was returned, which becomes invalid when the list goes out of scope and gets destroyed. Causing a crash when the model strings are compared later. Instead of using contains() and creating a temporary list, we can just use an iterator, which should be both faster and safer. The crash is easy to trigger with DM4 imports, but can probably be triggered in other cases too. Similar problem with DiveComputerList::get(). Signed-off-by: Michael Andreen Signed-off-by: Dirk Hohndel --- qthelper.cpp | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) (limited to 'qthelper.cpp') diff --git a/qthelper.cpp b/qthelper.cpp index 4859c1be0..68f8c5058 100644 --- a/qthelper.cpp +++ b/qthelper.cpp @@ -35,21 +35,17 @@ bool DiveComputerNode::changesValues(const DiveComputerNode &b) const const DiveComputerNode *DiveComputerList::getExact(QString m, uint32_t d) { - if (dcMap.contains(m)) { - QList values = dcMap.values(m); - for (int i = 0; i < values.size(); i++) - if (values.at(i).deviceId == d) - return &values.at(i); - } + for (QMap::iterator it = dcMap.find(m); it != dcMap.end() && it.key() == m; ++it) + if (it->deviceId == d) + return &*it; return NULL; } const DiveComputerNode *DiveComputerList::get(QString m) { - if (dcMap.contains(m)) { - QList values = dcMap.values(m); - return &values.at(0); - } + QMap::iterator it = dcMap.find(m); + if (it != dcMap.end()) + return &*it; return NULL; } -- cgit v1.2.3-70-g09d2