Changeset 76163 in webkit


Ignore:
Timestamp:
Jan 19, 2011 2:26:45 PM (13 years ago)
Author:
jberlin@webkit.org
Message:

Crash in WebDatabaseManagerProxy::getDatabaseOrigins when called after the WebProcess has
died at least once
https://bugs.webkit.org/show_bug.cgi?id=52730

Reviewed by Darin Adler.

WebDatabaseManagerProxy::invalidate was setting m_webContext to 0, and invalidate gets
called in WebContext::processDidClose. However, m_webContext is only set in the
constructor, which is only called from the constructor of WebContext, so attempting to send
a message to any new WebProcess after the first one died was causing a null deref.

This patch moves setting m_webcontext into clearContext and clearContext is only called in
the WebContext destructor.

This patch also adds checks for a valid WebProcessProxy before attempting to send messages to
the WebProcessProxy so that if the WebProcess has died and has not been revived, it does not
attempt to dereference a null WebProcessProxy.

  • UIProcess/WebContext.cpp:

(WebKit::WebContext::~WebContext):
Call WebDatabaseManagerProxy::clearContext.

  • UIProcess/WebContext.h:

(WebKit::WebContext::hasValidProcess):
Make this method public so that it can be called from WebDatabaseManagerProxy.

  • UIProcess/WebDatabaseManagerProxy.cpp:

(WebKit::WebDatabaseManagerProxy::getDatabasesByOrigin):
If there isn't a valid process, invalidate the callback and return early.
(WebKit::WebDatabaseManagerProxy::getDatabaseOrigins):
Ditto.
(WebKit::WebDatabaseManagerProxy::deleteDatabaseWithNameForOrigin):
If tehre isn't a valid process return early.
(WebKit::WebDatabaseManagerProxy::deleteDatabasesForOrigin):
Ditto.
(WebKit::WebDatabaseManagerProxy::deleteAllDatabases):
Ditto.
(WebKit::WebDatabaseManagerProxy::setQuotaForOrigin):
Ditto.
(WebKit::WebDatabaseManagerProxy::invalidate):
Move setting m_webContext to 0 from here ...

  • UIProcess/WebDatabaseManagerProxy.h:

(WebKit::WebDatabaseManagerProxy::clearContext):
... to here.

Location:
trunk/Source/WebKit2
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r76157 r76163  
     12011-01-19  Jessie Berlin  <jberlin@apple.com>
     2
     3        Reviewed by Darin Adler.
     4
     5        Crash in WebDatabaseManagerProxy::getDatabaseOrigins when called after the WebProcess has
     6        died at least once
     7        https://bugs.webkit.org/show_bug.cgi?id=52730
     8
     9        WebDatabaseManagerProxy::invalidate was setting m_webContext to 0, and invalidate gets
     10        called in WebContext::processDidClose. However, m_webContext is only set in the
     11        constructor, which is only called from the constructor of WebContext, so attempting to send
     12        a message to any new WebProcess after the first one died was causing a null deref.
     13
     14        This patch moves setting m_webcontext into clearContext and clearContext is only called in
     15        the WebContext destructor.
     16
     17        This patch also adds checks for a valid WebProcessProxy before attempting to send messages to
     18        the WebProcessProxy so that if the WebProcess has died and has not been revived, it does not
     19        attempt to dereference a null WebProcessProxy.
     20
     21        * UIProcess/WebContext.cpp:
     22        (WebKit::WebContext::~WebContext):
     23        Call WebDatabaseManagerProxy::clearContext.
     24        * UIProcess/WebContext.h:
     25        (WebKit::WebContext::hasValidProcess):
     26        Make this method public so that it can be called from WebDatabaseManagerProxy.
     27
     28        * UIProcess/WebDatabaseManagerProxy.cpp:
     29        (WebKit::WebDatabaseManagerProxy::getDatabasesByOrigin):
     30        If there isn't a valid process, invalidate the callback and return early.
     31        (WebKit::WebDatabaseManagerProxy::getDatabaseOrigins):
     32        Ditto.
     33        (WebKit::WebDatabaseManagerProxy::deleteDatabaseWithNameForOrigin):
     34        If tehre isn't a valid process return early.
     35        (WebKit::WebDatabaseManagerProxy::deleteDatabasesForOrigin):
     36        Ditto.
     37        (WebKit::WebDatabaseManagerProxy::deleteAllDatabases):
     38        Ditto.
     39        (WebKit::WebDatabaseManagerProxy::setQuotaForOrigin):
     40        Ditto.
     41        (WebKit::WebDatabaseManagerProxy::invalidate):
     42        Move setting m_webContext to 0 from here ...
     43        * UIProcess/WebDatabaseManagerProxy.h:
     44        (WebKit::WebDatabaseManagerProxy::clearContext):
     45        ... to here.
     46
    1472011-01-19  Anders Carlsson  <andersca@apple.com>
    248
  • trunk/Source/WebKit2/UIProcess/WebContext.cpp

    r75452 r76163  
    115115    m_geolocationManagerProxy->clearContext();
    116116
     117    m_databaseManagerProxy->invalidate();
     118    m_databaseManagerProxy->clearContext();
     119
    117120#ifndef NDEBUG
    118121    webContextCounter.decrement();
  • trunk/Source/WebKit2/UIProcess/WebContext.h

    r75452 r76163  
    6868    ProcessModel processModel() const { return m_processModel; }
    6969    WebProcessProxy* process() const { return m_process.get(); }
     70    bool hasValidProcess() const { return m_process && m_process->isValid(); }
    7071
    7172    void processDidFinishLaunching(WebProcessProxy*);
     
    143144
    144145    void ensureWebProcess();
    145     bool hasValidProcess() const { return m_process && m_process->isValid(); }
    146146    void platformInitializeWebProcess(WebProcessCreationParameters&);
    147147
  • trunk/Source/WebKit2/UIProcess/WebDatabaseManagerProxy.cpp

    r74693 r76163  
    101101{
    102102    invalidateCallbackMap(m_arrayCallbacks);
    103 
    104     m_webContext = 0;
    105103}
    106104
     
    113111{
    114112    RefPtr<ArrayCallback> callback = prpCallback;
     113    if (!m_webContext->hasValidProcess()) {
     114        callback->invalidate();
     115        return;
     116    }
    115117    uint64_t callbackID = callback->callbackID();
    116118    m_arrayCallbacks.set(callbackID, callback.release());
     
    165167{
    166168    RefPtr<ArrayCallback> callback = prpCallback;
     169    if (!m_webContext->hasValidProcess()) {
     170        callback->invalidate();
     171        return;
     172    }
    167173    uint64_t callbackID = callback->callbackID();
    168174    m_arrayCallbacks.set(callbackID, callback.release());
     
    189195void WebDatabaseManagerProxy::deleteDatabaseWithNameForOrigin(const String& databaseIdentifier, WebSecurityOrigin* origin)
    190196{
     197    if (!m_webContext->hasValidProcess())
     198        return;
    191199    m_webContext->process()->send(Messages::WebDatabaseManager::DeleteDatabaseWithNameForOrigin(databaseIdentifier, origin->databaseIdentifier()), 0);
    192200}
     
    194202void WebDatabaseManagerProxy::deleteDatabasesForOrigin(WebSecurityOrigin* origin)
    195203{
     204    if (!m_webContext->hasValidProcess())
     205        return;
    196206    m_webContext->process()->send(Messages::WebDatabaseManager::DeleteDatabasesForOrigin(origin->databaseIdentifier()), 0);
    197207}
     
    199209void WebDatabaseManagerProxy::deleteAllDatabases()
    200210{
     211    if (!m_webContext->hasValidProcess())
     212        return;
    201213    m_webContext->process()->send(Messages::WebDatabaseManager::DeleteAllDatabases(), 0);
    202214}
     
    204216void WebDatabaseManagerProxy::setQuotaForOrigin(WebSecurityOrigin* origin, uint64_t quota)
    205217{
     218    if (!m_webContext->hasValidProcess())
     219        return;
    206220    m_webContext->process()->send(Messages::WebDatabaseManager::SetQuotaForOrigin(origin->databaseIdentifier(), quota), 0);
    207221}
  • trunk/Source/WebKit2/UIProcess/WebDatabaseManagerProxy.h

    r74693 r76163  
    5656
    5757    void invalidate();
     58    void clearContext() { m_webContext = 0; }
    5859
    5960    void initializeClient(const WKDatabaseManagerClient*);
Note: See TracChangeset for help on using the changeset viewer.