johu        14/03/13 16:02:45

  Added:                katepart-4.12.3-crash-fix.patch
  Log:
  Revision bump adds backported upstream patch by Michael Palimaka 
<[email protected]>, spotted by Thomas <[email protected]>. Patch 
fixes crashes in kde-bae/kate and dev-util/kdevelop, bug #502494.
  
  (Portage version: 2.2.8-r1/cvs/Linux x86_64, signed Manifest commit with key 
F3CFD2BD)

Revision  Changes    Path
1.1                  kde-base/katepart/files/katepart-4.12.3-crash-fix.patch

file : 
http://sources.gentoo.org/viewvc.cgi/gentoo-x86/kde-base/katepart/files/katepart-4.12.3-crash-fix.patch?rev=1.1&view=markup
plain: 
http://sources.gentoo.org/viewvc.cgi/gentoo-x86/kde-base/katepart/files/katepart-4.12.3-crash-fix.patch?rev=1.1&content-type=text/plain

Index: katepart-4.12.3-crash-fix.patch
===================================================================
diff --git a/part/completion/katecompletionmodel.cpp 
b/part/completion/katecompletionmodel.cpp
index 3fa8080..22af495 100644
--- a/part/completion/katecompletionmodel.cpp
+++ b/part/completion/katecompletionmodel.cpp
@@ -504,7 +504,7 @@ QModelIndex KateCompletionModel::indexForGroup( Group * g ) 
const
   return createIndex(row, 0, 0);
 }
 
-void KateCompletionModel::clearGroups( bool shouldReset )
+void KateCompletionModel::clearGroups()
 {
   clearExpanding();
   m_ungrouped->clear();
@@ -536,9 +536,6 @@ void KateCompletionModel::clearGroups( bool shouldReset )
 
   m_emptyGroups.append(m_bestMatches);
   m_groupHash.insert(BestMatchesProperty, m_bestMatches);
-
-  if(shouldReset)
-    reset();
 }
 
 QSet<KateCompletionModel::Group*> KateCompletionModel::createItems(const 
HierarchicalModelHandler& _handler, const QModelIndex& i, bool notifyModel) {
@@ -577,9 +574,10 @@ QSet<KateCompletionModel::Group*> 
KateCompletionModel::deleteItems(const QModelI
 
 void KateCompletionModel::createGroups()
 {
+  beginResetModel();
   //After clearing the model, it has to be reset, else we will be in an 
invalid state while inserting
   //new groups.
-  clearGroups(true);
+  clearGroups();
 
   bool has_groups=false;
   foreach (CodeCompletionModel* sourceModel, m_completionModels) {
@@ -600,10 +598,7 @@ void KateCompletionModel::createGroups()
   makeGroupItemsUnique();
   
   updateBestMatches();
-  
-  reset();
-
-  emit contentGeometryChanged();
+  endResetModel();
 }
 
 KateCompletionModel::Group* KateCompletionModel::createItem(const 
HierarchicalModelHandler& handler, const QModelIndex& sourceIndex, bool 
notifyModel)
@@ -660,9 +655,7 @@ void KateCompletionModel::slotRowsInserted( const 
QModelIndex & parent, int star
     affectedGroups += createItems(handler, parent.isValid() ? parent.child(i, 
0) :  handler.model()->index(i, 0), true);
 
   foreach (Group* g, affectedGroups)
-      hideOrShowGroup(g);
-
-    emit contentGeometryChanged();
+      hideOrShowGroup(g, true);
 }
 
 void KateCompletionModel::slotRowsRemoved( const QModelIndex & parent, int 
start, int end )
@@ -678,9 +671,7 @@ void KateCompletionModel::slotRowsRemoved( const 
QModelIndex & parent, int start
   }
 
   foreach (Group* g, affectedGroups)
-    hideOrShowGroup(g);
-
-  emit contentGeometryChanged();
+    hideOrShowGroup(g, true);
 }
 
 KateCompletionModel::Group* KateCompletionModel::fetchGroup( int attribute, 
const QString& scope, bool forceGrouping )
@@ -938,31 +929,32 @@ void KateCompletionModel::setCurrentCompletion( 
KTextEditor::CodeCompletionModel
 
   m_currentMatch[model] = completion;
 
-  bool needsReset = false;
+  const bool resetModel = (changeType != Narrow);
+  if (resetModel) {
+    beginResetModel();
+  }
   
   if (!hasGroups()) {
-    needsReset |= changeCompletions(m_ungrouped, changeType);
+    changeCompletions(m_ungrouped, changeType, !resetModel);
   } else {
     foreach (Group* g, m_rowTable) {
       if(g != m_argumentHints)
-        needsReset |= changeCompletions(g, changeType);
+        changeCompletions(g, changeType, !resetModel);
     }
     foreach (Group* g, m_emptyGroups) {
       if(g != m_argumentHints)
-        needsReset |= changeCompletions(g, changeType);
+        changeCompletions(g, changeType, !resetModel);
     }
   }
 
   // NOTE: best matches are also updated in resort
   resort();
 
-  kDebug()<<"needsReset"<<needsReset;
-  if(needsReset)
-    reset();
+  if (resetModel) {
+    endResetModel();
+  }
 
   clearExpanding(); //We need to do this, or be aware of expanding-widgets 
while filtering.
-  emit contentGeometryChanged();
-  kDebug();
 }
 
 QString KateCompletionModel::commonPrefixInternal(const QString &forcePrefix) 
const
@@ -1024,15 +1016,14 @@ QString KateCompletionModel::commonPrefix(QModelIndex 
selectedIndex) const
   return commonPrefix;
 }
 
-bool KateCompletionModel::changeCompletions( Group * g, changeTypes changeType 
)
+void KateCompletionModel::changeCompletions( Group * g, changeTypes 
changeType, bool notifyModel )
 {
-  bool notifyModel = true;
   if(changeType != Narrow) {
-    notifyModel = false;
     g->filtered = g->prefilter;
     //In the "Broaden" or "Change" case, just re-filter everything,
     //and don't notify the model. The model is notified afterwards through a 
reset().
   }
+
   //This code determines what of the filtered items still fit, and computes 
the ranges that were removed, giving
   //them to beginRemoveRows(..) in batches
   
@@ -1054,14 +1045,13 @@ bool KateCompletionModel::changeCompletions( Group * g, 
changeTypes changeType )
     }
   }
   
-  if(deleteUntil != -1) {
+  if(deleteUntil != -1 && notifyModel) {
     beginRemoveRows(indexForGroup(g), 0, deleteUntil);
     endRemoveRows();
   }
   
   g->filtered = newFiltered;
   hideOrShowGroup(g, notifyModel);
-  return !notifyModel;
 }
 
 int KateCompletionModel::Group::orderNumber() const {
@@ -1193,7 +1183,9 @@ void KateCompletionModel::setSortingEnabled( bool enable )
 {
   if (m_sortingEnabled != enable) {
     m_sortingEnabled = enable;
+    beginResetModel();
     resort();
+    endResetModel();
   }
 }
 
@@ -1256,8 +1248,9 @@ const QList< QList < int > > & 
KateCompletionModel::columnMerges( ) const
 
 void KateCompletionModel::setColumnMerges( const QList< QList < int > > & 
columnMerges )
 {
+  beginResetModel();
   m_columnMerges = columnMerges;
-  reset();
+  endResetModel();
 }
 
 int KateCompletionModel::translateColumn( int sourceColumn ) const
@@ -1557,7 +1550,9 @@ void KateCompletionModel::setSortingAlphabetical( bool 
alphabetical )
 {
   if (m_sortingAlphabetical != alphabetical) {
     m_sortingAlphabetical = alphabetical;
+    beginResetModel();
     resort();
+    endResetModel();
   }
 }
 
@@ -1571,11 +1566,13 @@ void KateCompletionModel::setSortingCaseSensitivity( 
Qt::CaseSensitivity cs )
 {
   if (m_sortingCaseSensitivity != cs) {
     m_sortingCaseSensitivity = cs;
+    beginResetModel();
     resort();
+    endResetModel();
   }
 }
 
-void KateCompletionModel::resort( )
+void KateCompletionModel::resort()
 {
   foreach (Group* g, m_rowTable)
     g->resort();
@@ -1585,7 +1582,6 @@ void KateCompletionModel::resort( )
 
   // call updateBestMatches here, so they are moved to the top again.
   updateBestMatches();
-  emit contentGeometryChanged();
 }
 
 bool KateCompletionModel::Item::isValid( ) const
@@ -1654,6 +1650,7 @@ void KateCompletionModel::setMaximumInheritanceDepth( int 
maxDepth )
 
 void KateCompletionModel::refilter( )
 {
+  beginResetModel();
   m_ungrouped->refilter();
 
   foreach (Group* g, m_rowTable)
@@ -1667,6 +1664,7 @@ void KateCompletionModel::refilter( )
   updateBestMatches();
 
   clearExpanding(); //We need to do this, or be aware of expanding-widgets 
while filtering.
+  endResetModel();
 }
 
 void KateCompletionModel::Group::refilter( )
@@ -2048,20 +2046,19 @@ void 
KateCompletionModel::removeCompletionModel(CodeCompletionModel * model)
   if (!model || !m_completionModels.contains(model))
     return;
 
+  beginResetModel();
   m_currentMatch.remove(model);
 
-  clearGroups(false);
+  clearGroups();
 
   model->disconnect(this);
 
   m_completionModels.removeAll(model);
+  endResetModel();
 
   if (!m_completionModels.isEmpty()) {
     // This performs the reset
     createGroups();
-  }else{
-    emit contentGeometryChanged();
-    reset();
   }
 }
 
@@ -2252,6 +2249,10 @@ void KateCompletionModel::rowSelected(const QModelIndex& 
row) {
 
 void KateCompletionModel::clearCompletionModels()
 {
+  if (m_completionModels.isEmpty())
+    return;
+
+  beginResetModel();
   foreach (CodeCompletionModel * model, m_completionModels)
     model->disconnect(this);
 
@@ -2260,6 +2261,7 @@ void KateCompletionModel::clearCompletionModels()
   m_currentMatch.clear();
 
   clearGroups();
+  endResetModel();
 }
 
 #include "katecompletionmodel.moc"
diff --git a/part/completion/katecompletionmodel.h 
b/part/completion/katecompletionmodel.h
index 5fedbcc..a10a533 100644
--- a/part/completion/katecompletionmodel.h
+++ b/part/completion/katecompletionmodel.h
@@ -183,7 +183,6 @@ class KATEPART_TESTS_EXPORT KateCompletionModel : public 
ExpandingWidgetModel
     void expandIndex(const QModelIndex& index);
     //Emitted whenever something has changed about the group of argument-hints
     void argumentHintsChanged();
-    void contentGeometryChanged();
 
   public Q_SLOTS:
     void setSortingEnabled(bool enable);
@@ -311,6 +310,7 @@ class KATEPART_TESTS_EXPORT KateCompletionModel : public 
ExpandingWidgetModel
 
   private:
     QString commonPrefixInternal(const QString &forcePrefix) const;
+    /// @note performs model reset
     void createGroups();
     ///Creates all sub-items of index i, or the item corresponding to index i. 
Returns the affected groups.
     ///i must be an index in the source model
@@ -319,8 +319,9 @@ class KATEPART_TESTS_EXPORT KateCompletionModel : public 
ExpandingWidgetModel
     ///i must be an index in the source model
     QSet<Group*> deleteItems(const QModelIndex& i);
     Group* createItem(const HierarchicalModelHandler&, const QModelIndex& i, 
bool notifyModel = false);
-    void clearGroups(bool reset = true);
-    void hideOrShowGroup(Group* g, bool notifyModel = true);
+    /// @note Make sure you're in a {begin,end}ResetModel block when calling 
this!
+    void clearGroups();
+    void hideOrShowGroup(Group* g, bool notifyModel = false);
     /// When forceGrouping is enabled, all given attributes will be used for 
grouping, regardless of the completion settings.
     Group* fetchGroup(int attribute, const QString& scope = QString(), bool 
forceGrouping = false);
     //If this returns nonzero on an index, the index is the header of the 
returned group
@@ -336,7 +337,7 @@ class KATEPART_TESTS_EXPORT KateCompletionModel : public 
ExpandingWidgetModel
     };
 
     //Returns whether the model needs to be reset
-    bool changeCompletions(Group* g, changeTypes changeType);
+    void changeCompletions(Group* g, changeTypes changeType, bool notifyModel);
 
     bool hasCompletionModel() const;
 
diff --git a/part/completion/katecompletionwidget.cpp 
b/part/completion/katecompletionwidget.cpp
index 64fa4ec..6dc63a0 100644
--- a/part/completion/katecompletionwidget.cpp
+++ b/part/completion/katecompletionwidget.cpp
@@ -325,7 +325,8 @@ void KateCompletionWidget::startCompletion(const 
KTextEditor::Range& word, const
 
   m_lastInvocationType = invocationType;
 
-  disconnect(this->model(), SIGNAL(contentGeometryChanged()), this, 
SLOT(modelContentChanged()));
+  disconnect(this->model(), SIGNAL(layoutChanged()), this, 
SLOT(modelContentChanged()));
+  disconnect(this->model(), SIGNAL(modelReset()), this, 
SLOT(modelContentChanged()));
 
   m_dontShowArgumentHints = true;
 
@@ -412,7 +413,8 @@ void KateCompletionWidget::startCompletion(const 
KTextEditor::Range& word, const
   cursorPositionChanged();
 
   if (!m_completionRanges.isEmpty()) {
-    connect(this->model(), SIGNAL(contentGeometryChanged()), this, 
SLOT(modelContentChanged()));
+    connect(this->model(), SIGNAL(layoutChanged()), this, 
SLOT(modelContentChanged()));
+    connect(this->model(), SIGNAL(modelReset()), this, 
SLOT(modelContentChanged()));
     //Now that all models have been notified, check whether the widget should 
be displayed instantly
     modelContentChanged();
   }



Reply via email to