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];
|