@@ -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) {
698701 goto 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,
13581364 if (!can_set_arrow || (mode == FATAL_ERROR && !err_obj->IsNativeError ())) {
13591365 if (env->printed_error ())
13601366 return ;
1367+ Mutex::ScopedLock lock (process_mutex);
13611368 env->set_printed_error (true );
13621369
13631370 uv_tty_reset_mode ();
@@ -2624,7 +2631,6 @@ static void ProcessTitleSetter(Local<Name> property,
26242631 Local<Value> value,
26252632 const PropertyCallbackInfo<void >& info) {
26262633 node::Utf8Value title (info.GetIsolate (), value);
2627- // TODO(piscisaureus): protect with a lock
26282634 uv_set_process_title (*title);
26292635}
26302636
@@ -2635,6 +2641,7 @@ static void EnvGetter(Local<Name> property,
26352641 if (property->IsSymbol ()) {
26362642 return info.GetReturnValue ().SetUndefined ();
26372643 }
2644+ Mutex::ScopedLock lock (environ_mutex);
26382645#ifdef __POSIX__
26392646 node::Utf8Value key (isolate, property);
26402647 const char * val = getenv (*key);
@@ -2675,6 +2682,8 @@ static void EnvSetter(Local<Name> property,
26752682 " DEP0104" ).IsNothing ())
26762683 return ;
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,
26972706 const PropertyCallbackInfo<Integer>& info) {
2707+ Mutex::ScopedLock lock (environ_mutex);
26982708 int32_t rc = -1 ; // Not found unless proven otherwise.
26992709 if (property->IsString ()) {
27002710#ifdef __POSIX__
@@ -2724,6 +2734,7 @@ static void EnvQuery(Local<Name> property,
27242734
27252735static void EnvDeleter (Local<Name> property,
27262736 const PropertyCallbackInfo<Boolean>& info) {
2737+ Mutex::ScopedLock lock (environ_mutex);
27272738 if (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];
27502761 size_t idx = 0 ;
27512762
2763+ Mutex::ScopedLock lock (environ_mutex);
27522764#ifdef __POSIX__
27532765 int size = 0 ;
27542766 while (environ[size])
@@ -2864,6 +2876,7 @@ static Local<Object> GetFeatures(Environment* env) {
28642876
28652877static void DebugPortGetter (Local<Name> property,
28662878 const PropertyCallbackInfo<Value>& info) {
2879+ Mutex::ScopedLock lock (process_mutex);
28672880 int port = debug_options.port ();
28682881#if HAVE_INSPECTOR
28692882 if (port == 0 ) {
@@ -2879,6 +2892,7 @@ static void DebugPortGetter(Local<Name> property,
28792892static void DebugPortSetter (Local<Name> property,
28802893 Local<Value> value,
28812894 const PropertyCallbackInfo<void >& info) {
2895+ Mutex::ScopedLock lock (process_mutex);
28822896 debug_options.set_port (value->Int32Value ());
28832897}
28842898
0 commit comments