Skip to content

Commit

Permalink
src: improve error handling in string_bytes/decoder
Browse files Browse the repository at this point in the history
PR-URL: #56978
Reviewed-By: Yagiz Nizipli <[email protected]>
Reviewed-By: Chengzhong Wu <[email protected]>
  • Loading branch information
jasnell authored and targos committed Feb 17, 2025
1 parent d0ee8c0 commit 41f444f
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 25 deletions.
34 changes: 16 additions & 18 deletions src/string_bytes.cc
Original file line number Diff line number Diff line change
Expand Up @@ -112,16 +112,17 @@ class ExternString: public ResourceType {
ExternString* h_str = new ExternString<ResourceType, TypeName>(isolate,
data,
length);
MaybeLocal<Value> str = NewExternal(isolate, h_str);
isolate->AdjustAmountOfExternalAllocatedMemory(h_str->byte_length());
Local<Value> str;

if (str.IsEmpty()) {
if (!NewExternal(isolate, h_str).ToLocal(&str)) {
delete h_str;
*error = node::ERR_STRING_TOO_LONG(isolate);
return MaybeLocal<Value>();
}

return str.ToLocalChecked();
isolate->AdjustAmountOfExternalAllocatedMemory(h_str->byte_length());

return str;
}

inline Isolate* isolate() const { return isolate_; }
Expand Down Expand Up @@ -168,16 +169,16 @@ MaybeLocal<Value> ExternOneByteString::NewSimpleFromCopy(Isolate* isolate,
const char* data,
size_t length,
Local<Value>* error) {
MaybeLocal<String> str =
String::NewFromOneByte(isolate,
reinterpret_cast<const uint8_t*>(data),
v8::NewStringType::kNormal,
length);
if (str.IsEmpty()) {
Local<String> str;
if (!String::NewFromOneByte(isolate,
reinterpret_cast<const uint8_t*>(data),
v8::NewStringType::kNormal,
length)
.ToLocal(&str)) {
*error = node::ERR_STRING_TOO_LONG(isolate);
return MaybeLocal<Value>();
}
return str.ToLocalChecked();
return str;
}


Expand All @@ -186,16 +187,13 @@ MaybeLocal<Value> ExternTwoByteString::NewSimpleFromCopy(Isolate* isolate,
const uint16_t* data,
size_t length,
Local<Value>* error) {
MaybeLocal<String> str =
String::NewFromTwoByte(isolate,
data,
v8::NewStringType::kNormal,
length);
if (str.IsEmpty()) {
Local<String> str;
if (!String::NewFromTwoByte(isolate, data, v8::NewStringType::kNormal, length)
.ToLocal(&str)) {
*error = node::ERR_STRING_TOO_LONG(isolate);
return MaybeLocal<Value>();
}
return str.ToLocalChecked();
return str;
}

} // anonymous namespace
Expand Down
16 changes: 9 additions & 7 deletions src/string_decoder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -272,19 +272,21 @@ void DecodeData(const FunctionCallbackInfo<Value>& args) {
ArrayBufferViewContents<char> content(args[1].As<ArrayBufferView>());
size_t length = content.length();

MaybeLocal<String> ret =
decoder->DecodeData(args.GetIsolate(), content.data(), &length);
if (!ret.IsEmpty())
args.GetReturnValue().Set(ret.ToLocalChecked());
Local<String> ret;
if (decoder->DecodeData(args.GetIsolate(), content.data(), &length)
.ToLocal(&ret)) {
args.GetReturnValue().Set(ret);
}
}

void FlushData(const FunctionCallbackInfo<Value>& args) {
StringDecoder* decoder =
reinterpret_cast<StringDecoder*>(Buffer::Data(args[0]));
CHECK_NOT_NULL(decoder);
MaybeLocal<String> ret = decoder->FlushData(args.GetIsolate());
if (!ret.IsEmpty())
args.GetReturnValue().Set(ret.ToLocalChecked());
Local<String> ret;
if (decoder->FlushData(args.GetIsolate()).ToLocal(&ret)) {
args.GetReturnValue().Set(ret);
}
}

void InitializeStringDecoder(Local<Object> target,
Expand Down

0 comments on commit 41f444f

Please sign in to comment.