40
40
41
41
#define THROW_AND_RETURN_IF_OOB (r ) \
42
42
do { \
43
- if (!(r)) return node::THROW_ERR_INDEX_OUT_OF_RANGE (env); \
44
- } while (0 )
43
+ if ((r).IsNothing ()) return ; \
44
+ if (!(r).FromJust ()) \
45
+ return node::THROW_ERR_INDEX_OUT_OF_RANGE (env); \
46
+ } while (0 ) \
45
47
46
- #define SLICE_START_END (start_arg, end_arg, end_max ) \
48
+ #define SLICE_START_END (env, start_arg, end_arg, end_max ) \
47
49
size_t start; \
48
50
size_t end; \
49
- THROW_AND_RETURN_IF_OOB (ParseArrayIndex(start_arg, 0 , &start)); \
50
- THROW_AND_RETURN_IF_OOB (ParseArrayIndex(end_arg, end_max, &end)); \
51
+ THROW_AND_RETURN_IF_OOB (ParseArrayIndex(env, start_arg, 0 , &start)); \
52
+ THROW_AND_RETURN_IF_OOB (ParseArrayIndex(env, end_arg, end_max, &end)); \
51
53
if (end < start) end = start; \
52
- THROW_AND_RETURN_IF_OOB (end <= end_max); \
54
+ THROW_AND_RETURN_IF_OOB (Just( end <= end_max)); \
53
55
size_t length = end - start;
54
56
55
57
namespace node {
@@ -76,9 +78,11 @@ using v8::EscapableHandleScope;
76
78
using v8::FunctionCallbackInfo;
77
79
using v8::Integer;
78
80
using v8::Isolate;
81
+ using v8::Just;
79
82
using v8::Local;
80
83
using v8::Maybe;
81
84
using v8::MaybeLocal;
85
+ using v8::Nothing;
82
86
using v8::Object;
83
87
using v8::String;
84
88
using v8::Uint32;
@@ -161,29 +165,32 @@ void CallbackInfo::WeakCallback(Isolate* isolate) {
161
165
}
162
166
163
167
164
- // Parse index for external array data.
165
- inline MUST_USE_RESULT bool ParseArrayIndex (Local<Value> arg,
166
- size_t def,
167
- size_t * ret) {
168
+ // Parse index for external array data. An empty Maybe indicates
169
+ // a pending exception. `false` indicates that the index is out-of-bounds.
170
+ inline MUST_USE_RESULT Maybe<bool > ParseArrayIndex (Environment* env,
171
+ Local<Value> arg,
172
+ size_t def,
173
+ size_t * ret) {
168
174
if (arg->IsUndefined ()) {
169
175
*ret = def;
170
- return true ;
176
+ return Just ( true ) ;
171
177
}
172
178
173
- CHECK (arg->IsNumber ());
174
- int64_t tmp_i = arg.As <Integer>()->Value ();
179
+ int64_t tmp_i;
180
+ if (!arg->IntegerValue (env->context ()).To (&tmp_i))
181
+ return Nothing<bool >();
175
182
176
183
if (tmp_i < 0 )
177
- return false ;
184
+ return Just ( false ) ;
178
185
179
186
// Check that the result fits in a size_t.
180
187
const uint64_t kSizeMax = static_cast <uint64_t >(static_cast <size_t >(-1 ));
181
188
// coverity[pointless_expression]
182
189
if (static_cast <uint64_t >(tmp_i) > kSizeMax )
183
- return false ;
190
+ return Just ( false ) ;
184
191
185
192
*ret = static_cast <size_t >(tmp_i);
186
- return true ;
193
+ return Just ( true ) ;
187
194
}
188
195
189
196
} // anonymous namespace
@@ -452,7 +459,7 @@ void StringSlice(const FunctionCallbackInfo<Value>& args) {
452
459
if (ts_obj_length == 0 )
453
460
return args.GetReturnValue ().SetEmptyString ();
454
461
455
- SLICE_START_END (args[0 ], args[1 ], ts_obj_length)
462
+ SLICE_START_END (env, args[0 ], args[1 ], ts_obj_length)
456
463
457
464
Local<Value> error;
458
465
MaybeLocal<Value> ret =
@@ -485,9 +492,10 @@ void Copy(const FunctionCallbackInfo<Value> &args) {
485
492
size_t source_start;
486
493
size_t source_end;
487
494
488
- THROW_AND_RETURN_IF_OOB (ParseArrayIndex (args[2 ], 0 , &target_start));
489
- THROW_AND_RETURN_IF_OOB (ParseArrayIndex (args[3 ], 0 , &source_start));
490
- THROW_AND_RETURN_IF_OOB (ParseArrayIndex (args[4 ], ts_obj_length, &source_end));
495
+ THROW_AND_RETURN_IF_OOB (ParseArrayIndex (env, args[2 ], 0 , &target_start));
496
+ THROW_AND_RETURN_IF_OOB (ParseArrayIndex (env, args[3 ], 0 , &source_start));
497
+ THROW_AND_RETURN_IF_OOB (ParseArrayIndex (env, args[4 ], ts_obj_length,
498
+ &source_end));
491
499
492
500
// Copy 0 bytes; we're done
493
501
if (target_start >= target_length || source_start >= source_end)
@@ -617,13 +625,13 @@ void StringWrite(const FunctionCallbackInfo<Value>& args) {
617
625
size_t offset;
618
626
size_t max_length;
619
627
620
- THROW_AND_RETURN_IF_OOB (ParseArrayIndex (args[1 ], 0 , &offset));
628
+ THROW_AND_RETURN_IF_OOB (ParseArrayIndex (env, args[1 ], 0 , &offset));
621
629
if (offset > ts_obj_length) {
622
630
return node::THROW_ERR_BUFFER_OUT_OF_BOUNDS (
623
631
env, " \" offset\" is outside of buffer bounds" );
624
632
}
625
633
626
- THROW_AND_RETURN_IF_OOB (ParseArrayIndex (args[2 ], ts_obj_length - offset,
634
+ THROW_AND_RETURN_IF_OOB (ParseArrayIndex (env, args[2 ], ts_obj_length - offset,
627
635
&max_length));
628
636
629
637
max_length = MIN (ts_obj_length - offset, max_length);
@@ -678,10 +686,12 @@ void CompareOffset(const FunctionCallbackInfo<Value> &args) {
678
686
size_t source_end;
679
687
size_t target_end;
680
688
681
- THROW_AND_RETURN_IF_OOB (ParseArrayIndex (args[2 ], 0 , &target_start));
682
- THROW_AND_RETURN_IF_OOB (ParseArrayIndex (args[3 ], 0 , &source_start));
683
- THROW_AND_RETURN_IF_OOB (ParseArrayIndex (args[4 ], target_length, &target_end));
684
- THROW_AND_RETURN_IF_OOB (ParseArrayIndex (args[5 ], ts_obj_length, &source_end));
689
+ THROW_AND_RETURN_IF_OOB (ParseArrayIndex (env, args[2 ], 0 , &target_start));
690
+ THROW_AND_RETURN_IF_OOB (ParseArrayIndex (env, args[3 ], 0 , &source_start));
691
+ THROW_AND_RETURN_IF_OOB (ParseArrayIndex (env, args[4 ], target_length,
692
+ &target_end));
693
+ THROW_AND_RETURN_IF_OOB (ParseArrayIndex (env, args[5 ], ts_obj_length,
694
+ &source_end));
685
695
686
696
if (source_start > ts_obj_length)
687
697
return node::THROW_ERR_INDEX_OUT_OF_RANGE (env);
0 commit comments