@@ -154,7 +154,7 @@ static node_module* modlist_addon;
154154
155155#if defined(NODE_HAVE_I18N_SUPPORT)
156156// 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)
158158#endif
159159
160160// used by C++ modules as well
@@ -901,12 +901,21 @@ Local<Value> UVException(Isolate* isolate,
901901
902902
903903// 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 ) {
905905#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+ }
908912#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 ;
910919}
911920
912921
@@ -3063,11 +3072,11 @@ void SetupProcessObject(Environment* env,
30633072#if defined(NODE_HAVE_I18N_SUPPORT) && defined(U_ICU_VERSION)
30643073 // ICU-related versions are now handled on the js side, see bootstrap_node.js
30653074
3066- if (icu_data_dir != nullptr ) {
3075+ if (!icu_data_dir. empty () ) {
30673076 // Did the user attempt (via env var or parameter) to set an ICU path?
30683077 READONLY_PROPERTY (process,
30693078 " icu_data_dir" ,
3070- OneByteString (env->isolate (), icu_data_dir));
3079+ OneByteString (env->isolate (), icu_data_dir. c_str () ));
30713080 }
30723081#endif
30733082
@@ -3696,7 +3705,7 @@ static void ParseArgs(int* argc,
36963705#endif /* HAVE_OPENSSL */
36973706#if defined(NODE_HAVE_I18N_SUPPORT)
36983707 } else if (strncmp (arg, " --icu-data-dir=" , 15 ) == 0 ) {
3699- icu_data_dir = arg + 15 ;
3708+ icu_data_dir. assign ( arg, 15 ) ;
37003709#endif
37013710 } else if (strcmp (arg, " --expose-internals" ) == 0 ||
37023711 strcmp (arg, " --expose_internals" ) == 0 ) {
@@ -4183,8 +4192,10 @@ void Init(int* argc,
41834192#endif
41844193
41854194 // 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' ;
41884199 }
41894200
41904201 // Parse a few arguments which are specific to Node.
@@ -4213,12 +4224,11 @@ void Init(int* argc,
42134224#endif
42144225
42154226#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);
42204230 // 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.
42224232 if (!i18n::InitializeICUDirectory (icu_data_dir)) {
42234233 FatalError (nullptr , " Could not initialize ICU "
42244234 " (check NODE_ICU_DATA or --icu-data-dir parameters)" );
@@ -4483,8 +4493,11 @@ int Start(int argc, char** argv) {
44834493 Init (&argc, const_cast <const char **>(argv), &exec_argc, &exec_argv);
44844494
44854495#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+ }
44884501#ifdef NODE_FIPS_MODE
44894502 // In the case of FIPS builds we should make sure
44904503 // the random source is properly initialized first.
@@ -4493,7 +4506,7 @@ int Start(int argc, char** argv) {
44934506 // V8 on Windows doesn't have a good source of entropy. Seed it from
44944507 // OpenSSL's pool.
44954508 V8::SetEntropySource (crypto::EntropySource);
4496- #endif
4509+ #endif // HAVE_OPENSSL
44974510
44984511 v8_platform.Initialize (v8_thread_pool_size);
44994512 V8::Initialize ();
0 commit comments