[Bug 96498] Cancelling entering password for secured mails causes kmail to crash

Stephan Kulow <[email protected]>
Newsgroups gmane.comp.kde.devel.kmail
Message-ID <[email protected]>
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.
         
http://bugs.kde.org/show_bug.cgi?id=96498         
coolo kde org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|                            |FIXED



------- Additional Comments From coolo kde org  2007-03-21 16:56 -------
SVN commit 645047 by coolo:

another one of my most hated kmail crashes: if you cancel
gpg passphrase, kmail will crash in most cases you was careless.
After some fiddling I didn't find a better solution to this
problem than adding a direct protection member to the message.
BUG: 96498


 M  +12 -0     kmheaders.cpp  
 M  +2 -0      kmmessage.cpp  
 M  +7 -0      kmmessage.h  
 M  +10 -1     kmreaderwin.cpp  


--- branches/KDE/3.5/kdepim/kmail/kmheaders.cpp #645046:645047
 @ -1731,6 +1731,9  @
 
 void KMHeaders::selectNextMessage()
 {
+  KMMessage *cm = currentMsg();
+  if ( cm && cm->isBeingParsed() )
+    return;
   QListViewItem *lvi = currentItem();
   if( lvi ) {
     QListViewItem *below = lvi->itemBelow();
 @ -1765,6 +1768,9  @
 
 void KMHeaders::selectPrevMessage()
 {
+  KMMessage *cm = currentMsg();
+  if ( cm && cm->isBeingParsed() )
+    return;
   QListViewItem *lvi = currentItem();
   if( lvi ) {
     QListViewItem *above = lvi->itemAbove();
 @ -1788,6 +1794,9  @
 
 void KMHeaders::incCurrentMessage()
 {
+  KMMessage *cm = currentMsg();
+  if ( cm && cm->isBeingParsed() )
+    return;
   QListViewItem *lvi = currentItem();
   if ( lvi && lvi->itemBelow() ) {
 
 @ -1803,6 +1812,9  @
 
 void KMHeaders::decCurrentMessage()
 {
+  KMMessage *cm = currentMsg();
+  if ( cm && cm->isBeingParsed() )
+    return;
   QListViewItem *lvi = currentItem();
   if ( lvi && lvi->itemAbove() ) {
     disconnect(this,SIGNAL(currentChanged(QListViewItem*)),
--- branches/KDE/3.5/kdepim/kmail/kmmessage.cpp #645046:645047
 @ -152,6 +152,7  @
   mUnencryptedMsg = 0;
   mLastUpdated = 0;
   mCursorPos = 0;
+  mIsParsed = false;
 }
 
 void KMMessage::assign( const KMMessage& other )
 @ -174,6 +175,7  @
   mEncryptionState = other.mEncryptionState;
   mSignatureState = other.mSignatureState;
   mMDNSentState = other.mMDNSentState;
+  mIsParsed = other.mIsParsed;
   mDate    = other.mDate;
   if( other.hasUnencryptedMsg() )
     mUnencryptedMsg = new KMMessage( *other.unencryptedMsg() );
--- branches/KDE/3.5/kdepim/kmail/kmmessage.h #645046:645047
 @ -855,6 +855,12  @
   /** Set cursor position as offset from message start */
   void setCursorPos(int pos) { mCursorPos = pos; };
 
+  /* This is set in kmreaderwin if a message is being parsed to avoid
+     other parts of kmail (e.g. kmheaders) destroying the message. 
+     Parsing can take longer and can be async (in case of gpg mails) */
+  bool isBeingParsed() const { return mIsParsed; }
+  void setIsBeingParsed( bool t ) { mIsParsed = t; }
+
 private:
 
   /** Initialization shared by the ctors. */
 @ -869,6 +875,7  @
   bool mDecodeHTML :1;
   bool mReadyToShow :1;
   bool mComplete :1;
+  bool mIsParsed : 1;
   static const KMail::HeaderStrategy * sHeaderStrategy;
   static QString sForwardStr;
   const QTextCodec * mOverrideCodec;
--- branches/KDE/3.5/kdepim/kmail/kmreaderwin.cpp #645046:645047
 @ -1504,7 +1504,14  @
 
   assert(aMsg!=0);
 
-  delete mRootNode;
+  aMsg->setIsBeingParsed( true );
+
+  if ( mRootNode && !mRootNode->processed() )
+  {
+    kdWarning() << "The root node is not yet processed! Danger!\n";
+    return;
+  } else
+    delete mRootNode;
   mRootNode = partNode::fromMessage( aMsg );
   const QCString mainCntTypeStr = mRootNode->typeString() + '/' + mRootNode->subTypeString();
 
 @ -1642,6 +1649,8  @
     showHideMimeTree( rootNodeCntType == DwMime::kTypeText &&
 		      rootNodeCntSubtype == DwMime::kSubtypePlain );
   }
+
+  aMsg->setIsBeingParsed( false );
 }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.