@@ -172,6 +172,9 @@ using v8::Value;
172
172
173
173
using AsyncHooks = Environment::AsyncHooks;
174
174
175
+ static Mutex process_mutex;
176
+ static Mutex environ_mutex;
177
+
175
178
static bool print_eval = false ;
176
179
static bool force_repl = false ;
177
180
static bool syntax_check_only = false ;
@@ -699,9 +702,12 @@ bool SafeGetenv(const char* key, std::string* text) {
699
702
goto fail;
700
703
#endif
701
704
702
- if (const char * value = getenv (key)) {
703
- *text = value;
704
- return true ;
705
+ {
706
+ Mutex::ScopedLock lock (environ_mutex);
707
+ if (const char * value = getenv (key)) {
708
+ *text = value;
709
+ return true ;
710
+ }
705
711
}
706
712
707
713
fail:
@@ -1359,6 +1365,7 @@ void AppendExceptionLine(Environment* env,
1359
1365
if (!can_set_arrow || (mode == FATAL_ERROR && !err_obj->IsNativeError ())) {
1360
1366
if (env->printed_error ())
1361
1367
return ;
1368
+ Mutex::ScopedLock lock (process_mutex);
1362
1369
env->set_printed_error (true );
1363
1370
1364
1371
uv_tty_reset_mode ();
@@ -2610,7 +2617,6 @@ static void ProcessTitleSetter(Local<Name> property,
2610
2617
Local<Value> value,
2611
2618
const PropertyCallbackInfo<void >& info) {
2612
2619
node::Utf8Value title (info.GetIsolate (), value);
2613
- // TODO(piscisaureus): protect with a lock
2614
2620
uv_set_process_title (*title);
2615
2621
}
2616
2622
@@ -2621,6 +2627,7 @@ static void EnvGetter(Local<Name> property,
2621
2627
if (property->IsSymbol ()) {
2622
2628
return info.GetReturnValue ().SetUndefined ();
2623
2629
}
2630
+ Mutex::ScopedLock lock (environ_mutex);
2624
2631
#ifdef __POSIX__
2625
2632
node::Utf8Value key (isolate, property);
2626
2633
const char * val = getenv (*key);
@@ -2661,6 +2668,8 @@ static void EnvSetter(Local<Name> property,
2661
2668
" DEP0104" ).IsNothing ())
2662
2669
return ;
2663
2670
}
2671
+
2672
+ Mutex::ScopedLock lock (environ_mutex);
2664
2673
#ifdef __POSIX__
2665
2674
node::Utf8Value key (info.GetIsolate (), property);
2666
2675
node::Utf8Value val (info.GetIsolate (), value);
@@ -2681,6 +2690,7 @@ static void EnvSetter(Local<Name> property,
2681
2690
2682
2691
static void EnvQuery (Local<Name> property,
2683
2692
const PropertyCallbackInfo<Integer>& info) {
2693
+ Mutex::ScopedLock lock (environ_mutex);
2684
2694
int32_t rc = -1 ; // Not found unless proven otherwise.
2685
2695
if (property->IsString ()) {
2686
2696
#ifdef __POSIX__
@@ -2710,6 +2720,7 @@ static void EnvQuery(Local<Name> property,
2710
2720
2711
2721
static void EnvDeleter (Local<Name> property,
2712
2722
const PropertyCallbackInfo<Boolean >& info) {
2723
+ Mutex::ScopedLock lock (environ_mutex);
2713
2724
if (property->IsString ()) {
2714
2725
#ifdef __POSIX__
2715
2726
node::Utf8Value key (info.GetIsolate (), property);
@@ -2735,6 +2746,7 @@ static void EnvEnumerator(const PropertyCallbackInfo<Array>& info) {
2735
2746
Local<Value> argv[NODE_PUSH_VAL_TO_ARRAY_MAX];
2736
2747
size_t idx = 0 ;
2737
2748
2749
+ Mutex::ScopedLock lock (environ_mutex);
2738
2750
#ifdef __POSIX__
2739
2751
int size = 0 ;
2740
2752
while (environ[size])
@@ -2850,6 +2862,7 @@ static Local<Object> GetFeatures(Environment* env) {
2850
2862
2851
2863
static void DebugPortGetter (Local<Name> property,
2852
2864
const PropertyCallbackInfo<Value>& info) {
2865
+ Mutex::ScopedLock lock (process_mutex);
2853
2866
int port = debug_options.port ();
2854
2867
#if HAVE_INSPECTOR
2855
2868
if (port == 0 ) {
@@ -2865,6 +2878,7 @@ static void DebugPortGetter(Local<Name> property,
2865
2878
static void DebugPortSetter (Local<Name> property,
2866
2879
Local<Value> value,
2867
2880
const PropertyCallbackInfo<void >& info) {
2881
+ Mutex::ScopedLock lock (process_mutex);
2868
2882
debug_options.set_port (value->Int32Value ());
2869
2883
}
2870
2884
0 commit comments