From 83d1ca7de95b884bcf188ed399056358e1d9d063 Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Mon, 15 Apr 2019 08:41:23 +0800 Subject: [PATCH] src: disallow calling env-dependent methods during bootstrap These cannot be preserved correctly in v8 snapshot. Currently none of these are called during bootstrap, this adds assertions to make sure future contributors do not accidentally call these in the wrong time. Consider this, on the machine that builds releases: ``` process.cwd(); # "/home/iojs/build/workspace/" ``` If `process.cwd()` is cached as in https://github.com/nodejs/node/pull/27224, when the user downloads this binary to their machine: ``` $ cd ~/ $ pwd # "/User/foo" $ node -p "process.cwd()" # "/home/iojs/build/workspace/" ``` This patch only adds checks in methods that get states from the environment - it's not likely that the setters would be called during bootstrap, and if they are called, we'll just ignore them and whatever tests that test the change would fail when snapshot is enabled. However the getters may be called in order to persist information into strings and that would be harder to catch (the test is only likely to test the format of these strings which won't be useful). PR-URL: https://github.com/nodejs/node/pull/27234 Refs: https://github.com/nodejs/node/pull/27224 Reviewed-By: Anna Henningsen Reviewed-By: James M Snell Reviewed-By: Ruben Bridgewater Reviewed-By: Ben Noordhuis --- src/node_credentials.cc | 9 +++++++++ src/node_process_methods.cc | 6 ++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/node_credentials.cc b/src/node_credentials.cc index 765d1caba94666..c8685ac488717f 100644 --- a/src/node_credentials.cc +++ b/src/node_credentials.cc @@ -172,21 +172,29 @@ static gid_t gid_by_name(Isolate* isolate, Local value) { } static void GetUid(const FunctionCallbackInfo& args) { + Environment* env = Environment::GetCurrent(args); + CHECK(env->has_run_bootstrapping_code()); // uid_t is an uint32_t on all supported platforms. args.GetReturnValue().Set(static_cast(getuid())); } static void GetGid(const FunctionCallbackInfo& args) { + Environment* env = Environment::GetCurrent(args); + CHECK(env->has_run_bootstrapping_code()); // gid_t is an uint32_t on all supported platforms. args.GetReturnValue().Set(static_cast(getgid())); } static void GetEUid(const FunctionCallbackInfo& args) { + Environment* env = Environment::GetCurrent(args); + CHECK(env->has_run_bootstrapping_code()); // uid_t is an uint32_t on all supported platforms. args.GetReturnValue().Set(static_cast(geteuid())); } static void GetEGid(const FunctionCallbackInfo& args) { + Environment* env = Environment::GetCurrent(args); + CHECK(env->has_run_bootstrapping_code()); // gid_t is an uint32_t on all supported platforms. args.GetReturnValue().Set(static_cast(getegid())); } @@ -269,6 +277,7 @@ static void SetEUid(const FunctionCallbackInfo& args) { static void GetGroups(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); + CHECK(env->has_run_bootstrapping_code()); int ngroups = getgroups(0, nullptr); if (ngroups == -1) return env->ThrowErrnoException(errno, "getgroups"); diff --git a/src/node_process_methods.cc b/src/node_process_methods.cc index e53a5a7015c8e3..1f215eddc4f194 100644 --- a/src/node_process_methods.cc +++ b/src/node_process_methods.cc @@ -118,6 +118,7 @@ static void CPUUsage(const FunctionCallbackInfo& args) { static void Cwd(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); + CHECK(env->has_run_bootstrapping_code()); char buf[CHDIR_BUFSIZE]; size_t cwd_len = sizeof(buf); int err = uv_cwd(buf, &cwd_len); @@ -226,12 +227,13 @@ static void StopProfilerIdleNotifier(const FunctionCallbackInfo& args) { } static void Umask(const FunctionCallbackInfo& args) { - uint32_t old; - + Environment* env = Environment::GetCurrent(args); + CHECK(env->has_run_bootstrapping_code()); CHECK_EQ(args.Length(), 1); CHECK(args[0]->IsUndefined() || args[0]->IsUint32()); Mutex::ScopedLock scoped_lock(per_process::umask_mutex); + uint32_t old; if (args[0]->IsUndefined()) { old = umask(0); umask(static_cast(old));