@@ -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
@@ -3061,11 +3070,11 @@ void SetupProcessObject(Environment* env,
30613070#if defined(NODE_HAVE_I18N_SUPPORT) && defined(U_ICU_VERSION)
30623071 // ICU-related versions are now handled on the js side, see bootstrap_node.js
30633072
3064- if (icu_data_dir != nullptr ) {
3073+ if (!icu_data_dir. empty () ) {
30653074 // Did the user attempt (via env var or parameter) to set an ICU path?
30663075 READONLY_PROPERTY (process,
30673076 " icu_data_dir" ,
3068- OneByteString (env->isolate (), icu_data_dir));
3077+ OneByteString (env->isolate (), icu_data_dir. c_str () ));
30693078 }
30703079#endif
30713080
@@ -3694,7 +3703,7 @@ static void ParseArgs(int* argc,
36943703#endif /* HAVE_OPENSSL */
36953704#if defined(NODE_HAVE_I18N_SUPPORT)
36963705 } else if (strncmp (arg, " --icu-data-dir=" , 15 ) == 0 ) {
3697- icu_data_dir = arg + 15 ;
3706+ icu_data_dir. assign ( arg, 15 ) ;
36983707#endif
36993708 } else if (strcmp (arg, " --expose-internals" ) == 0 ||
37003709 strcmp (arg, " --expose_internals" ) == 0 ) {
@@ -4181,8 +4190,10 @@ void Init(int* argc,
41814190#endif
41824191
41834192 // Allow for environment set preserving symlinks.
4184- if (auto preserve_symlinks = secure_getenv (" NODE_PRESERVE_SYMLINKS" )) {
4185- config_preserve_symlinks = (*preserve_symlinks == ' 1' );
4193+ {
4194+ std::string text;
4195+ config_preserve_symlinks =
4196+ SafeGetenv (" NODE_PRESERVE_SYMLINKS" , &text) && text[0 ] == ' 1' ;
41864197 }
41874198
41884199 // Parse a few arguments which are specific to Node.
@@ -4211,12 +4222,11 @@ void Init(int* argc,
42114222#endif
42124223
42134224#if defined(NODE_HAVE_I18N_SUPPORT)
4214- if (icu_data_dir == nullptr ) {
4215- // if the parameter isn't given, use the env variable.
4216- icu_data_dir = secure_getenv (" NODE_ICU_DATA" );
4217- }
4225+ // If the parameter isn't given, use the env variable.
4226+ if (icu_data_dir.empty ())
4227+ SafeGetenv (" NODE_ICU_DATA" , &icu_data_dir);
42184228 // Initialize ICU.
4219- // If icu_data_dir is nullptr here, it will load the 'minimal' data.
4229+ // If icu_data_dir is empty here, it will load the 'minimal' data.
42204230 if (!i18n::InitializeICUDirectory (icu_data_dir)) {
42214231 FatalError (nullptr , " Could not initialize ICU "
42224232 " (check NODE_ICU_DATA or --icu-data-dir parameters)" );
@@ -4481,8 +4491,11 @@ int Start(int argc, char** argv) {
44814491 Init (&argc, const_cast <const char **>(argv), &exec_argc, &exec_argv);
44824492
44834493#if HAVE_OPENSSL
4484- if (const char * extra = secure_getenv (" NODE_EXTRA_CA_CERTS" ))
4485- crypto::UseExtraCaCerts (extra);
4494+ {
4495+ std::string extra_ca_certs;
4496+ if (SafeGetenv (" NODE_EXTRA_CA_CERTS" , &extra_ca_certs))
4497+ crypto::UseExtraCaCerts (extra_ca_certs);
4498+ }
44864499#ifdef NODE_FIPS_MODE
44874500 // In the case of FIPS builds we should make sure
44884501 // the random source is properly initialized first.
@@ -4491,7 +4504,7 @@ int Start(int argc, char** argv) {
44914504 // V8 on Windows doesn't have a good source of entropy. Seed it from
44924505 // OpenSSL's pool.
44934506 V8::SetEntropySource (crypto::EntropySource);
4494- #endif
4507+ #endif // HAVE_OPENSSL
44954508
44964509 v8_platform.Initialize (v8_thread_pool_size);
44974510 V8::Initialize ();
0 commit comments