File 0249-webkit-stale-frame-pointer.diff of Package libqt4

qt-bugs@ issue : none yet
Trolltech task ID : none yet
bugs.kde.org number : none
applied: no
author: Apple

this fixes CVE-2008-3632:

Use-after-free vulnerability in WebKit in Apple iPod touch 1.1 through 2.0.2,
and iPhone 1.0 through 2.0.2, allows remote attackers to execute arbitrary code
or cause a denial of service (application crash) via a web page with crafted
Cascading Style Sheets (CSS) import statements.


--- src/3rdparty/webkit/WebCore/dom/Document.cpp
+++ src/3rdparty/webkit/WebCore/dom/Document.cpp
@@ -291,9 +291,8 @@
     m_renderArena = 0;
 
     m_axObjectCache = 0;
-    
-    // FIXME: DocLoader probably no longer needs the frame argument
-    m_docLoader = new DocLoader(frame, this);
+
+    m_docLoader = new DocLoader(this);
 
     visuallyOrdered = false;
     m_bParsing = false;
@@ -1169,15 +1168,23 @@
     if (render)
         render->destroy();
 
-    // FIXME: is this needed or desirable?
-    m_frame = 0;
-    
+    // This is required, as our Frame might delete itself as soon as it detaches
+    // us.  However, this violates Node::detach() symantics, as it's never
+    // possible to re-attach.  Eventually Document::detach() should be renamed
+    // or this call made explicit in each of the callers of Document::detach().
+    clearFramePointer();
+
     if (m_renderArena) {
         delete m_renderArena;
         m_renderArena = 0;
     }
 }
 
+void Document::clearFramePointer()
+{
+    m_frame = 0;
+}
+
 void Document::removeAllEventListenersFromAllNodes()
 {
     m_windowEventListeners.clear();
--- src/3rdparty/webkit/WebCore/dom/Document.h
+++ src/3rdparty/webkit/WebCore/dom/Document.h
@@ -344,6 +344,8 @@
     virtual void attach();
     virtual void detach();
 
+    void clearFramePointer();
+
     RenderArena* renderArena() { return m_renderArena; }
 
     AXObjectCache* axObjectCache() const;
--- src/3rdparty/webkit/WebCore/loader/DocLoader.cpp
+++ src/3rdparty/webkit/WebCore/loader/DocLoader.cpp
@@ -40,10 +40,9 @@
 
 namespace WebCore {
 
-DocLoader::DocLoader(Frame *frame, Document* doc)
+DocLoader::DocLoader(Document* doc)
     : m_cache(cache())
     , m_cachePolicy(CachePolicyVerify)
-    , m_frame(frame)
     , m_doc(doc)
     , m_requestCount(0)
     , m_autoLoadImages(true)
@@ -53,6 +52,11 @@
     m_cache->addDocLoader(this);
 }
 
+Frame* DocLoader::frame() const
+{
+    return m_doc->frame();
+}
+
 DocLoader::~DocLoader()
 {
     HashMap<String, CachedResource*>::iterator end = m_docResources.end();
@@ -146,7 +150,7 @@
         }
     }
                                                           
-    if (m_frame && m_frame->loader()->isReloading())
+    if (frame() && frame()->loader()->isReloading())
         setCachePolicy(CachePolicyReload);
 
     checkForReload(fullURL);
@@ -197,8 +201,8 @@
 void DocLoader::setLoadInProgress(bool load)
 {
     m_loadInProgress = load;
-    if (!load && m_frame)
-        m_frame->loader()->loadDone();
+    if (!load && frame())
+        frame()->loader()->loadDone();
 }
 
 void DocLoader::checkCacheObjectStatus(CachedResource* resource)
@@ -217,7 +221,7 @@
     }
     
     // Notify the caller that we "loaded".
-    if (!m_frame || m_frame->loader()->haveToldBridgeAboutLoad(resource->url()))
+    if (!frame() || frame()->loader()->haveToldBridgeAboutLoad(resource->url()))
         return;
     
     ResourceRequest request(resource->url());
@@ -226,9 +230,9 @@
     
     if (resource->sendResourceLoadCallbacks()) {
         // FIXME: If the WebKit client changes or cancels the request, WebCore does not respect this and continues the load.
-        m_frame->loader()->loadedResourceFromMemoryCache(request, response, data ? data->size() : 0);
+        frame()->loader()->loadedResourceFromMemoryCache(request, response, data ? data->size() : 0);
     }
-    m_frame->loader()->didTellBridgeAboutLoad(resource->url());
+    frame()->loader()->didTellBridgeAboutLoad(resource->url());
 }
 
 void DocLoader::incrementRequestCount()
--- src/3rdparty/webkit/WebCore/loader/DocLoader.h
+++ src/3rdparty/webkit/WebCore/loader/DocLoader.h
@@ -49,7 +49,7 @@
 friend class HTMLImageLoader;
 
 public:
-    DocLoader(Frame*, Document*);
+    DocLoader(Document*);
     ~DocLoader();
 
     CachedImage* requestImage(const String& url);
@@ -73,7 +73,7 @@
     CachePolicy cachePolicy() const { return m_cachePolicy; }
     void setCachePolicy(CachePolicy);
     
-    Frame* frame() const { return m_frame; }
+    Frame* frame() const; // Can be NULL
     Document* doc() const { return m_doc; }
 
     void removeCachedResource(CachedResource*) const;
@@ -100,7 +100,6 @@
     HashSet<String> m_reloadedURLs;
     mutable HashMap<String, CachedResource*> m_docResources;
     CachePolicy m_cachePolicy;
-    Frame* m_frame;
     Document *m_doc;
     
     int m_requestCount;
openSUSE Build Service is sponsored by