@@ -15,11 +15,14 @@ using v8::Array;
1515using v8::Context;
1616using v8::Function;
1717using v8::FunctionCallbackInfo;
18+ using v8::HandleScope;
1819using v8::Isolate;
1920using v8::Local;
2021using v8::MaybeLocal;
22+ using v8::NewStringType;
2123using v8::Object;
2224using v8::String;
25+ using v8::TryCatch;
2326using v8::Uint32;
2427using v8::Value;
2528
@@ -30,13 +33,27 @@ bool linux_at_secure = false;
3033namespace credentials {
3134
3235// Look up environment variable unless running as setuid root.
33- bool SafeGetenv (const char * key, std::string* text) {
36+ bool SafeGetenv (const char * key, std::string* text, Environment* env ) {
3437#if !defined(__CloudABI__) && !defined(_WIN32)
3538 if (per_process::linux_at_secure || getuid () != geteuid () ||
3639 getgid () != getegid ())
3740 goto fail;
3841#endif
3942
43+ if (env != nullptr ) {
44+ HandleScope handle_scope (env->isolate ());
45+ TryCatch ignore_errors (env->isolate ());
46+ MaybeLocal<String> value = env->envvars ()->Get (
47+ env->isolate (),
48+ String::NewFromUtf8 (env->isolate (), key, NewStringType::kNormal )
49+ .ToLocalChecked ());
50+ if (value.IsEmpty ()) goto fail;
51+ String::Utf8Value utf8_value (env->isolate (), value.ToLocalChecked ());
52+ if (*utf8_value == nullptr ) goto fail;
53+ *text = std::string (*utf8_value, utf8_value.length ());
54+ return true ;
55+ }
56+
4057 {
4158 Mutex::ScopedLock lock (per_process::env_var_mutex);
4259 if (const char * value = getenv (key)) {
@@ -52,10 +69,11 @@ bool SafeGetenv(const char* key, std::string* text) {
5269
5370static void SafeGetenv (const FunctionCallbackInfo<Value>& args) {
5471 CHECK (args[0 ]->IsString ());
55- Isolate* isolate = args.GetIsolate ();
72+ Environment* env = Environment::GetCurrent (args);
73+ Isolate* isolate = env->isolate ();
5674 Utf8Value strenvtag (isolate, args[0 ]);
5775 std::string text;
58- if (!SafeGetenv (*strenvtag, &text)) return ;
76+ if (!SafeGetenv (*strenvtag, &text, env )) return ;
5977 Local<Value> result =
6078 ToV8Value (isolate->GetCurrentContext (), text).ToLocalChecked ();
6179 args.GetReturnValue ().Set (result);
0 commit comments