[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kmail-devel
Subject:    [Bug 96498] Cancelling entering password for secured mails causes
From:       Stephan Kulow <coolo () kde ! org>
Date:       2007-03-21 15:56:44
Message-ID: 20070321155644.15181.qmail () ktown ! kde ! org
[Download RAW message or body]

------- 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 );
 }
_______________________________________________
KMail developers mailing list
KMail-devel@kde.org
https://mail.kde.org/mailman/listinfo/kmail-devel
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic