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

List:       kde-commits
Subject:    KDE/kdelibs/khtml/html
From:       Maks Orlovich <maksim () kde ! org>
Date:       2005-07-09 23:03:12
Message-ID: 1120950192.721281.450.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 433186 by orlovich:

Fix at least one of the reasons for this:
konqueror: /home/maksim/kde3/kdelibs/khtml/misc/loader.cpp:1307: static void \
khtml::Cache::clear(): Assertion `it.current()->canDelete()' failed. And actually, \
quite a bit of other potential leaks or worse in the parser. Unlike in WC, khtml's \
parser's element stack ref's and deref's elements. So it's not right  to merely \
change the pointer in the stack without updating the refcounts. Testcase upcoming. \
Thanks to Ismail for the test page.

May or may not help #85057
CCBUG:85057


 M  +12 -5     htmlparser.cpp  


--- trunk/KDE/kdelibs/khtml/html/htmlparser.cpp #433185:433186
@@ -86,6 +86,13 @@
     ~HTMLStackElem()
         { node->deref(); }
 
+    void setNode(NodeImpl* newNode)
+    {
+        newNode->ref();
+        node->deref();
+        node = newNode;
+    }
+
     int       id;
     int       level;
     bool      strayTableContent;
@@ -1301,7 +1308,7 @@
             HTMLStackElem* nextElem = currElem->next;
             if (!isResidualStyleTag(currElem->id)) {
                 prevElem->next = nextElem;
-                prevElem->node = currElem->node;
+                prevElem->setNode(currElem->node);
                 delete currElem;
             }
             else
@@ -1326,7 +1333,7 @@
                 currNode = currElem->node->cloneNode(false);
 
                 // Change the stack element's node to point to the clone.
-                currElem->node = currNode;
+                currElem->setNode(currNode);
 
                 // Attach the previous node as a child of this new node.
                 if (prevNode)
@@ -1386,7 +1393,7 @@
         currElem = currElem->next;
     }
     prevElem->next = elem->next;
-    prevElem->node = elem->node;
+    prevElem->setNode(elem->node);
     delete elem;
 
     // Step 7: Reopen intermediate inlines, e.g., <b><p><i>Foo</b>Goo</p>.
@@ -1407,7 +1414,7 @@
             // curr->id rather than the node that you should pop to when the element \
gets pulled off  // the stack.
             popOneBlock(false);
-            curr->node = currNode;
+            curr->setNode(currNode);
             curr->next = residualStyleStack;
             residualStyleStack = curr;
         }
@@ -1541,7 +1548,7 @@
                 // the stack.
                 popOneBlock(false);
                 Elem->next = residualStyleStack;
-                Elem->node = currNode;
+                Elem->setNode(currNode);
                 residualStyleStack = Elem;
             }
             else


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

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