@@ -306,7 +306,7 @@ size_t StringBytes::Write(Isolate* isolate,
306
306
enum encoding encoding) {
307
307
HandleScope scope (isolate);
308
308
size_t nbytes;
309
-
309
+ buflen = StringBytes::keep_buflen_in_range (buflen);
310
310
CHECK (val->IsString () == true );
311
311
Local<String> str = val.As <String>();
312
312
@@ -545,6 +545,13 @@ std::string StringBytes::hex_encode(const char* src, size_t slen) {
545
545
return dst;
546
546
}
547
547
548
+ size_t StringBytes::keep_buflen_in_range (size_t len) {
549
+ if (len > static_cast <int >(std::numeric_limits<int >::max ())) {
550
+ return static_cast <int >(std::numeric_limits<int >::max ());
551
+ }
552
+ return len;
553
+ }
554
+
548
555
#define CHECK_BUFLEN_IN_RANGE (len ) \
549
556
do { \
550
557
if ((len) > Buffer::kMaxLength ) { \
@@ -579,6 +586,7 @@ MaybeLocal<Value> StringBytes::Encode(Isolate* isolate,
579
586
}
580
587
581
588
case ASCII:
589
+ buflen = StringBytes::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,24 +600,24 @@ 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 = StringBytes::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 = StringBytes::keep_buflen_in_range (buflen);
609
616
return ExternOneByteString::NewFromCopy (isolate, buf, buflen, error);
610
617
611
618
case BASE64: {
612
619
size_t dlen = base64_encoded_size (buflen);
620
+ dlen = StringBytes::keep_buflen_in_range (dlen);
613
621
char * dst = node::UncheckedMalloc (dlen);
614
622
if (dst == nullptr ) {
615
623
*error = node::ERR_MEMORY_ALLOCATION_FAILED (isolate);
@@ -624,6 +632,7 @@ MaybeLocal<Value> StringBytes::Encode(Isolate* isolate,
624
632
625
633
case BASE64URL: {
626
634
size_t dlen = base64_encoded_size (buflen, Base64Mode::URL);
635
+ dlen = StringBytes::keep_buflen_in_range (dlen);
627
636
char * dst = node::UncheckedMalloc (dlen);
628
637
if (dst == nullptr ) {
629
638
*error = node::ERR_MEMORY_ALLOCATION_FAILED (isolate);
@@ -638,6 +647,7 @@ MaybeLocal<Value> StringBytes::Encode(Isolate* isolate,
638
647
639
648
case HEX: {
640
649
size_t dlen = buflen * 2 ;
650
+ dlen = StringBytes::keep_buflen_in_range (dlen);
641
651
char * dst = node::UncheckedMalloc (dlen);
642
652
if (dst == nullptr ) {
643
653
*error = node::ERR_MEMORY_ALLOCATION_FAILED (isolate);
@@ -651,6 +661,7 @@ MaybeLocal<Value> StringBytes::Encode(Isolate* isolate,
651
661
652
662
case UCS2: {
653
663
size_t str_len = buflen / 2 ;
664
+ str_len = StringBytes::keep_buflen_in_range (str_len);
654
665
if (IsBigEndian ()) {
655
666
uint16_t * dst = node::UncheckedMalloc<uint16_t >(str_len);
656
667
if (str_len != 0 && dst == nullptr ) {
0 commit comments