@@ -154,7 +154,7 @@ static node_module* modlist_addon;
154
154
155
155
#if defined(NODE_HAVE_I18N_SUPPORT)
156
156
// Path to ICU data (for i18n / Intl)
157
- static const char * icu_data_dir = nullptr ;
157
+ static std::string icu_data_dir; // NOLINT(runtime/string)
158
158
#endif
159
159
160
160
// used by C++ modules as well
@@ -901,12 +901,21 @@ Local<Value> UVException(Isolate* isolate,
901
901
902
902
903
903
// Look up environment variable unless running as setuid root.
904
- inline const char * secure_getenv (const char * key) {
904
+ inline bool SafeGetenv (const char * key, std::string* text ) {
905
905
#ifndef _WIN32
906
- if (getuid () != geteuid () || getgid () != getegid ())
907
- return nullptr ;
906
+ // TODO(bnoordhuis) Should perhaps also check whether getauxval(AT_SECURE)
907
+ // is non-zero on Linux.
908
+ if (getuid () != geteuid () || getgid () != getegid ()) {
909
+ text->clear ();
910
+ return false ;
911
+ }
908
912
#endif
909
- return getenv (key);
913
+ if (const char * value = getenv (key)) {
914
+ *text = value;
915
+ return true ;
916
+ }
917
+ text->clear ();
918
+ return false ;
910
919
}
911
920
912
921
@@ -3063,11 +3072,11 @@ void SetupProcessObject(Environment* env,
3063
3072
#if defined(NODE_HAVE_I18N_SUPPORT) && defined(U_ICU_VERSION)
3064
3073
// ICU-related versions are now handled on the js side, see bootstrap_node.js
3065
3074
3066
- if (icu_data_dir != nullptr ) {
3075
+ if (!icu_data_dir. empty () ) {
3067
3076
// Did the user attempt (via env var or parameter) to set an ICU path?
3068
3077
READONLY_PROPERTY (process,
3069
3078
" icu_data_dir" ,
3070
- OneByteString (env->isolate (), icu_data_dir));
3079
+ OneByteString (env->isolate (), icu_data_dir. c_str () ));
3071
3080
}
3072
3081
#endif
3073
3082
@@ -3696,7 +3705,7 @@ static void ParseArgs(int* argc,
3696
3705
#endif /* HAVE_OPENSSL */
3697
3706
#if defined(NODE_HAVE_I18N_SUPPORT)
3698
3707
} else if (strncmp (arg, " --icu-data-dir=" , 15 ) == 0 ) {
3699
- icu_data_dir = arg + 15 ;
3708
+ icu_data_dir. assign ( arg, 15 ) ;
3700
3709
#endif
3701
3710
} else if (strcmp (arg, " --expose-internals" ) == 0 ||
3702
3711
strcmp (arg, " --expose_internals" ) == 0 ) {
@@ -4183,8 +4192,10 @@ void Init(int* argc,
4183
4192
#endif
4184
4193
4185
4194
// Allow for environment set preserving symlinks.
4186
- if (auto preserve_symlinks = secure_getenv (" NODE_PRESERVE_SYMLINKS" )) {
4187
- config_preserve_symlinks = (*preserve_symlinks == ' 1' );
4195
+ {
4196
+ std::string text;
4197
+ config_preserve_symlinks =
4198
+ SafeGetenv (" NODE_PRESERVE_SYMLINKS" , &text) && text[0 ] == ' 1' ;
4188
4199
}
4189
4200
4190
4201
// Parse a few arguments which are specific to Node.
@@ -4213,12 +4224,11 @@ void Init(int* argc,
4213
4224
#endif
4214
4225
4215
4226
#if defined(NODE_HAVE_I18N_SUPPORT)
4216
- if (icu_data_dir == nullptr ) {
4217
- // if the parameter isn't given, use the env variable.
4218
- icu_data_dir = secure_getenv (" NODE_ICU_DATA" );
4219
- }
4227
+ // If the parameter isn't given, use the env variable.
4228
+ if (icu_data_dir.empty ())
4229
+ SafeGetenv (" NODE_ICU_DATA" , &icu_data_dir);
4220
4230
// Initialize ICU.
4221
- // If icu_data_dir is nullptr here, it will load the 'minimal' data.
4231
+ // If icu_data_dir is empty here, it will load the 'minimal' data.
4222
4232
if (!i18n::InitializeICUDirectory (icu_data_dir)) {
4223
4233
FatalError (nullptr , " Could not initialize ICU "
4224
4234
" (check NODE_ICU_DATA or --icu-data-dir parameters)" );
@@ -4483,8 +4493,11 @@ int Start(int argc, char** argv) {
4483
4493
Init (&argc, const_cast <const char **>(argv), &exec_argc, &exec_argv);
4484
4494
4485
4495
#if HAVE_OPENSSL
4486
- if (const char * extra = secure_getenv (" NODE_EXTRA_CA_CERTS" ))
4487
- crypto::UseExtraCaCerts (extra);
4496
+ {
4497
+ std::string extra_ca_certs;
4498
+ if (SafeGetenv (" NODE_EXTRA_CA_CERTS" , &extra_ca_certs))
4499
+ crypto::UseExtraCaCerts (extra_ca_certs);
4500
+ }
4488
4501
#ifdef NODE_FIPS_MODE
4489
4502
// In the case of FIPS builds we should make sure
4490
4503
// the random source is properly initialized first.
@@ -4493,7 +4506,7 @@ int Start(int argc, char** argv) {
4493
4506
// V8 on Windows doesn't have a good source of entropy. Seed it from
4494
4507
// OpenSSL's pool.
4495
4508
V8::SetEntropySource (crypto::EntropySource);
4496
- #endif
4509
+ #endif // HAVE_OPENSSL
4497
4510
4498
4511
v8_platform.Initialize (v8_thread_pool_size);
4499
4512
V8::Initialize ();
0 commit comments