Changeset 84302 in webkit


Ignore:
Timestamp:
Apr 19, 2011 3:35:33 PM (13 years ago)
Author:
andersca@apple.com
Message:

2011-04-19 Anders Carlsson <andersca@apple.com>

Reviewed by Dan Bernstein.

Terminate hung plug-in processes after 45 seconds
https://bugs.webkit.org/show_bug.cgi?id=58932
<rdar://problem/8083219>

  • UIProcess/Plugins/PluginProcessManager.cpp: (WebKit::PluginProcessManager::pluginSyncMessageSendTimedOut): Find the plug-in process proxy and terminate it.

(WebKit::PluginProcessManager::pluginProcessWithPath):
Add new helper function.

(WebKit::PluginProcessManager::getOrCreatePluginProcess):
Call pluginProcessWithPath.

  • UIProcess/Plugins/PluginProcessProxy.cpp: (WebKit::PluginProcessProxy::terminate): Terminate the process.
  • UIProcess/Plugins/PluginProcessProxy.h:
  • UIProcess/WebProcessProxy.cpp: (WebKit::WebProcessProxy::pluginSyncMessageSendTimedOut): Call PluginProcessManager::pluginSyncMessageSendTimedOut.
  • UIProcess/WebProcessProxy.h:
  • UIProcess/WebProcessProxy.messages.in: Add PluginSyncMessageSendTimedOut message.
  • WebProcess/Plugins/PluginProcessConnection.cpp: (WebKit::defaultSyncMessageTimeout): (WebKit::PluginProcessConnection::PluginProcessConnection): Set a sync message timeout on the plug-in process connection.

(WebKit::PluginProcessConnection::syncMessageSendTimedOut):
Send a message to the web process proxy.

Location:
trunk/Source/WebKit2
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r84297 r84302  
     12011-04-19  Anders Carlsson  <andersca@apple.com>
     2
     3        Reviewed by Dan Bernstein.
     4
     5        Terminate hung plug-in processes after 45 seconds
     6        https://bugs.webkit.org/show_bug.cgi?id=58932
     7        <rdar://problem/8083219>
     8
     9        * UIProcess/Plugins/PluginProcessManager.cpp:
     10        (WebKit::PluginProcessManager::pluginSyncMessageSendTimedOut):
     11        Find the plug-in process proxy and terminate it.
     12
     13        (WebKit::PluginProcessManager::pluginProcessWithPath):
     14        Add new helper function.
     15
     16        (WebKit::PluginProcessManager::getOrCreatePluginProcess):
     17        Call pluginProcessWithPath.
     18
     19        * UIProcess/Plugins/PluginProcessProxy.cpp:
     20        (WebKit::PluginProcessProxy::terminate):
     21        Terminate the process.
     22
     23        * UIProcess/Plugins/PluginProcessProxy.h:
     24        * UIProcess/WebProcessProxy.cpp:
     25        (WebKit::WebProcessProxy::pluginSyncMessageSendTimedOut):
     26        Call PluginProcessManager::pluginSyncMessageSendTimedOut.
     27
     28        * UIProcess/WebProcessProxy.h:
     29        * UIProcess/WebProcessProxy.messages.in:
     30        Add PluginSyncMessageSendTimedOut message.
     31
     32        * WebProcess/Plugins/PluginProcessConnection.cpp:
     33        (WebKit::defaultSyncMessageTimeout):
     34        (WebKit::PluginProcessConnection::PluginProcessConnection):
     35        Set a sync message timeout on the plug-in process connection.
     36
     37        (WebKit::PluginProcessConnection::syncMessageSendTimedOut):
     38        Send a message to the web process proxy.
     39
    1402011-04-19  Alexey Proskuryakov  <ap@apple.com>
    241
  • trunk/Source/WebKit2/UIProcess/Plugins/PluginProcessManager.cpp

    r84174 r84302  
    7575}
    7676
     77void PluginProcessManager::pluginSyncMessageSendTimedOut(const String& pluginPath)
     78{
     79    PluginProcessProxy* pluginProcess = pluginProcessWithPath(pluginPath);
     80    if (!pluginProcess)
     81        return;
     82
     83    pluginProcess->terminate();
     84}
     85
     86PluginProcessProxy* PluginProcessManager::pluginProcessWithPath(const String& pluginPath)
     87{
     88    for (size_t i = 0; i < m_pluginProcesses.size(); ++i) {
     89        if (m_pluginProcesses[i]->pluginInfo().path == pluginPath)
     90            return m_pluginProcesses[i];
     91    }
     92    return 0;
     93}
     94
    7795PluginProcessProxy* PluginProcessManager::getOrCreatePluginProcess(const PluginInfoStore::Plugin& plugin)
    7896{
    79     for (size_t i = 0; i < m_pluginProcesses.size(); ++i) {
    80         if (m_pluginProcesses[i]->pluginInfo().path == plugin.path)
    81             return m_pluginProcesses[i];
    82     }
     97    if (PluginProcessProxy* pluginProcess = pluginProcessWithPath(plugin.path))
     98        return pluginProcess;
    8399
    84100    PluginProcessProxy* pluginProcess = PluginProcessProxy::create(this, plugin).leakPtr();
  • trunk/Source/WebKit2/UIProcess/Plugins/PluginProcessManager.h

    r84174 r84302  
    5757    void clearSiteData(const PluginInfoStore::Plugin&, WebPluginSiteDataManager*, const Vector<String>& sites, uint64_t flags, uint64_t maxAgeInSeconds, uint64_t callbackID);
    5858
     59    void pluginSyncMessageSendTimedOut(const String& pluginPath);
     60
    5961private:
    6062    PluginProcessManager();
    6163
    6264    PluginProcessProxy* getOrCreatePluginProcess(const PluginInfoStore::Plugin&);
     65    PluginProcessProxy* pluginProcessWithPath(const String& pluginPath);
    6366
    6467    Vector<PluginProcessProxy*> m_pluginProcesses;
  • trunk/Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.cpp

    r84293 r84302  
    121121}
    122122
     123void PluginProcessProxy::terminate()
     124{
     125     m_processLauncher->terminateProcess();
     126}
     127
    123128void PluginProcessProxy::pluginProcessCrashedOrFailedToLaunch()
    124129{
  • trunk/Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.h

    r84293 r84302  
    7272    // Asks the plug-in process to clear the data for the given sites.
    7373    void clearSiteData(WebPluginSiteDataManager*, const Vector<String>& sites, uint64_t flags, uint64_t maxAgeInSeconds, uint64_t callbackID);
     74
     75    // Terminates the plug-in process.
     76    void terminate();
    7477
    7578private:
  • trunk/Source/WebKit2/UIProcess/WebProcessProxy.cpp

    r84293 r84302  
    221221    PluginProcessManager::shared().getPluginProcessConnection(context()->pluginInfoStore(), pluginPath, reply);
    222222}
     223
     224void WebProcessProxy::pluginSyncMessageSendTimedOut(const String& pluginPath)
     225{
     226    PluginProcessManager::shared().pluginSyncMessageSendTimedOut(pluginPath);
     227}
    223228#endif
    224229
  • trunk/Source/WebKit2/UIProcess/WebProcessProxy.h

    r84293 r84302  
    123123#if ENABLE(PLUGIN_PROCESS)
    124124    void getPluginProcessConnection(const String& pluginPath, PassRefPtr<Messages::WebProcessProxy::GetPluginProcessConnection::DelayedReply>);
     125    void pluginSyncMessageSendTimedOut(const String& pluginPath);
    125126#endif
    126127
  • trunk/Source/WebKit2/UIProcess/WebProcessProxy.messages.in

    r84174 r84302  
    3030#if ENABLE(PLUGIN_PROCESS)
    3131    GetPluginProcessConnection(WTF::String pluginPath) -> (CoreIPC::MachPort connectionHandle) Delayed
     32    PluginSyncMessageSendTimedOut(WTF::String pluginPath)
    3233#endif
    3334}
  • trunk/Source/WebKit2/WebProcess/Plugins/PluginProcessConnection.cpp

    r84293 r84302  
    3333#include "PluginProxy.h"
    3434#include "WebProcess.h"
     35#include "WebProcessProxyMessages.h"
     36#include <WebCore/FileSystem.h>
     37
     38using namespace WebCore;
    3539
    3640namespace WebKit {
     41
     42// The timeout, in seconds, when sending sync messages to the plug-in.
     43static const double syncMessageTimeout = 45;
     44
     45static double defaultSyncMessageTimeout(const String& pluginPath)
     46{
     47    // We don't want a message timeout for the AppleConnect plug-in.
     48    // FIXME: We should key this off something other than the path.
     49    if (pathGetFileName(pluginPath) == "AppleConnect.plugin")
     50        return CoreIPC::Connection::NoTimeout;
     51
     52    return syncMessageTimeout;
     53}
    3754
    3855PluginProcessConnection::PluginProcessConnection(PluginProcessConnectionManager* pluginProcessConnectionManager, const String& pluginPath, CoreIPC::Connection::Identifier connectionIdentifier)
     
    4158{
    4259    m_connection = CoreIPC::Connection::createClientConnection(connectionIdentifier, this, WebProcess::shared().runLoop());
     60
     61    m_connection->setDefaultSyncMessageTimeout(defaultSyncMessageTimeout(m_pluginPath));
    4362    m_npRemoteObjectMap = NPRemoteObjectMap::create(m_connection.get());
    4463
     
    119138void PluginProcessConnection::syncMessageSendTimedOut(CoreIPC::Connection*)
    120139{
     140    WebProcess::shared().connection()->send(Messages::WebProcessProxy::PluginSyncMessageSendTimedOut(m_pluginPath), 0);
    121141}
    122142
Note: See TracChangeset for help on using the changeset viewer.