From fd4c6b3bdae2c4479b4c0f8528e7dcd2b699217a Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Fri, 8 Feb 2019 09:04:07 +0800 Subject: [PATCH] process: normalize process.execPath in CreateProcessObject() Directly normalize `process.execPath` using `uv_fs_realpath` on OpenBSD before serializing it into the process object, instead of using `require('fs')` to normalize and override the path in `bootstrap/node.js`. --- lib/internal/bootstrap/node.js | 7 ------ src/node_process_object.cc | 39 ++++++++++++++++++++++------------ 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/lib/internal/bootstrap/node.js b/lib/internal/bootstrap/node.js index b4f2d4e838cd5d..7b967f0612923d 100644 --- a/lib/internal/bootstrap/node.js +++ b/lib/internal/bootstrap/node.js @@ -212,13 +212,6 @@ if (browserGlobals) { setupDOMException(); -// On OpenBSD process.execPath will be relative unless we -// get the full path before process.execPath is used. -if (process.platform === 'openbsd') { - const { realpathSync } = NativeModule.require('fs'); - process.execPath = realpathSync.native(process.execPath); -} - Object.defineProperty(process, 'argv0', { enumerable: true, configurable: false, diff --git a/src/node_process_object.cc b/src/node_process_object.cc index 159d9fdc40795f..2f47b21f699d4e 100644 --- a/src/node_process_object.cc +++ b/src/node_process_object.cc @@ -273,21 +273,34 @@ MaybeLocal CreateProcessObject( // process.execPath { - size_t exec_path_len = 2 * PATH_MAX; - std::vector exec_path(exec_path_len); - Local exec_path_value; - if (uv_exepath(exec_path.data(), &exec_path_len) == 0) { - exec_path_value = String::NewFromUtf8(env->isolate(), - exec_path.data(), - NewStringType::kInternalized, - exec_path_len).ToLocalChecked(); + char exec_path_buf[2 * PATH_MAX]; + size_t exec_path_len = sizeof(exec_path_buf); + std::string exec_path; + if (uv_exepath(exec_path_buf, &exec_path_len) == 0) { + exec_path = std::string(exec_path_buf, exec_path_len); } else { - exec_path_value = String::NewFromUtf8(env->isolate(), args[0].c_str(), - NewStringType::kInternalized).ToLocalChecked(); + exec_path = args[0]; } - process->Set(env->context(), - FIXED_ONE_BYTE_STRING(env->isolate(), "execPath"), - exec_path_value).FromJust(); + // On OpenBSD process.execPath will be relative unless we + // get the full path before process.execPath is used. +#if defined(__OpenBSD__) + uv_fs_t req; + req.ptr = nullptr; + if (0 == + uv_fs_realpath(env->event_loop(), &req, exec_path.c_str(), nullptr)) { + CHECK_NOT_NULL(req.ptr); + exec_path = std::string(static_cast(req.ptr)); + } +#endif + process + ->Set(env->context(), + FIXED_ONE_BYTE_STRING(env->isolate(), "execPath"), + String::NewFromUtf8(env->isolate(), + exec_path.c_str(), + NewStringType::kInternalized, + exec_path.size()) + .ToLocalChecked()) + .FromJust(); } // process.debugPort