diff options
author | evan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-27 01:43:51 +0000 |
---|---|---|
committer | evan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-27 01:43:51 +0000 |
commit | 3dfc7a41b5e87e3fb1b99836e26a8a62aa3efcfe (patch) | |
tree | a075d88642cf2ee3c0597b5569e1b5232254063d /chrome/plugin/plugin_channel.h | |
parent | 550c2e55ca73daff47dbcfffd1789c121064f093 (diff) | |
download | chromium_src-3dfc7a41b5e87e3fb1b99836e26a8a62aa3efcfe.zip chromium_src-3dfc7a41b5e87e3fb1b99836e26a8a62aa3efcfe.tar.gz chromium_src-3dfc7a41b5e87e3fb1b99836e26a8a62aa3efcfe.tar.bz2 |
mac/linux: rework plugin channel file descriptor creation
This CL fixes a bug where the same renderer could open several channels to the same plugin process, which end up having the same name. This CL makes it that there is only one channel for each (plugin, renderer) pair, just like on Windows.
The socketpair is created in the plugin process (which can ensure that only one channel per renderer gets created), and sends the renderer side through the browser process.
Note: this should essentially be a noop on Windows.
Review URL: http://codereview.chromium.org/149062
Patch from Antoine Labour <piman@google.com>.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@19448 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/plugin/plugin_channel.h')
-rw-r--r-- | chrome/plugin/plugin_channel.h | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/chrome/plugin/plugin_channel.h b/chrome/plugin/plugin_channel.h index 21373fb..02b619e 100644 --- a/chrome/plugin/plugin_channel.h +++ b/chrome/plugin/plugin_channel.h @@ -19,8 +19,7 @@ class PluginChannel : public PluginChannelBase { // POSIX only: If |channel_fd| > 0, use that file descriptor for the // channel socket. static PluginChannel* GetPluginChannel(int process_id, - MessageLoop* ipc_message_loop, - int channel_fd); + MessageLoop* ipc_message_loop); ~PluginChannel(); @@ -30,6 +29,18 @@ class PluginChannel : public PluginChannelBase { base::ProcessHandle renderer_handle() const { return renderer_handle_; } int GenerateRouteID(); +#if defined(OS_POSIX) + // When first created, the PluginChannel gets assigned the file descriptor + // for the renderer. + // After the first time we pass it through the IPC, we don't need it anymore, + // and we close it. At that time, we reset renderer_fd_ to -1. + int DisownRendererFd() { + int value = renderer_fd_; + renderer_fd_ = -1; + return value; + } +#endif + bool in_send() { return in_send_ != 0; } bool off_the_record() { return off_the_record_; } @@ -42,6 +53,9 @@ class PluginChannel : public PluginChannelBase { virtual void CleanUp(); + // Overrides PluginChannelBase::Init. + virtual bool Init(MessageLoop* ipc_message_loop, bool create_pipe_now); + private: // Called on the plugin thread PluginChannel(); @@ -59,6 +73,12 @@ class PluginChannel : public PluginChannelBase { // Handle to the renderer process who is on the other side of the channel. base::ProcessHandle renderer_handle_; +#if defined(OS_POSIX) + // FD for the renderer end of the pipe. It is stored until we send it over + // IPC after which it is cleared. It will be closed by the IPC mechanism. + int renderer_fd_; +#endif + int in_send_; // Tracks if we're in a Send call. bool log_messages_; // True if we should log sent and received messages. bool off_the_record_; // True if the renderer is in off the record mode. |