Index: chrome/plugin/plugin_main.cc |
diff --git a/chrome/plugin/plugin_main.cc b/chrome/plugin/plugin_main.cc |
index 63d295d15d0bf794005c8acc3563034f542f910e..afc83a5145e75388f6cdeaff785447b6db157641 100644 |
--- a/chrome/plugin/plugin_main.cc |
+++ b/chrome/plugin/plugin_main.cc |
@@ -25,8 +25,45 @@ |
#elif defined(OS_LINUX) |
#include "base/global_descriptors_posix.h" |
#include "ipc/ipc_descriptors.h" |
+#elif defined(OS_MACOSX) |
+#include "chrome/common/plugin_carbon_interpose_constants_mac.h" |
#endif |
+#if defined(OS_MACOSX) |
+// Removes our Carbon library interposing from the environment so that it |
+// doesn't carry into any processes that plugins might start. |
+static void TrimInterposeEnvironment() { |
+ const char* interpose_list = |
+ getenv(plugin_interpose_strings::kDYLDInsertLibrariesKey); |
+ if (!interpose_list) { |
+ NOTREACHED() << "No interposing libraries set"; |
+ return; |
+ } |
+ |
+ // The list is a :-separated list of paths. Because we append our interpose |
+ // library just before forking in plugin_process_host.cc, the only cases we |
+ // need to handle are: |
+ // 1) The whole string is "<kInterposeLibraryPath>", so just clear it, or |
+ // 2) ":<kInterposeLibraryPath>" is the end of the string, so trim and re-set. |
+ int suffix_offset = strlen(interpose_list) - |
+ strlen(plugin_interpose_strings::kInterposeLibraryPath); |
+ if (suffix_offset == 0 && |
+ strcmp(interpose_list, |
+ plugin_interpose_strings::kInterposeLibraryPath) == 0) { |
+ unsetenv(plugin_interpose_strings::kDYLDInsertLibrariesKey); |
+ } else if (suffix_offset > 0 && interpose_list[suffix_offset - 1] == ':' && |
+ strcmp(interpose_list + suffix_offset, |
+ plugin_interpose_strings::kInterposeLibraryPath) == 0) { |
+ std::string trimmed_list = |
+ std::string(interpose_list).substr(0, suffix_offset - 1); |
+ setenv(plugin_interpose_strings::kDYLDInsertLibrariesKey, |
+ trimmed_list.c_str(), 1); |
+ } else { |
+ NOTREACHED() << "Missing Carbon interposing library"; |
+ } |
+} |
+#endif // OS_MACOSX |
+ |
// main() routine for running as the plugin process. |
int PluginMain(const MainFunctionParams& parameters) { |
// The main thread of the plugin services UI. |
@@ -37,6 +74,10 @@ int PluginMain(const MainFunctionParams& parameters) { |
// Initialize the SystemMonitor |
base::SystemMonitor::Start(); |
+#if defined(OS_MACOSX) |
+ TrimInterposeEnvironment(); |
+#endif |
+ |
const CommandLine& parsed_command_line = parameters.command_line_; |
#if defined(OS_WIN) |