@@ -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