@@ -171,6 +171,9 @@ using v8::Value;
171171
172172using AsyncHooks = Environment::AsyncHooks;
173173
174+ static Mutex process_mutex;
175+ static Mutex environ_mutex;
176+
174177static bool print_eval = false ;
175178static bool force_repl = false ;
176179static bool syntax_check_only = false ;
@@ -698,9 +701,12 @@ bool SafeGetenv(const char* key, std::string* text) {
698701goto fail;
699702#endif
700703
701- if (const char * value = getenv (key)) {
702- *text = value;
703- return true ;
704+ {
705+ Mutex::ScopedLock lock (environ_mutex);
706+ if (const char * value = getenv (key)) {
707+ *text = value;
708+ return true ;
709+ }
704710 }
705711
706712fail:
@@ -1358,6 +1364,7 @@ void AppendExceptionLine(Environment* env,
13581364if (!can_set_arrow || (mode == FATAL_ERROR && !err_obj->IsNativeError ())) {
13591365if (env->printed_error ())
13601366return ;
1367+ Mutex::ScopedLock lock (process_mutex);
13611368 env->set_printed_error (true );
13621369
13631370uv_tty_reset_mode ();
@@ -2624,7 +2631,6 @@ static void ProcessTitleSetter(Local<Name> property,
26242631 Local<Value> value,
26252632const PropertyCallbackInfo<void >& info) {
26262633 node::Utf8Value title (info.GetIsolate (), value);
2627- // TODO(piscisaureus): protect with a lock
26282634uv_set_process_title (*title);
26292635}
26302636
@@ -2635,6 +2641,7 @@ static void EnvGetter(Local<Name> property,
26352641if (property->IsSymbol ()) {
26362642return info.GetReturnValue ().SetUndefined ();
26372643 }
2644+ Mutex::ScopedLock lock (environ_mutex);
26382645#ifdef __POSIX__
26392646 node::Utf8Value key (isolate, property);
26402647const char * val = getenv (*key);
@@ -2675,6 +2682,8 @@ static void EnvSetter(Local<Name> property,
26752682" DEP0104" ).IsNothing ())
26762683return ;
26772684 }
2685+
2686+ Mutex::ScopedLock lock (environ_mutex);
26782687#ifdef __POSIX__
26792688 node::Utf8Value key (info.GetIsolate (), property);
26802689 node::Utf8Value val (info.GetIsolate (), value);
@@ -2695,6 +2704,7 @@ static void EnvSetter(Local<Name> property,
26952704
26962705static void EnvQuery (Local<Name> property,
26972706const PropertyCallbackInfo<Integer>& info) {
2707+ Mutex::ScopedLock lock (environ_mutex);
26982708int32_t rc = -1 ; // Not found unless proven otherwise.
26992709if (property->IsString ()) {
27002710#ifdef __POSIX__
@@ -2724,6 +2734,7 @@ static void EnvQuery(Local<Name> property,
27242734
27252735static void EnvDeleter (Local<Name> property,
27262736const PropertyCallbackInfo<Boolean>& info) {
2737+ Mutex::ScopedLock lock (environ_mutex);
27272738if (property->IsString ()) {
27282739#ifdef __POSIX__
27292740 node::Utf8Value key (info.GetIsolate (), property);
@@ -2749,6 +2760,7 @@ static void EnvEnumerator(const PropertyCallbackInfo<Array>& info) {
27492760 Local<Value> argv[NODE_PUSH_VAL_TO_ARRAY_MAX ];
27502761size_t idx = 0 ;
27512762
2763+ Mutex::ScopedLock lock (environ_mutex);
27522764#ifdef __POSIX__
27532765int size = 0 ;
27542766while (environ[size])
@@ -2864,6 +2876,7 @@ static Local<Object> GetFeatures(Environment* env) {
28642876
28652877static void DebugPortGetter (Local<Name> property,
28662878const PropertyCallbackInfo<Value>& info) {
2879+ Mutex::ScopedLock lock (process_mutex);
28672880int port = debug_options.port ();
28682881#if HAVE_INSPECTOR
28692882if (port == 0 ) {
@@ -2879,6 +2892,7 @@ static void DebugPortGetter(Local<Name> property,
28792892static void DebugPortSetter (Local<Name> property,
28802893 Local<Value> value,
28812894const PropertyCallbackInfo<void >& info) {
2895+ Mutex::ScopedLock lock (process_mutex);
28822896 debug_options.set_port (value->Int32Value ());
28832897}
28842898
0 commit comments