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

List:       kde-commits
Subject:    branches/KDE/3.5/kdewebdev/quanta
From:       Andras Mantia <amantia () kde ! org>
Date:       2007-10-04 7:44:31
Message-ID: 1191483871.617585.24996.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 720983 by amantia:

This should finally fix all the cases when Quanta crashes due to double free in the \
node tree. It's more a workaround, but that's what I have now...

 M  +1 -0      ChangeLog  
 M  +10 -10    components/tableeditor/tableeditor.cpp  
 M  +12 -2     parsers/node.cpp  
 M  +8 -0      parsers/node.h  
 M  +5 -5      parsers/parser.cpp  
 M  +2 -2      parsers/saparser.cpp  
 M  +8 -8      parts/kafka/kafkacommon.cpp  
 M  +3 -3      parts/kafka/undoredo.cpp  
 M  +2 -2      quanta.kdevelop  
 M  +4 -4      src/document.cpp  
 M  +2 -2      src/quantaview.cpp  


--- branches/KDE/3.5/kdewebdev/quanta/ChangeLog #720982:720983
@@ -6,6 +6,7 @@
       - fix add to project when saving a new file into a symlinked directory \
                [#148529]
       - do not lose CSS selectors after editing inside the dialog if they are
         repeated [#145413]
+      - avoid crashes in various (random) cases
 
 
 Version 3.5.7 (Release date: xx-xx-2006; Started 06-02-2006)
--- branches/KDE/3.5/kdewebdev/quanta/components/tableeditor/tableeditor.cpp \
#720982:720983 @@ -930,14 +930,14 @@
         updatedMainNodes.append(mainTableNode);
       }
     }
-    delete (*it3).node;
+    Node::deleteNode((*it3).node);
     (*it3).node = 0L;
     newNum--;
   }
   m_tableTags->erase(it2);
   m_dataTable->removeRow(m_row);
   QValueList<TableNode>::Iterator it = m_tableRows->at(m_row);
-  delete (*it).node;
+  Node::deleteNode((*it).node);
   newNum--;
   m_tableRows->erase(it);
   m_rowSpin->setValue(m_dataTable->numRows());
@@ -981,7 +981,7 @@
         updatedMainNodes.append(mainTableNode);
       }
     }
-    delete (*it2).node;
+    Node::deleteNode((*it2).node);
     newNum--;
     (*it).erase(it2);
   }
@@ -1021,7 +1021,7 @@
 void TableEditor::deleteList( QValueList<TableNode> *table )
 {
   for (QValueList<TableNode>::Iterator it = table->begin(); it != table->end(); \
                ++it) {
-    delete (*it).node;
+    Node::deleteNode((*it).node);
     newNum--;
   }
   delete table;
@@ -1033,7 +1033,7 @@
 {
     for (QValueList<QValueList<TableNode> >::Iterator it = matrix->begin(); it != \
                matrix->end(); ++it) {
       for (QValueList<TableNode>::Iterator it2 = (*it).begin(); it2 != (*it).end(); \
                ++it2) {
-        delete (*it2).node;
+        Node::deleteNode((*it2).node);
         newNum--;
       }
   }
@@ -1063,7 +1063,7 @@
         setCellText(m_dataTable, tRow + i, lCol + j, i18n("Merged with (%1, \
%2).").arg(tRow + 1).arg(lCol + 1));  m_dataTable->item(tRow + i, lCol + \
j)->setEnabled(false);  TableNode *tableNode = &((*m_tableTags)[tRow + i][lCol + j]);
-        delete tableNode->node;
+        Node::deleteNode(tableNode->node);
         tableNode->node = new Node(0L);
         newNum++;
         tableNode->node->tag = new Tag(*(mainTableNode->node->tag));
@@ -1107,7 +1107,7 @@
               tableNode.mergedRow == (*it2).mergedRow &&
               tableNode.mergedCol == (*it2).mergedCol) {
 
-              delete (*it2).node;
+              Node::deleteNode((*it2).node);
               newNum--;
               it2 = (*it).erase(it2);
               newTableNode.merged = false;
@@ -1142,7 +1142,7 @@
       QValueList<TableNode>::Iterator iter2 = (*iter1).at(tableNode.mergedCol);
       iter2 = (*iter1).erase(iter2);
       (*iter1).insert(iter2, newTableNode);
-      delete tmpNode.node;
+      Node::deleteNode(tmpNode.node);
       newNum--;
     }
 }
@@ -1218,7 +1218,7 @@
        setCellText(m_dataTable, table.row, table.col, cellData);
       }
       //cleanup on success
-      delete baseNode;
+      Node::deleteNode(baseNode);
       baseNode = savedBaseNode;
       delete localParser;
       delete w;
@@ -1231,7 +1231,7 @@
     m_dataTable->item(table.row, table.col)->setPixmap(QPixmap());
     m_dataTable->updateCell(table.row, table.col);
     if (tempDocCreated) {
-      delete baseNode;
+      Node::deleteNode(baseNode);
       baseNode = savedBaseNode;
       delete localParser;
       delete w;
--- branches/KDE/3.5/kdewebdev/quanta/parsers/node.cpp #720982:720983
@@ -56,6 +56,16 @@
   }
 }
 
+bool Node::deleteNode(Node *node)
+{
+  if (nodes.contains(node) == 0)
+  {     
+    //kdDebug(24000) << "Trying to delete a node with address " << node << " that \
was not allocated!" << endl;  +    return false;
+  }
+  delete node;
+  return true;
+}
 
 Node::~Node()
 {
@@ -82,9 +92,9 @@
       parent->child = 0L;
   if (removeAll)
   {
-    delete child;
+    deleteNode(child);
     child = 0L;
-    delete next;
+    deleteNode(next);
     next = 0L;
   } else
   {
--- branches/KDE/3.5/kdewebdev/quanta/parsers/node.h #720982:720983
@@ -63,6 +63,14 @@
 public:
  Node( Node *parent );
  ~Node();
+ 
+ /** 
+  * Deletes the node. Use this instead of delete node; as it checkes if there
+  * node was really allocated or not and avoid nasty crashes.
+  * @return true - if node existed and is deleted
+  *         false - if the node did not exist
+  */
+ static bool deleteNode(Node *node);
 
  /**
   * Copy everything from node except prev, next, child, parent, listItem, group, \
                groupTag, which are set to Null
--- branches/KDE/3.5/kdewebdev/quanta/parsers/parser.cpp #720982:720983
@@ -524,12 +524,12 @@
      kdDebug(24000) << "Node objects before delete = " << NN << " ; list count = " \
<< nodes.count() << endl;  //kdDebug(24000) << "baseNode before delete = " << \
baseNode << endl;  //ParserCommon::coutTree(m_node, 2);
-     delete baseNode;
+     Node::deleteNode(baseNode);
      baseNode = 0L;
      kdDebug(24000) << "Node objects after delete = " << NN << " ; list count = " << \
nodes.count() << endl;  QValueList<Node*> nList = nodes;
 /*     for (QValueList<Node*>::ConstIterator it = nList.constBegin(); it != \
                nList.constEnd(); ++it)
-       delete (*it);
+     Node::deleteNode(*it);
      kdDebug(24000) << "Node objects after cleanup = " << NN << " ; list count = " \
<< nodes.count() << endl;       */  }
   m_node = 0L;
@@ -1056,7 +1056,7 @@
        if (lastNode->parent && lastNode->parent->child == lastNode)
            lastNode->parent->child = 0L;
      }
-     delete lastNode;
+     Node::deleteNode(lastNode);
      nodeNum--;
      lastNode = 0L;
      logReparse(modifs, w);
@@ -1357,7 +1357,7 @@
         {
           GroupElement *groupElement = it.data()[i];
           groupElement->node->tag->write()->userTagList.remove(groupElement->node->tag->name.lower());
                
-          delete it.data()[i]->node;
+          Node::deleteNode(it.data()[i]->node);
           delete it.data()[i];
         }
       }
@@ -1611,7 +1611,7 @@
           uint listCount = it.data().count();
           for (uint i = 0 ; i < listCount; i++)
           {
-            delete it.data()[i]->node;
+            Node::deleteNode(it.data()[i]->node);
             delete it.data()[i];
           }
         }
--- branches/KDE/3.5/kdewebdev/quanta/parsers/saparser.cpp #720982:720983
@@ -895,7 +895,7 @@
         m_currentNode->tag->type != Tag::Text &&
         m_currentNode->tag->type != Tag::Empty)
     {
-      delete m_currentNode->child;
+      Node::deleteNode(m_currentNode->child);
       m_currentNode->child = 0L;
       AreaStruct area(m_currentNode->tag->area());
       s_next = 0L;
@@ -913,7 +913,7 @@
           Node *secondNext = m_currentNode->next->next;
           if (secondNext)
             secondNext->prev = m_currentNode;
-          delete m_currentNode->next;
+          Node::deleteNode(m_currentNode->next);
           m_currentNode->next = secondNext;
           m_useNext = true;
         }
--- branches/KDE/3.5/kdewebdev/quanta/parts/kafka/kafkacommon.cpp #720982:720983
@@ -1513,7 +1513,7 @@
 
     if(!startNode || !endNode || !newNode || !doc)
     {
-        delete newNode;
+        Node::deleteNode(newNode);
         return false;
     }
 
@@ -1523,8 +1523,8 @@
     newNodeQTag = QuantaCommon::tagFromDTD(newNode);
     if(!newNodeQTag || !lastNewNodeQTag)
     {
-        delete newNode;
-        return false;
+      Node::deleteNode(newNode);
+      return false;
     }
 
     //Then search for the common parent of startNode and endNode (commonParent)
@@ -1608,8 +1608,8 @@
 
     /**if(!lastValidEndParent || !lastValidStartParent)
     {
-    delete newNode;
-        return false;
+      Node::deleteNode(newNode);
+      return false;
     }*/
 
     //OK now, we are sure the node can be inserted. Start the work by splitting
@@ -1749,8 +1749,8 @@
         }
         else
         {
-            delete newNode;
-            return false;
+          Node::deleteNode(newNode);
+          return false;
         }
     }
     else
@@ -2108,7 +2108,7 @@
 
     //The newNode was a template, let's delete it now.
     if(level == 0)
-        delete newNode;
+      Node::deleteNode(newNode);
     return true;
 }
 
--- branches/KDE/3.5/kdewebdev/quanta/parts/kafka/undoredo.cpp #720982:720983
@@ -64,7 +64,7 @@
     m_node->prev = 0L;
     if(m_type == NodeRemoved)
       m_node->child = 0L;
-    delete m_node;
+    Node::deleteNode(m_node);
   }
   if(m_tag)
     delete m_tag;
@@ -77,9 +77,9 @@
   {
     //FIXME: Andras: I don't have the slightest idea what this is supposed to do and \
                what the
     //below comment means, but without a real delete we are seriously leaking memory
-    delete m_node;
+    Node::deleteNode(m_node);
     m_node = 0L;
-    delete node;
+    Node::deleteNode(node);
     return;
   }
   else
--- branches/KDE/3.5/kdewebdev/quanta/quanta.kdevelop #720982:720983
@@ -259,10 +259,10 @@
   </kdevcvs>
   <kdevfilecreate>
     <filetypes>
-      <type icon="" ext="h" name="C++ header" create="template" >
+      <type icon="" ext="h" create="template" name="C++ header" >
         <descr>Quanta speicfic header</descr>
       </type>
-      <type icon="source_cpp" ext="cpp" name="C++ source" create="template" >
+      <type icon="source_cpp" ext="cpp" create="template" name="C++ source" >
         <descr>A new empty C++ file.</descr>
       </type>
     </filetypes>
--- branches/KDE/3.5/kdewebdev/quanta/src/document.cpp #720982:720983
@@ -2430,12 +2430,12 @@
         if ( (bl != bl2 || bc !=bc2) && previousNode)
         {
           previousNode->tag->beginPos(bl2, bc2);
-          delete currentNode;
+          Node::deleteNode(currentNode);
           currentNode = previousNode;
           previousNode = 0L;
         } else
         {
-          delete previousNode;
+          Node::deleteNode(previousNode);
           previousNode = 0L;
         }
         if (bl == bl2 && bc == bc2 &&
@@ -2502,8 +2502,8 @@
           }
         }
       }
-      delete currentNode;
-      delete previousNode;
+      Node::deleteNode(currentNode);
+      Node::deleteNode(previousNode);
     }
 
     quantaApp->slotNewLineColumn();
--- branches/KDE/3.5/kdewebdev/quanta/src/quantaview.cpp #720982:720983
@@ -146,12 +146,12 @@
     {
         parser->setSAParserEnabled(false);
         kdDebug(24000) << "Node objects before delete = " << NN << " ; list count = \
                " << nodes.count() << endl;
-        delete baseNode;
+        Node::deleteNode(baseNode);
         baseNode = 0L;
         kdDebug(24000) << "Node objects after delete = " << NN << " ; list count = " \
<< nodes.count() << endl;  QValueList<Node*> nList = nodes;
 /*        for (QValueList<Node*>::ConstIterator it = nList.constBegin(); it != \
                nList.constEnd(); ++it)
-          delete (*it);
+        Node::deleteNode(*it);
         kdDebug(24000) << "Node objects after cleanup = " << NN << " ; list count = \
" << nodes.count() << endl;*/  }
     if (m_document)


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

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