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

List:       kde-commits
Subject:    branches/KDE/3.5/kdepim/akregator/src
From:       Frank Osterfeld <frank.osterfeld () kdemail ! net>
Date:       2005-09-24 7:33:11
Message-ID: 1127547191.519047.24353.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 463464 by osterfeld:

don't crash when deleting items

Weird things happened in feed.cpp:772:

772: emit signalArticlesRemoved(this, d->removedArticlesNotify);
773: d->removedArticlesNotify.clear();

It seems clear() was called before the signal was finally handled by articlelist. \
(due to some delayed  signal forwarding me thinks)
Also, the signal emit doesn't actually copy the list (not even on write), so the \
clear() breaks the  refcounting in Article::d somehow, deleting the last Article \
referencing the Article::Private object of the  deleted article. 
=> ArticleListView operates on Article objects with invalid d pointers.

BUG: 112932


 M  +3 -0      akregator_view.cpp  
 M  +3 -2      article.cpp  
 M  +10 -4     feed.cpp  


--- branches/KDE/3.5/kdepim/akregator/src/akregator_view.cpp #463463:463464
@@ -1304,7 +1304,10 @@
         }
 
         for (QValueList<Feed*>::Iterator it = feeds.begin(); it != feeds.end(); \
++it) +        {
             (*it)->setNotificationMode(true);
+        }
+
         if (m_listTabWidget->activeView()->selectedNode())
             m_listTabWidget->activeView()->selectedNode()->setNotificationMode(true);
  }
--- branches/KDE/3.5/kdepim/akregator/src/article.cpp #463463:463464
@@ -197,13 +197,14 @@
 {
     if (isDeleted())
         return;
-    if (d->feed)
-        d->feed->setArticleDeleted(*this);
+  
     setStatus(Read);
     d->status = Private::Deleted | Private::Read;
     d->archive->setStatus(d->guid, d->status);
     d->archive->setDeleted(d->guid);
 
+    if (d->feed)
+        d->feed->setArticleDeleted(*this);
 }
 
 bool Article::isDeleted() const
--- branches/KDE/3.5/kdepim/akregator/src/feed.cpp #463463:463464
@@ -711,7 +711,10 @@
 {
     if (!d->deletedArticles.contains(a))
         d->deletedArticles.append(a);
-    d->removedArticlesNotify.append(a);
+
+    if (!d->removedArticlesNotify.contains(a))
+        d->removedArticlesNotify.append(a);
+
     articlesModified();
 }
 
@@ -754,17 +757,20 @@
 {
     if (!d->addedArticlesNotify.isEmpty())
     {
-        emit signalArticlesAdded(this, d->addedArticlesNotify);
+        QValueList<Article> l = d->addedArticlesNotify;
+        emit signalArticlesAdded(this, l);
         d->addedArticlesNotify.clear();
     }
     if (!d->updatedArticlesNotify.isEmpty())
     {
-        emit signalArticlesUpdated(this, d->updatedArticlesNotify);
+        QValueList<Article> l = d->updatedArticlesNotify;
+        emit signalArticlesUpdated(this, l);
         d->updatedArticlesNotify.clear();
     }
     if (!d->removedArticlesNotify.isEmpty())
     {
-        emit signalArticlesRemoved(this, d->removedArticlesNotify);
+        QValueList<Article> l = d->removedArticlesNotify;
+        emit signalArticlesRemoved(this, l);
         d->removedArticlesNotify.clear();
     }
     TreeNode::doArticleNotification();


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

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