From 5da09cc5bec665668838c8515be7e0323bed5027 Mon Sep 17 00:00:00 2001 From: Matt Vogt Date: Tue, 5 Nov 2013 09:58:58 +1000 Subject: [PATCH] [libcontacts] Prevent crash in coalescing import contacts. Fixes JB#12291 Remove obsolete contacts only after traversing indexed contact list. --- src/seasideimport.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/seasideimport.cpp b/src/seasideimport.cpp index cccfc1a..bc0bdb3 100644 --- a/src/seasideimport.cpp +++ b/src/seasideimport.cpp @@ -306,13 +306,15 @@ QList SeasideImport::buildImportContacts(const QList QList importedContacts(importer.contacts()); + QList::iterator> obsoleteContacts; + QHash::iterator> importGuids; QHash::iterator> importNames; QHash::iterator> importLabels; // Merge any duplicates in the import list - QList::iterator it = importedContacts.begin(); - while (it != importedContacts.end()) { + QList::iterator it = importedContacts.begin(), end = importedContacts.end(); + for ( ; it != end; ++it) { QContact &contact(*it); const QString guid = contact.detail().guid(); @@ -345,7 +347,7 @@ QList SeasideImport::buildImportContacts(const QList if (previous) { // Combine these duplicate contacts mergeIntoExistingContact(previous, contact); - it = importedContacts.erase(it); + obsoleteContacts.prepend(it); } else { if (!guid.isEmpty()) { importGuids.insert(guid, it); @@ -360,11 +362,14 @@ QList SeasideImport::buildImportContacts(const QList nickname.setNickname(label); contact.saveDetail(&nickname); } - - ++it; } } + // Remove contacts whose details were merged into other contacts + foreach (QList::iterator it, obsoleteContacts) { + importedContacts.erase(it); + } + // Find all names and GUIDs for local contacts that might match these contacts QContactFetchHint fetchHint(basicFetchHint()); #ifdef USING_QTPIM @@ -398,8 +403,7 @@ QList SeasideImport::buildImportContacts(const QList QMap::iterator> existingIds; QList::iterator> duplicates; - QList::iterator end = importedContacts.end(); - for (it = importedContacts.begin(); it != end; ++it) { + for (it = importedContacts.begin(), end = importedContacts.end(); it != end; ++it) { const QString guid = (*it).detail().guid(); QContactId existingId;