@@ -198,6 +198,13 @@ MaybeLocal<Value> ExternTwoByteString::NewSimpleFromCopy(Isolate* isolate,
198198
199199} // anonymous namespace
200200
201+ static size_t keep_buflen_in_range (size_t len) {
202+ if (len > static_cast <size_t >(std::numeric_limits<int >::max ())) {
203+ return static_cast <size_t >(std::numeric_limits<int >::max ());
204+ }
205+ return len;
206+ }
207+
201208size_t StringBytes::WriteUCS2 (
202209 Isolate* isolate, char * buf, size_t buflen, Local<String> str, int flags) {
203210 uint16_t * const dst = reinterpret_cast <uint16_t *>(buf);
@@ -243,7 +250,7 @@ size_t StringBytes::Write(Isolate* isolate,
243250 enum encoding encoding) {
244251 HandleScope scope (isolate);
245252 size_t nbytes;
246-
253+ buflen = keep_buflen_in_range (buflen);
247254 CHECK (val->IsString () == true );
248255 Local<String> str = val.As <String>();
249256 String::ValueView input_view (isolate, str);
@@ -516,6 +523,7 @@ MaybeLocal<Value> StringBytes::Encode(Isolate* isolate,
516523 }
517524
518525 case ASCII:
526+ buflen = keep_buflen_in_range (buflen);
519527 if (simdutf::validate_ascii_with_errors (buf, buflen).error ) {
520528 // The input contains non-ASCII bytes.
521529 char * out = node::UncheckedMalloc (buflen);
@@ -529,23 +537,23 @@ MaybeLocal<Value> StringBytes::Encode(Isolate* isolate,
529537 return ExternOneByteString::NewFromCopy (isolate, buf, buflen, error);
530538 }
531539
532- case UTF8:
533- {
534- val = String::NewFromUtf8 (isolate,
535- buf,
536- v8::NewStringType::kNormal ,
537- buflen);
538- Local<String> str;
539- if (!val.ToLocal (&str)) {
540- *error = node::ERR_STRING_TOO_LONG (isolate);
541- }
542- return str;
540+ case UTF8: {
541+ buflen = keep_buflen_in_range (buflen);
542+ val =
543+ String::NewFromUtf8 (isolate, buf, v8::NewStringType::kNormal , buflen);
544+ Local<String> str;
545+ if (!val.ToLocal (&str)) {
546+ *error = node::ERR_STRING_TOO_LONG (isolate);
543547 }
548+ return str;
549+ }
544550
545551 case LATIN1:
552+ buflen = keep_buflen_in_range (buflen);
546553 return ExternOneByteString::NewFromCopy (isolate, buf, buflen, error);
547554
548555 case BASE64: {
556+ buflen = keep_buflen_in_range (buflen);
549557 size_t dlen = simdutf::base64_length_from_binary (buflen);
550558 char * dst = node::UncheckedMalloc (dlen);
551559 if (dst == nullptr ) {
@@ -560,6 +568,7 @@ MaybeLocal<Value> StringBytes::Encode(Isolate* isolate,
560568 }
561569
562570 case BASE64URL: {
571+ buflen = keep_buflen_in_range (buflen);
563572 size_t dlen =
564573 simdutf::base64_length_from_binary (buflen, simdutf::base64_url);
565574 char * dst = node::UncheckedMalloc (dlen);
@@ -576,6 +585,7 @@ MaybeLocal<Value> StringBytes::Encode(Isolate* isolate,
576585 }
577586
578587 case HEX: {
588+ buflen = keep_buflen_in_range (buflen);
579589 size_t dlen = buflen * 2 ;
580590 char * dst = node::UncheckedMalloc (dlen);
581591 if (dst == nullptr ) {
@@ -589,6 +599,7 @@ MaybeLocal<Value> StringBytes::Encode(Isolate* isolate,
589599 }
590600
591601 case UCS2: {
602+ buflen = keep_buflen_in_range (buflen);
592603 size_t str_len = buflen / 2 ;
593604 if constexpr (IsBigEndian ()) {
594605 uint16_t * dst = node::UncheckedMalloc<uint16_t >(str_len);
0 commit comments