kdepim: fix IMAP + SpamAssasin crash, as reported in http://bugs.kde.org/show_bug.cgi?id=113730
This commit is contained in:
parent
71384dedc3
commit
2092e9a6ef
2
kdepim/.md5sum
Normal file
2
kdepim/.md5sum
Normal file
@ -0,0 +1,2 @@
|
||||
e19a2a40e422ecd483884ce6e9ac8925 kdepim-3.5.0.tar.bz2
|
||||
d15928f485e12b33358a3b23174a97fb kmail-113730.diff
|
@ -6,16 +6,21 @@
|
||||
|
||||
name=kdepim
|
||||
version=3.5.0
|
||||
release=1
|
||||
source=(http://download.kde.org/stable/3.5/src/$name-$version.tar.bz2)
|
||||
release=2
|
||||
source=(http://download.kde.org/stable/3.5/src/$name-$version.tar.bz2 \
|
||||
kmail-113730.diff)
|
||||
|
||||
build() {
|
||||
cd $name-$version
|
||||
./configure --prefix=/usr \
|
||||
--disable-debug \
|
||||
--disable-dependency-tracking \
|
||||
--enable-final
|
||||
make
|
||||
make DESTDIR=$PKG install
|
||||
rm -rf $PKG/usr/share/doc
|
||||
cd $name-$version
|
||||
(
|
||||
cd kmail
|
||||
patch -p0 < $SRC/kmail-113730.diff
|
||||
)
|
||||
./configure --prefix=/usr \
|
||||
--disable-debug \
|
||||
--disable-dependency-tracking \
|
||||
--enable-final
|
||||
make
|
||||
make DESTDIR=$PKG install
|
||||
rm -rf $PKG/usr/share/doc
|
||||
}
|
||||
|
211
kdepim/kmail-113730.diff
Normal file
211
kdepim/kmail-113730.diff
Normal file
@ -0,0 +1,211 @@
|
||||
Index: kmcommands.cpp
|
||||
===================================================================
|
||||
--- kmcommands.cpp (Revision 487211)
|
||||
+++ kmcommands.cpp (Arbeitskopie)
|
||||
@@ -1496,30 +1496,30 @@
|
||||
|
||||
void KMMetaFilterActionCommand::start()
|
||||
{
|
||||
-#if 0 // use action scheduler
|
||||
- KMFilterMgr::FilterSet set = KMFilterMgr::All;
|
||||
- QPtrList<KMFilter> filters;
|
||||
- filters.append( mFilter );
|
||||
- ActionScheduler *scheduler = new ActionScheduler( set, filters, mHeaders );
|
||||
- scheduler->setAlwaysMatch( true );
|
||||
- scheduler->setAutoDestruct( true );
|
||||
+ if (ActionScheduler::isEnabled() ) {
|
||||
+ // use action scheduler
|
||||
+ KMFilterMgr::FilterSet set = KMFilterMgr::All;
|
||||
+ QValueList<KMFilter*> filters;
|
||||
+ filters.append( mFilter );
|
||||
+ ActionScheduler *scheduler = new ActionScheduler( set, filters, mHeaders );
|
||||
+ scheduler->setAlwaysMatch( true );
|
||||
+ scheduler->setAutoDestruct( true );
|
||||
|
||||
- int contentX, contentY;
|
||||
- HeaderItem *nextItem = mHeaders->prepareMove( &contentX, &contentY );
|
||||
- QPtrList<KMMsgBase> msgList = *mHeaders->selectedMsgs(true);
|
||||
- mHeaders->finalizeMove( nextItem, contentX, contentY );
|
||||
+ int contentX, contentY;
|
||||
+ HeaderItem *nextItem = mHeaders->prepareMove( &contentX, &contentY );
|
||||
+ QPtrList<KMMsgBase> msgList = *mHeaders->selectedMsgs(true);
|
||||
+ mHeaders->finalizeMove( nextItem, contentX, contentY );
|
||||
|
||||
-
|
||||
- for (KMMsgBase *msg = msgList.first(); msg; msg = msgList.next())
|
||||
- scheduler->execFilters( msg );
|
||||
-#else
|
||||
- KMCommand *filterCommand = new KMFilterActionCommand( mMainWidget,
|
||||
- *mHeaders->selectedMsgs(), mFilter);
|
||||
- filterCommand->start();
|
||||
- int contentX, contentY;
|
||||
- HeaderItem *item = mHeaders->prepareMove( &contentX, &contentY );
|
||||
- mHeaders->finalizeMove( item, contentX, contentY );
|
||||
-#endif
|
||||
+ for (KMMsgBase *msg = msgList.first(); msg; msg = msgList.next())
|
||||
+ scheduler->execFilters( msg );
|
||||
+ } else {
|
||||
+ KMCommand *filterCommand = new KMFilterActionCommand( mMainWidget,
|
||||
+ *mHeaders->selectedMsgs(), mFilter);
|
||||
+ filterCommand->start();
|
||||
+ int contentX, contentY;
|
||||
+ HeaderItem *item = mHeaders->prepareMove( &contentX, &contentY );
|
||||
+ mHeaders->finalizeMove( item, contentX, contentY );
|
||||
+ }
|
||||
}
|
||||
|
||||
FolderShortcutCommand::FolderShortcutCommand( KMMainWidget *mainwidget,
|
||||
Index: kmkernel.cpp
|
||||
===================================================================
|
||||
--- kmkernel.cpp (Revision 487211)
|
||||
+++ kmkernel.cpp (Arbeitskopie)
|
||||
@@ -1432,11 +1432,11 @@
|
||||
the_msgIndex = 0;
|
||||
#endif
|
||||
|
||||
-#if 0
|
||||
+//#if 0
|
||||
the_weaver = new KPIM::ThreadWeaver::Weaver( this );
|
||||
the_weaverLogger = new KPIM::ThreadWeaver::WeaverThreadLogger(this);
|
||||
the_weaverLogger->attach (the_weaver);
|
||||
-#endif
|
||||
+//#endif
|
||||
|
||||
connect( the_folderMgr, SIGNAL( folderRemoved(KMFolder*) ),
|
||||
this, SIGNAL( folderRemoved(KMFolder*) ) );
|
||||
Index: kmfilteraction.cpp
|
||||
===================================================================
|
||||
--- kmfilteraction.cpp (Revision 487211)
|
||||
+++ kmfilteraction.cpp (Arbeitskopie)
|
||||
@@ -1617,6 +1617,9 @@
|
||||
FILE *p;
|
||||
QByteArray ba;
|
||||
|
||||
+ // backup the serial number in case the header gets lost
|
||||
+ QString origSerNum = mMsg->headerField( "X-KMail-Filtered" );
|
||||
+
|
||||
p = popen(QFile::encodeName(mCmd), "r");
|
||||
int len =100;
|
||||
char buffer[100];
|
||||
@@ -1630,7 +1633,20 @@
|
||||
pclose(p);
|
||||
if ( !ba.isEmpty() ) {
|
||||
KPIM::ThreadWeaver::debug (1, "PipeJob::run: %s", QString(ba).latin1() );
|
||||
+ KMFolder *filterFolder = mMsg->parent();
|
||||
+ ActionScheduler *handler = MessageProperty::filterHandler( mMsg->getMsgSerNum() );
|
||||
+
|
||||
mMsg->fromByteArray( ba );
|
||||
+ if ( !origSerNum.isEmpty() )
|
||||
+ mMsg->setHeaderField( "X-KMail-Filtered", origSerNum );
|
||||
+ if ( filterFolder && handler ) {
|
||||
+ bool oldStatus = handler->ignoreChanges( true );
|
||||
+ filterFolder->take( filterFolder->find( mMsg ) );
|
||||
+ filterFolder->addMsg( mMsg );
|
||||
+ handler->ignoreChanges( oldStatus );
|
||||
+ } else {
|
||||
+ kdDebug(5006) << "Warning: Cannot refresh the message from the external filter." << endl;
|
||||
+ }
|
||||
}
|
||||
|
||||
KPIM::ThreadWeaver::debug (1, "PipeJob::run: done.\n" );
|
||||
Index: actionscheduler.h
|
||||
===================================================================
|
||||
--- actionscheduler.h (Revision 487211)
|
||||
+++ actionscheduler.h (Arbeitskopie)
|
||||
@@ -77,10 +77,10 @@
|
||||
of messages left to process is empty */
|
||||
void setFilterList( QValueList<KMFilter*> filters );
|
||||
|
||||
- /* Set the id of the account associated with this scheduler */
|
||||
+ /** Set the id of the account associated with this scheduler */
|
||||
void setAccountId( uint id ) { mAccountId = id; mAccount = true; }
|
||||
|
||||
- /* Clear the id of the account associated with this scheduler */
|
||||
+ /** Clear the id of the account associated with this scheduler */
|
||||
void clearAccountId() { mAccountId = 0; mAccount = false; }
|
||||
|
||||
/** Queue a message for filtering */
|
||||
@@ -88,9 +88,16 @@
|
||||
void execFilters(const QPtrList<KMMsgBase> msgList);
|
||||
void execFilters(KMMsgBase* msgBase);
|
||||
void execFilters(Q_UINT32 serNum);
|
||||
+
|
||||
static QString debug();
|
||||
static bool isEnabled();
|
||||
|
||||
+ /** Allow or deny manipulations on the message to be filtered.
|
||||
+ This is needed when using pipe-through filters, because the
|
||||
+ changes made by the filter have to be written back.
|
||||
+ The old value before applying the new value is returned. */
|
||||
+ bool ignoreChanges( bool ignore );
|
||||
+
|
||||
signals:
|
||||
/** Emitted when filtering is completed */
|
||||
void result(ReturnCode);
|
||||
Index: actionscheduler.cpp
|
||||
===================================================================
|
||||
--- actionscheduler.cpp (Revision 487211)
|
||||
+++ actionscheduler.cpp (Arbeitskopie)
|
||||
@@ -570,7 +570,7 @@
|
||||
(!mAccount ||
|
||||
(mAccount && (*mFilterIt).applyOnAccount(mAccountId)))) ||
|
||||
((mSet & KMFilterMgr::Explicit) && (*mFilterIt).applyOnExplicit())) {
|
||||
-
|
||||
+
|
||||
// filter is applicable
|
||||
if ( FilterLog::instance()->isLogging() ) {
|
||||
QString logText( i18n( "<b>Evaluating filter rules:</b> " ) );
|
||||
@@ -646,8 +646,11 @@
|
||||
if (!orgMsg || !orgMsg->parent()) {
|
||||
// Original message is gone, no point filtering it anymore
|
||||
mSrcFolder->removeMsg( mSrcFolder->find( msg ) );
|
||||
+ kdDebug(5006) << "The original serial number is missing. "
|
||||
+ << "Cannot complete the filtering." << endl;
|
||||
mExecutingLock = false;
|
||||
processMessageTimer->start( 0, true );
|
||||
+ return;
|
||||
} else {
|
||||
if (!folder) // no filter folder specified leave in current place
|
||||
folder = orgMsg->parent();
|
||||
@@ -659,7 +662,7 @@
|
||||
mSrcFolder->addMsg( msg );
|
||||
mIgnore = false;
|
||||
|
||||
- if (msg && kmkernel->folderIsTrash( folder ))
|
||||
+ if (msg && folder && kmkernel->folderIsTrash( folder ))
|
||||
KMFilterAction::sendMDN( msg, KMime::MDN::Deleted );
|
||||
|
||||
timeOutTime = QTime::currentTime();
|
||||
@@ -722,8 +725,6 @@
|
||||
|
||||
void ActionScheduler::copyMessageFinished( KMCommand *command )
|
||||
{
|
||||
- // FIXME remove the debug output
|
||||
- kdDebug(5006) << "##### ActionScheduler::copyMessageFinished( KMCommand *command )" << endl;
|
||||
if ( command->result() != KMCommand::OK )
|
||||
actionMessage( KMFilterAction::ErrorButGoOn );
|
||||
else
|
||||
@@ -803,4 +804,11 @@
|
||||
return sEnabled;
|
||||
}
|
||||
|
||||
+bool ActionScheduler::ignoreChanges( bool ignore )
|
||||
+{
|
||||
+ bool oldValue = mIgnore;
|
||||
+ mIgnore = ignore;
|
||||
+ return oldValue;
|
||||
+}
|
||||
+
|
||||
#include "actionscheduler.moc"
|
||||
Index: kmversion.h
|
||||
===================================================================
|
||||
--- kmversion.h (Revision 487211)
|
||||
+++ kmversion.h (Arbeitskopie)
|
||||
@@ -3,6 +3,6 @@
|
||||
#ifndef kmversion_h
|
||||
#define kmversion_h
|
||||
|
||||
-#define KMAIL_VERSION "1.9"
|
||||
+#define KMAIL_VERSION "1.9.1"
|
||||
|
||||
#endif /*kmversion_h*/
|
Loading…
x
Reference in New Issue
Block a user