@@ -22,13 +22,14 @@ using v8::Local;
2222using v8::Object;
2323using v8::String;
2424using v8::Value;
25+ using v8::MaybeLocal;
2526
2627
2728template <typename ResourceType, typename TypeName>
2829class ExternString : public ResourceType {
2930 public:
3031 ~ExternString () override {
31- delete[] data_;
32+ free ( const_cast <TypeName*>( data_)) ;
3233 isolate ()->AdjustAmountOfExternalAllocatedMemory (-byte_length ());
3334 }
3435
@@ -52,7 +53,11 @@ class ExternString: public ResourceType {
5253 if (length == 0 )
5354 return scope.Escape (String::Empty (isolate));
5455
55- TypeName* new_data = new TypeName[length];
56+ TypeName* new_data =
57+ static_cast <TypeName*>(malloc (length * sizeof (*new_data)));
58+ if (new_data == nullptr ) {
59+ return Local<String>();
60+ }
5661 memcpy (new_data, data, length * sizeof (*new_data));
5762
5863 return scope.Escape (ExternString<ResourceType, TypeName>::New (isolate,
@@ -72,10 +77,15 @@ class ExternString: public ResourceType {
7277 ExternString* h_str = new ExternString<ResourceType, TypeName>(isolate,
7378 data,
7479 length);
75- Local <String> str = String::NewExternal (isolate, h_str);
80+ MaybeLocal <String> str = String::NewExternal (isolate, h_str);
7681 isolate->AdjustAmountOfExternalAllocatedMemory (h_str->byte_length ());
7782
78- return scope.Escape (str);
83+ if (str.IsEmpty ()) {
84+ delete h_str;
85+ return Local<String>();
86+ }
87+
88+ return scope.Escape (str.ToLocalChecked ());
7989 }
8090
8191 inline Isolate* isolate () const { return isolate_; }
@@ -765,11 +775,14 @@ Local<Value> StringBytes::Encode(Isolate* isolate,
765775
766776 case ASCII:
767777 if (contains_non_ascii (buf, buflen)) {
768- char * out = new char [buflen];
778+ char * out = static_cast <char *>(malloc (buflen));
779+ if (out == nullptr ) {
780+ return Local<String>();
781+ }
769782 force_ascii (buf, out, buflen);
770783 if (buflen < EXTERN_APEX) {
771784 val = OneByteString (isolate, out, buflen);
772- delete[] out;
785+ free ( out) ;
773786 } else {
774787 val = ExternOneByteString::New (isolate, out, buflen);
775788 }
@@ -797,14 +810,17 @@ Local<Value> StringBytes::Encode(Isolate* isolate,
797810
798811 case BASE64: {
799812 size_t dlen = base64_encoded_size (buflen);
800- char * dst = new char [dlen];
813+ char * dst = static_cast <char *>(malloc (dlen));
814+ if (dst == nullptr ) {
815+ return Local<String>();
816+ }
801817
802818 size_t written = base64_encode (buf, buflen, dst, dlen);
803819 CHECK_EQ (written, dlen);
804820
805821 if (dlen < EXTERN_APEX) {
806822 val = OneByteString (isolate, dst, dlen);
807- delete[] dst;
823+ free ( dst) ;
808824 } else {
809825 val = ExternOneByteString::New (isolate, dst, dlen);
810826 }
@@ -813,13 +829,16 @@ Local<Value> StringBytes::Encode(Isolate* isolate,
813829
814830 case HEX: {
815831 size_t dlen = buflen * 2 ;
816- char * dst = new char [dlen];
832+ char * dst = static_cast <char *>(malloc (dlen));
833+ if (dst == nullptr ) {
834+ return Local<String>();
835+ }
817836 size_t written = hex_encode (buf, buflen, dst, dlen);
818837 CHECK_EQ (written, dlen);
819838
820839 if (dlen < EXTERN_APEX) {
821840 val = OneByteString (isolate, dst, dlen);
822- delete[] dst;
841+ free ( dst) ;
823842 } else {
824843 val = ExternOneByteString::New (isolate, dst, dlen);
825844 }
0 commit comments