Version: 1.8.1 (using KDE KDE 3.4.1) Installed from: Unlisted Binary Package Compiler: compiled by the kde-redhat project http://kde-redhat.sourceforge.net/ OS: Linux The system is Fedora Core 3 using the kde-redhat rpms (v 3.4.1-1.3.fc3.kde, if that helps). When KMail has been running in the background (just a tray icon) for a few days, it will crash and throw up the crash window. I didn't save the backtraces the first couple times, but they have all been SIGSEGV, if memory serves me correctly. Recovery seems fine when starting it back after this crash. I can throw in a second trace to make sure the same thing is happening in a couple days. The most recent backtrace is here: _______________________________________________________________________ Using host libthread_db library "/lib/tls/libthread_db.so.1". [Thread debugging using libthread_db enabled] [New Thread -1208662336 (LWP 7392)] [KCrash handler] #4 0x02aa5537 in QObject::activate_signal () from /usr/lib/qt-3.3/lib/libqt-mt.so.3 #5 0x034aba40 in KPIM::ProgressItem::progressItemStatus () from /usr/lib/libkdepim.so.1 #6 0x034aba99 in KPIM::ProgressItem::setStatus () from /usr/lib/libkdepim.so.1 #7 0x034be88f in KPIM::BroadcastStatus::setStatusMsgTransmissionCompleted () from /usr/lib/libkdepim.so.1 #8 0x03948818 in KMAcctExpPop::slotJobFinished () from /usr/lib/libkmailprivate.so #9 0x03948cfc in KMAcctExpPop::slotResult () from /usr/lib/libkmailprivate.so #10 0x03949388 in KMAcctExpPop::qt_invoke () from /usr/lib/libkmailprivate.so #11 0x02aa562e in QObject::activate_signal () from /usr/lib/qt-3.3/lib/libqt-mt.so.3 #12 0x03f9e329 in KIO::Job::result () from /usr/lib/libkio.so.4 #13 0x03fc8778 in KIO::Job::emitResult () from /usr/lib/libkio.so.4 #14 0x03ff7b2e in KIO::SimpleJob::slotFinished () from /usr/lib/libkio.so.4 #15 0x03ff8298 in KIO::TransferJob::slotFinished () from /usr/lib/libkio.so.4 #16 0x03fc83a2 in KIO::TransferJob::qt_invoke () from /usr/lib/libkio.so.4 #17 0x02aa562e in QObject::activate_signal () from /usr/lib/qt-3.3/lib/libqt-mt.so.3 #18 0x02aa5d04 in QObject::activate_signal () from /usr/lib/qt-3.3/lib/libqt-mt.so.3 #19 0x03f9c730 in KIO::SlaveInterface::finished () from /usr/lib/libkio.so.4 #20 0x03fe8b12 in KIO::SlaveInterface::dispatch () from /usr/lib/libkio.so.4 #21 0x03fc6433 in KIO::SlaveInterface::dispatch () from /usr/lib/libkio.so.4 #22 0x03fbd42c in KIO::Slave::gotInput () from /usr/lib/libkio.so.4 #23 0x03fc4bcf in KIO::Slave::qt_invoke () from /usr/lib/libkio.so.4 #24 0x02aa562e in QObject::activate_signal () from /usr/lib/qt-3.3/lib/libqt-mt.so.3 #25 0x02aa5bc0 in QObject::activate_signal () from /usr/lib/qt-3.3/lib/libqt-mt.so.3 #26 0x02dd9450 in QSocketNotifier::activated () from /usr/lib/qt-3.3/lib/libqt-mt.so.3 #27 0x02ac0755 in QSocketNotifier::event () from /usr/lib/qt-3.3/lib/libqt-mt.so.3 #28 0x02a46a19 in QApplication::internalNotify () from /usr/lib/qt-3.3/lib/libqt-mt.so.3 #29 0x02a46baa in QApplication::notify () from /usr/lib/qt-3.3/lib/libqt-mt.so.3 #30 0x030fbaa6 in KApplication::notify () from /usr/lib/libkdecore.so.4 #31 0x02a3aed2 in QEventLoop::activateSocketNotifiers () from /usr/lib/qt-3.3/lib/libqt-mt.so.3 #32 0x029f525e in QEventLoop::processEvents () from /usr/lib/qt-3.3/lib/libqt-mt.so.3 #33 0x02a5c0b5 in QEventLoop::enterLoop () from /usr/lib/qt-3.3/lib/libqt-mt.so.3 #34 0x02a5c00e in QEventLoop::exec () from /usr/lib/qt-3.3/lib/libqt-mt.so.3 #35 0x02a45c1b in QApplication::exec () from /usr/lib/qt-3.3/lib/libqt-mt.so.3 #36 0x0804a304 in ?? () #37 0xbff08540 in ?? () #38 0xbff08450 in ?? () #39 0x00000000 in ?? () _______________________________________________________________________
SVN commit 558673 by kloecker: Fix progress item related crashes during POP3 fetches. BUGS: 110487, 118112, 119112, 121384, 127210, 130303 M +4 -1 kmaccount.cpp M +30 -20 popaccount.cpp --- branches/KDE/3.5/kdepim/kmail/kmaccount.cpp #558672:558673 @@ -444,8 +444,11 @@ if (mTimer) mTimer->start(mInterval*60000); if ( mMailCheckProgressItem ) { - mMailCheckProgressItem->setComplete(); // that will delete it + // set mMailCheckProgressItem = 0 before calling setComplete() to prevent + // a race condition + ProgressItem *savedMailCheckProgressItem = mMailCheckProgressItem; mMailCheckProgressItem = 0; + savedMailCheckProgressItem->setComplete(); // that will delete it } emit newMailsProcessed( mNewInFolder ); --- branches/KDE/3.5/kdepim/kmail/popaccount.cpp #558672:558673 @@ -348,8 +348,9 @@ void PopAccount::slotAbortRequested() { if (stage == Idle) return; - disconnect( mMailCheckProgressItem, SIGNAL( progressItemCanceled( KPIM::ProgressItem* ) ), - this, SLOT( slotAbortRequested() ) ); + if ( mMailCheckProgressItem ) + disconnect( mMailCheckProgressItem, SIGNAL( progressItemCanceled( KPIM::ProgressItem* ) ), + this, SLOT( slotAbortRequested() ) ); stage = Quit; if (job) job->kill(); job = 0; @@ -655,7 +656,8 @@ processMsgsTimer.start(processingDelay); } else if (stage == Retr) { - mMailCheckProgressItem->setProgress( 100 ); + if ( mMailCheckProgressItem ) + mMailCheckProgressItem->setProgress( 100 ); processRemainingQueuedMessages(); mHeaderDeleteUids.clear(); @@ -732,20 +734,22 @@ // If there are messages to delete then delete them if ( !idsOfMsgsToDelete.isEmpty() ) { stage = Dele; - mMailCheckProgressItem->setStatus( - i18n( "Fetched 1 message from %1. Deleting messages from server...", - "Fetched %n messages from %1. Deleting messages from server...", - numMsgs ) - .arg( mHost ) ); + if ( mMailCheckProgressItem ) + mMailCheckProgressItem->setStatus( + i18n( "Fetched 1 message from %1. Deleting messages from server...", + "Fetched %n messages from %1. Deleting messages from server...", + numMsgs ) + .arg( mHost ) ); url.setPath("/remove/" + idsOfMsgsToDelete.join(",")); kdDebug(5006) << "url: " << url.prettyURL() << endl; } else { stage = Quit; - mMailCheckProgressItem->setStatus( - i18n( "Fetched 1 message from %1. Terminating transmission...", - "Fetched %n messages from %1. Terminating transmission...", - numMsgs ) - .arg( mHost ) ); + if ( mMailCheckProgressItem ) + mMailCheckProgressItem->setStatus( + i18n( "Fetched 1 message from %1. Terminating transmission...", + "Fetched %n messages from %1. Terminating transmission...", + numMsgs ) + .arg( mHost ) ); url.setPath(QString("/commit")); kdDebug(5006) << "url: " << url.prettyURL() << endl; } @@ -760,11 +764,12 @@ mUidsOfNextSeenMsgsDict.remove( mUidForIdMap[*it] ); } idsOfMsgsToDelete.clear(); - mMailCheckProgressItem->setStatus( - i18n( "Fetched 1 message from %1. Terminating transmission...", - "Fetched %n messages from %1. Terminating transmission...", - numMsgs ) - .arg( mHost ) ); + if ( mMailCheckProgressItem ) + mMailCheckProgressItem->setStatus( + i18n( "Fetched 1 message from %1. Terminating transmission...", + "Fetched %n messages from %1. Terminating transmission...", + numMsgs ) + .arg( mHost ) ); KURL url = getUrl(); url.setPath(QString("/commit")); job = KIO::get( url, false, false ); @@ -783,8 +788,11 @@ int numMessages = canceled ? indexOfCurrentMsg : idsOfMsgs.count(); BroadcastStatus::instance()->setStatusMsgTransmissionCompleted( this->name(), numMessages, numBytes, numBytesRead, numBytesToRead, mLeaveOnServer, mMailCheckProgressItem ); - mMailCheckProgressItem->setComplete(); + // set mMailCheckProgressItem = 0 before calling setComplete() to prevent + // a race condition + ProgressItem *savedMailCheckProgressItem = mMailCheckProgressItem; mMailCheckProgressItem = 0; + savedMailCheckProgressItem->setComplete(); // that will delete it checkDone( ( numMessages > 0 ), canceled ? CheckAborted : CheckOK ); } } @@ -873,7 +881,9 @@ numMsgBytesRead = curMsgLen; numBytesRead += numMsgBytesRead - oldNumMsgBytesRead; dataCounter++; - if (dataCounter % 5 == 0) + if ( mMailCheckProgressItem && + ( dataCounter % 5 == 0 || + ( indexOfCurrentMsg + 1 == numMsgs && numMsgBytesRead == curMsgLen ) ) ) { QString msg; if (numBytes != numBytesToRead && mLeaveOnServer)