process: patch more process properties during pre-execution · nodejs/node@9dba96d (original) (raw)
`@@ -13,6 +13,7 @@ using v8::Context;
`
13
13
`using v8::DEFAULT;
`
14
14
`using v8::EscapableHandleScope;
`
15
15
`using v8::Function;
`
``
16
`+
using v8::FunctionCallbackInfo;
`
16
17
`using v8::FunctionTemplate;
`
17
18
`using v8::HandleScope;
`
18
19
`using v8::Integer;
`
`@@ -84,20 +85,6 @@ MaybeLocal CreateProcessObject(
`
84
85
`return MaybeLocal();
`
85
86
` }
`
86
87
``
87
``
`-
// process.title
`
88
``
`-
auto title_string = FIXED_ONE_BYTE_STRING(env->isolate(), "title");
`
89
``
`-
CHECK(process
`
90
``
`-
->SetAccessor(
`
91
``
`-
env->context(),
`
92
``
`-
title_string,
`
93
``
`-
ProcessTitleGetter,
`
94
``
`-
env->owns_process_state() ? ProcessTitleSetter : nullptr,
`
95
``
`-
env->as_callback_data(),
`
96
``
`-
DEFAULT,
`
97
``
`-
None,
`
98
``
`-
SideEffectType::kHasNoSideEffect)
`
99
``
`-
.FromJust());
`
100
``
-
101
88
`// process.version
`
102
89
`READONLY_PROPERTY(process,
`
103
90
`"version",
`
`@@ -140,34 +127,56 @@ MaybeLocal CreateProcessObject(
`
140
127
`#endif // _WIN32
`
141
128
`#endif // NODE_HAS_RELEASE_URLS
`
142
129
``
``
130
`+
// process._rawDebug: may be overwritten later in JS land, but should be
`
``
131
`+
// availbale from the begining for debugging purposes
`
``
132
`+
env->SetMethod(process, "_rawDebug", RawDebug);
`
``
133
+
``
134
`+
return scope.Escape(process);
`
``
135
`+
}
`
``
136
+
``
137
`+
void PatchProcessObject(const FunctionCallbackInfo& args) {
`
``
138
`+
Isolate* isolate = args.GetIsolate();
`
``
139
`+
Local context = isolate->GetCurrentContext();
`
``
140
`+
Environment* env = Environment::GetCurrent(context);
`
``
141
`+
CHECK(args[0]->IsObject());
`
``
142
`+
Local process = args[0].As();
`
``
143
+
``
144
`+
// process.title
`
``
145
`+
CHECK(process
`
``
146
`+
->SetAccessor(
`
``
147
`+
context,
`
``
148
`+
FIXED_ONE_BYTE_STRING(isolate, "title"),
`
``
149
`+
ProcessTitleGetter,
`
``
150
`+
env->owns_process_state() ? ProcessTitleSetter : nullptr,
`
``
151
`+
env->as_callback_data(),
`
``
152
`+
DEFAULT,
`
``
153
`+
None,
`
``
154
`+
SideEffectType::kHasNoSideEffect)
`
``
155
`+
.FromJust());
`
``
156
+
143
157
`// process.argv
`
144
``
`-
process->Set(env->context(),
`
145
``
`-
FIXED_ONE_BYTE_STRING(env->isolate(), "argv"),
`
146
``
`-
ToV8Value(env->context(), args).ToLocalChecked()).FromJust();
`
``
158
`+
process->Set(context,
`
``
159
`+
FIXED_ONE_BYTE_STRING(isolate, "argv"),
`
``
160
`+
ToV8Value(context, env->argv()).ToLocalChecked()).FromJust();
`
147
161
``
148
162
`// process.execArgv
`
149
``
`-
process->Set(env->context(),
`
150
``
`-
FIXED_ONE_BYTE_STRING(env->isolate(), "execArgv"),
`
151
``
`-
ToV8Value(env->context(), exec_args)
`
``
163
`+
process->Set(context,
`
``
164
`+
FIXED_ONE_BYTE_STRING(isolate, "execArgv"),
`
``
165
`+
ToV8Value(context, env->exec_argv())
`
152
166
` .ToLocalChecked()).FromJust();
`
153
167
``
154
168
`READONLY_PROPERTY(process, "pid",
`
155
``
`-
Integer::New(env->isolate(), uv_os_getpid()));
`
``
169
`+
Integer::New(isolate, uv_os_getpid()));
`
156
170
``
157
``
`-
CHECK(process->SetAccessor(env->context(),
`
158
``
`-
FIXED_ONE_BYTE_STRING(env->isolate(), "ppid"),
`
``
171
`+
CHECK(process->SetAccessor(context,
`
``
172
`+
FIXED_ONE_BYTE_STRING(isolate, "ppid"),
`
159
173
` GetParentProcessId).FromJust());
`
160
174
``
161
``
`-
// TODO(joyeecheung): make this available in JS during pre-execution.
`
162
``
`-
// Note that to use this in releases the code doing the revert need to be
`
163
``
`-
// careful to delay the check until after the bootstrap but that may not
`
164
``
`-
// be possible depending on the feature being reverted.
`
165
``
-
166
175
`// --security-revert flags
`
167
176
`#define V(code, _, __) \
`
168
177
`do { \
`
169
178
`if (IsReverted(SECURITY_REVERT_ ## code)) { \
`
170
``
`-
READONLY_PROPERTY(process, "REVERT_" #code, True(env->isolate())); \
`
``
179
`+
READONLY_PROPERTY(process, "REVERT_" #code, True(isolate)); \
`
171
180
` } \
`
172
181
` } while (0);
`
173
182
`SECURITY_REVERSIONS(V)
`
`@@ -181,7 +190,7 @@ MaybeLocal CreateProcessObject(
`
181
190
`if (uv_exepath(exec_path_buf, &exec_path_len) == 0) {
`
182
191
` exec_path = std::string(exec_path_buf, exec_path_len);
`
183
192
` } else {
`
184
``
`-
exec_path = args[0];
`
``
193
`+
exec_path = env->argv()[0];
`
185
194
` }
`
186
195
`// On OpenBSD process.execPath will be relative unless we
`
187
196
`// get the full path before process.execPath is used.
`
`@@ -196,9 +205,9 @@ MaybeLocal CreateProcessObject(
`
196
205
`uv_fs_req_cleanup(&req);
`
197
206
`#endif
`
198
207
` process
`
199
``
`-
->Set(env->context(),
`
200
``
`-
FIXED_ONE_BYTE_STRING(env->isolate(), "execPath"),
`
201
``
`-
String::NewFromUtf8(env->isolate(),
`
``
208
`+
->Set(context,
`
``
209
`+
FIXED_ONE_BYTE_STRING(isolate, "execPath"),
`
``
210
`+
String::NewFromUtf8(isolate,
`
202
211
` exec_path.c_str(),
`
203
212
` NewStringType::kInternalized,
`
204
213
` exec_path.size())
`
`@@ -207,20 +216,13 @@ MaybeLocal CreateProcessObject(
`
207
216
` }
`
208
217
``
209
218
`// process.debugPort
`
210
``
`-
auto debug_port_string = FIXED_ONE_BYTE_STRING(env->isolate(), "debugPort");
`
211
219
`CHECK(process
`
212
``
`-
->SetAccessor(env->context(),
`
213
``
`-
debug_port_string,
`
``
220
`+
->SetAccessor(context,
`
``
221
`+
FIXED_ONE_BYTE_STRING(isolate, "debugPort"),
`
214
222
` DebugPortGetter,
`
215
223
` env->owns_process_state() ? DebugPortSetter : nullptr,
`
216
224
` env->as_callback_data())
`
217
225
` .FromJust());
`
218
``
-
219
``
`-
// process._rawDebug: may be overwritten later in JS land, but should be
`
220
``
`-
// availbale from the begining for debugging purposes
`
221
``
`-
env->SetMethod(process, "_rawDebug", RawDebug);
`
222
``
-
223
``
`-
return scope.Escape(process);
`
224
226
`}
`
225
227
``
226
228
`} // namespace node
`