File tree Expand file tree Collapse file tree 5 files changed +59
-0
lines changed Expand file tree Collapse file tree 5 files changed +59
-0
lines changed Original file line number Diff line number Diff line change @@ -273,6 +273,29 @@ void Environment::CreateProperties() {
273
273
CHECK (primordials->IsObject ());
274
274
set_primordials (primordials.As <Object>());
275
275
276
+ Local<String> prototype_string =
277
+ FIXED_ONE_BYTE_STRING (isolate (), " prototype" );
278
+
279
+ #define V (EnvPropertyName, PrimordialsPropertyName ) \
280
+ { \
281
+ Local<Value> ctor = \
282
+ primordials.As <Object>() \
283
+ ->Get (ctx, \
284
+ FIXED_ONE_BYTE_STRING (isolate (), PrimordialsPropertyName)) \
285
+ .ToLocalChecked (); \
286
+ CHECK (ctor->IsObject ()); \
287
+ Local<Value> prototype = \
288
+ ctor.As <Object>()->Get (ctx, prototype_string).ToLocalChecked (); \
289
+ CHECK (prototype->IsObject ()); \
290
+ set_##EnvPropertyName (prototype.As <Object>()); \
291
+ }
292
+
293
+ V (primordials_safe_map_prototype_object, " SafeMap" );
294
+ V (primordials_safe_set_prototype_object, " SafeSet" );
295
+ V (primordials_safe_weak_map_prototype_object, " SafeWeakMap" );
296
+ V (primordials_safe_weak_set_prototype_object, " SafeWeakSet" );
297
+ #undef V
298
+
276
299
Local<Object> process_object =
277
300
node::CreateProcessObject (this ).FromMaybe (Local<Object>());
278
301
set_process_object (process_object);
Original file line number Diff line number Diff line change @@ -478,6 +478,10 @@ constexpr size_t kFsStatsBufferLength =
478
478
V (prepare_stack_trace_callback, v8::Function) \
479
479
V (process_object, v8::Object) \
480
480
V (primordials, v8::Object) \
481
+ V (primordials_safe_map_prototype_object, v8::Object) \
482
+ V (primordials_safe_set_prototype_object, v8::Object) \
483
+ V (primordials_safe_weak_map_prototype_object, v8::Object) \
484
+ V (primordials_safe_weak_set_prototype_object, v8::Object) \
481
485
V (promise_hook_handler, v8::Function) \
482
486
V (promise_reject_callback, v8::Function) \
483
487
V (script_data_constructor_function, v8::Function) \
Original file line number Diff line number Diff line change @@ -882,6 +882,12 @@ void GetOptions(const FunctionCallbackInfo<Value>& args) {
882
882
});
883
883
884
884
Local<Map> options = Map::New (isolate);
885
+ if (options
886
+ ->SetPrototype (context, env->primordials_safe_map_prototype_object ())
887
+ .IsNothing ()) {
888
+ return ;
889
+ }
890
+
885
891
for (const auto & item : _ppop_instance.options_ ) {
886
892
Local<Value> value;
887
893
const auto & option_info = item.second ;
@@ -970,6 +976,12 @@ void GetOptions(const FunctionCallbackInfo<Value>& args) {
970
976
Local<Value> aliases;
971
977
if (!ToV8Value (context, _ppop_instance.aliases_ ).ToLocal (&aliases)) return ;
972
978
979
+ if (aliases.As <Object>()
980
+ ->SetPrototype (context, env->primordials_safe_map_prototype_object ())
981
+ .IsNothing ()) {
982
+ return ;
983
+ }
984
+
973
985
Local<Object> ret = Object::New (isolate);
974
986
if (ret->Set (context, env->options_string (), options).IsNothing () ||
975
987
ret->Set (context, env->aliases_string (), aliases).IsNothing ()) {
Original file line number Diff line number Diff line change @@ -81,6 +81,8 @@ void GetErrMap(const FunctionCallbackInfo<Value>& args) {
81
81
Isolate* isolate = env->isolate ();
82
82
Local<Context> context = env->context ();
83
83
84
+ // This can't return a SafeMap, because the uv binding can be referenced
85
+ // by user code by using `process.binding('uv').getErrorMap()`:
84
86
Local<Map> err_map = Map::New (isolate);
85
87
86
88
size_t errors_len = arraysize (per_process::uv_errors_map);
Original file line number Diff line number Diff line change
1
+ // Flags: --expose-internals
2
+ 'use strict' ;
3
+
4
+ const common = require ( '../common' ) ;
5
+ const { primordials : { SafeMap } } = require ( 'internal/test/binding' ) ;
6
+
7
+ const { options, aliases, getOptionValue } = require ( 'internal/options' ) ;
8
+ const assert = require ( 'assert' ) ;
9
+
10
+ assert ( options instanceof SafeMap ,
11
+ "require('internal/options').options is a SafeMap" ) ;
12
+
13
+ assert ( aliases instanceof SafeMap ,
14
+ "require('internal/options').aliases is a SafeMap" ) ;
15
+
16
+ Map . prototype . get =
17
+ common . mustNotCall ( '`getOptionValue` must not call user-mutable method' ) ;
18
+ assert . strictEqual ( getOptionValue ( '--expose-internals' ) , true ) ;
You can’t perform that action at this time.
0 commit comments