@@ -244,6 +244,13 @@ static inline unsigned unhex(uint8_t x) {
244244 return unhex_table[x];
245245}
246246
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+
247254template <typename TypeName>
248255static size_t hex_decode (char * buf,
249256 size_t len,
@@ -306,7 +313,7 @@ size_t StringBytes::Write(Isolate* isolate,
306313 enum encoding encoding) {
307314 HandleScope scope (isolate);
308315 size_t nbytes;
309-
316+ buflen = keep_buflen_in_range (buflen);
310317 CHECK (val->IsString () == true );
311318 Local<String> str = val.As <String>();
312319
@@ -579,6 +586,7 @@ MaybeLocal<Value> StringBytes::Encode(Isolate* isolate,
579586 }
580587
581588 case ASCII:
589+ buflen = keep_buflen_in_range (buflen);
582590 if (simdutf::validate_ascii_with_errors (buf, buflen).error ) {
583591 // The input contains non-ASCII bytes.
584592 char * out = node::UncheckedMalloc (buflen);
@@ -592,23 +600,23 @@ MaybeLocal<Value> StringBytes::Encode(Isolate* isolate,
592600 return ExternOneByteString::NewFromCopy (isolate, buf, buflen, error);
593601 }
594602
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);
606610 }
611+ return str;
612+ }
607613
608614 case LATIN1:
615+ buflen = keep_buflen_in_range (buflen);
609616 return ExternOneByteString::NewFromCopy (isolate, buf, buflen, error);
610617
611618 case BASE64: {
619+ buflen = keep_buflen_in_range (buflen);
612620 size_t dlen = base64_encoded_size (buflen);
613621 char * dst = node::UncheckedMalloc (dlen);
614622 if (dst == nullptr ) {
@@ -623,6 +631,7 @@ MaybeLocal<Value> StringBytes::Encode(Isolate* isolate,
623631 }
624632
625633 case BASE64URL: {
634+ buflen = keep_buflen_in_range (buflen);
626635 size_t dlen = base64_encoded_size (buflen, Base64Mode::URL);
627636 char * dst = node::UncheckedMalloc (dlen);
628637 if (dst == nullptr ) {
@@ -637,6 +646,7 @@ MaybeLocal<Value> StringBytes::Encode(Isolate* isolate,
637646 }
638647
639648 case HEX: {
649+ buflen = keep_buflen_in_range (buflen);
640650 size_t dlen = buflen * 2 ;
641651 char * dst = node::UncheckedMalloc (dlen);
642652 if (dst == nullptr ) {
@@ -650,6 +660,7 @@ MaybeLocal<Value> StringBytes::Encode(Isolate* isolate,
650660 }
651661
652662 case UCS2: {
663+ buflen = keep_buflen_in_range (buflen);
653664 size_t str_len = buflen / 2 ;
654665 if (IsBigEndian ()) {
655666 uint16_t * dst = node::UncheckedMalloc<uint16_t >(str_len);
0 commit comments