Moin,
situation:
Syning KDE Addressbook (3.3 on KDE 3.3.0) with backup-plugin
works. Now delete one entry in Addressbook, sync again.
You get a SEGV:
kdepim_plugin: KDE addressbook locked OK.
kaddrbook.cpp: get_changes : plugin UID list has 3 entries
kdepim_plugin: DELETED UID=WWFke48vIq
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 1118796720 (LWP 7598)]
0x422e8209 in ucstrcmp () from /usr/lib/qt3/lib/libqt-mt.so.3
(gdb) bt
#0 0x422e8209 in ucstrcmp () from /usr/lib/qt3/lib/libqt-mt.so.3
#1 0x422ea7e1 in operator< () from /usr/lib/qt3/lib/libqt-mt.so.3
#2 0x4136e23a in QMapPrivate<QString, KABC::Addressee>::find () from
/opt/kde3/lib/libkabc.so.1
#3 0x41339578 in KABC::Resource::findByUid () from /opt/kde3/lib/libkabc.so.1
#4 0x41341d84 in KABC::AddressBook::findByUid () from /opt/kde3/lib/libkabc.so.
1
#5 0x4128aad6 in kaddrbook::get_changes (this=0x8236fc8, listptr=0x82baed0, newdbs=0)
at kaddrbook.cpp:283
#6 0x41289d62 in kaddrbook_get_changes (pkaddrbook=0x8236fc8, listptr=0x82baed0 ,
newdbs=0)
at kaddrbook.cpp:509
#7 0x4128be1f in get_changes (conn=0x80b2508, newdbs=SYNC_OBJECT_TYPE_UNKNOWN)
at kdeplugin.c:93
I've appended a patch which fixes this.
(Short summary: removing uid from list with
uidlist.remove(it) in kaddrbook.cpp:307 returns the new iterator it, not
taking this into account corrupts iterator as it seems)
I don't know if older KDE-versions also have this problem.
Please verify and apply.
ciao,
Stefan
--
Stefan Behlert
--- multisync-cvs-dev-snapshot-20041103.orig/plugins/kdepim_plugin/src/kaddrbook.cpp
2004-07-10 09:49:15.000000000 +0200
+++ multisync-cvs-dev-snapshot-20041103/plugins/kdepim_plugin/src/kaddrbook.cpp
2004-11-04 11:57:41.000000000 +0100
@@ -275,14 +275,17 @@
//Now find any UIDs in the old list that are missing from the KDE
addressbook,
//these are records that have been deleted.
- for (QStringList::Iterator it=uidlist.begin(); it!=uidlist.end(); it++)
+ for (QStringList::Iterator it=uidlist.begin(); it!=uidlist.end(); )
{
//Find matching record in KDE Addressbook.
//If not found then we have detected an entry that had been deleted
from the KDE
//adressbook since the last syunchronisation.
KABC::Addressee addressee = addressbookptr->findByUid(*it);
if (!addressee.isEmpty())
+ {
+ i++;
continue;
+ }
//this prevUID is missing from currUID, it represents a DELETED entry
if (multisync_debug)
@@ -304,7 +307,7 @@
list = g_list_append(list,chobj);
//Remove the corresponding UID from our own UID list
- uidlist.remove(it);
+ it=uidlist.remove(it);
}
//update caller's listptr and return success