@@ -244,6 +244,13 @@ static inline unsigned unhex(uint8_t x) {
244
244
return unhex_table[x];
245
245
}
246
246
247
+ static size_t keep_buflen_in_range (size_t len) {
248
+ if (len > static_cast <size_t >(std::numeric_limits<int >::max ())) {
249
+ return static_cast <size_t >(std::numeric_limits<int >::max ());
250
+ }
251
+ return len;
252
+ }
253
+
247
254
template <typename TypeName>
248
255
static size_t hex_decode (char * buf,
249
256
size_t len,
@@ -306,7 +313,7 @@ size_t StringBytes::Write(Isolate* isolate,
306
313
enum encoding encoding) {
307
314
HandleScope scope (isolate);
308
315
size_t nbytes;
309
-
316
+ buflen = keep_buflen_in_range (buflen);
310
317
CHECK (val->IsString () == true );
311
318
Local<String> str = val.As <String>();
312
319
@@ -579,6 +586,7 @@ MaybeLocal<Value> StringBytes::Encode(Isolate* isolate,
579
586
}
580
587
581
588
case ASCII:
589
+ buflen = keep_buflen_in_range (buflen);
582
590
if (simdutf::validate_ascii_with_errors (buf, buflen).error ) {
583
591
// The input contains non-ASCII bytes.
584
592
char * out = node::UncheckedMalloc (buflen);
@@ -592,23 +600,23 @@ MaybeLocal<Value> StringBytes::Encode(Isolate* isolate,
592
600
return ExternOneByteString::NewFromCopy (isolate, buf, buflen, error);
593
601
}
594
602
595
- case UTF8:
596
- {
597
- val = String::NewFromUtf8 (isolate,
598
- buf,
599
- v8::NewStringType::kNormal ,
600
- buflen);
601
- Local<String> str;
602
- if (!val.ToLocal (&str)) {
603
- *error = node::ERR_STRING_TOO_LONG (isolate);
604
- }
605
- return str;
603
+ case UTF8: {
604
+ buflen = keep_buflen_in_range (buflen);
605
+ val =
606
+ String::NewFromUtf8 (isolate, buf, v8::NewStringType::kNormal , buflen);
607
+ Local<String> str;
608
+ if (!val.ToLocal (&str)) {
609
+ *error = node::ERR_STRING_TOO_LONG (isolate);
606
610
}
611
+ return str;
612
+ }
607
613
608
614
case LATIN1:
615
+ buflen = keep_buflen_in_range (buflen);
609
616
return ExternOneByteString::NewFromCopy (isolate, buf, buflen, error);
610
617
611
618
case BASE64: {
619
+ buflen = keep_buflen_in_range (buflen);
612
620
size_t dlen = base64_encoded_size (buflen);
613
621
char * dst = node::UncheckedMalloc (dlen);
614
622
if (dst == nullptr ) {
@@ -623,6 +631,7 @@ MaybeLocal<Value> StringBytes::Encode(Isolate* isolate,
623
631
}
624
632
625
633
case BASE64URL: {
634
+ buflen = keep_buflen_in_range (buflen);
626
635
size_t dlen = base64_encoded_size (buflen, Base64Mode::URL);
627
636
char * dst = node::UncheckedMalloc (dlen);
628
637
if (dst == nullptr ) {
@@ -637,6 +646,7 @@ MaybeLocal<Value> StringBytes::Encode(Isolate* isolate,
637
646
}
638
647
639
648
case HEX: {
649
+ buflen = keep_buflen_in_range (buflen);
640
650
size_t dlen = buflen * 2 ;
641
651
char * dst = node::UncheckedMalloc (dlen);
642
652
if (dst == nullptr ) {
@@ -650,6 +660,7 @@ MaybeLocal<Value> StringBytes::Encode(Isolate* isolate,
650
660
}
651
661
652
662
case UCS2: {
663
+ buflen = keep_buflen_in_range (buflen);
653
664
size_t str_len = buflen / 2 ;
654
665
if (IsBigEndian ()) {
655
666
uint16_t * dst = node::UncheckedMalloc<uint16_t >(str_len);
0 commit comments