aboutsummaryrefslogtreecommitdiff
path: root/www/seamonkey/files/patch-bug1233275
blob: 949558662729668d3fd0d2e80eb090c51bd69e54 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# Copy environment for IPC using NSPR to avoid race

diff --git a/ipc/chromium/src/base/process_util_bsd.cc b/ipc/chromium/src/base/process_util_bsd.cc
--- mozilla/ipc/chromium/src/base/process_util_bsd.cc
+++ mozilla/ipc/chromium/src/base/process_util_bsd.cc
@@ -13,6 +13,7 @@
 
 #include <string>
 
+#include "nspr.h"
 #include "base/eintr_wrapper.h"
 #include "base/file_util.h"
 #include "base/logging.h"
@@ -48,7 +49,6 @@
 
 #ifdef HAVE_POSIX_SPAWN
 #include <spawn.h>
-extern "C" char **environ __dso_public;
 #endif
 
 namespace {
@@ -114,6 +114,7 @@ bool LaunchApp(const std::vector<std::st
   // Existing variables are overwritten by env_vars_to_set.
   int pos = 0;
   environment_map combined_env_vars = env_vars_to_set;
+  char **environ = PR_DuplicateEnvironment();
   while(environ[pos] != NULL) {
     std::string varString = environ[pos];
     std::string varName = varString.substr(0, varString.find_first_of('='));
@@ -121,8 +122,9 @@ bool LaunchApp(const std::vector<std::st
     if (combined_env_vars.find(varName) == combined_env_vars.end()) {
       combined_env_vars[varName] = varValue;
     }
-    pos++;
+    PR_Free(environ[pos++]);
   }
+  PR_Free(environ);
   int varsLen = combined_env_vars.size() + 1;
 
   char** vars = new char*[varsLen];