Skip to content

Commit 936a999

Browse files
jasnelladuh95
authored andcommitted
src: improve error handling in buffer and dotenv
Replacing ToLocalChecked() PR-URL: #57189 Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com> Reviewed-By: Robert Nagy <ronagy@icloud.com>
1 parent 975e2a5 commit 936a999

5 files changed

+65
-48
lines changed

src/node_buffer.cc

+28-11
Original file line numberDiff line numberDiff line change
@@ -567,9 +567,14 @@ void SlowCopy(const FunctionCallbackInfo<Value>& args) {
567567
ArrayBufferViewContents<char> source(args[0]);
568568
SPREAD_BUFFER_ARG(args[1].As<Object>(), target);
569569

570-
const auto target_start = args[2]->Uint32Value(env->context()).ToChecked();
571-
const auto source_start = args[3]->Uint32Value(env->context()).ToChecked();
572-
const auto to_copy = args[4]->Uint32Value(env->context()).ToChecked();
570+
uint32_t target_start;
571+
uint32_t source_start;
572+
uint32_t to_copy;
573+
if (!args[2]->Uint32Value(env->context()).To(&target_start) ||
574+
!args[3]->Uint32Value(env->context()).To(&source_start) ||
575+
!args[4]->Uint32Value(env->context()).To(&to_copy)) {
576+
return;
577+
}
573578

574579
memmove(target_data + target_start, source.data() + source_start, to_copy);
575580
args.GetReturnValue().Set(to_copy);
@@ -634,7 +639,9 @@ void Fill(const FunctionCallbackInfo<Value>& args) {
634639
return;
635640
}
636641

637-
str_obj = args[1]->ToString(env->context()).ToLocalChecked();
642+
if (!args[1]->ToString(env->context()).ToLocal(&str_obj)) {
643+
return;
644+
}
638645
enc = ParseEncoding(env->isolate(), args[4], UTF8);
639646

640647
// Can't use StringBytes::Write() in all cases. For example if attempting
@@ -697,7 +704,10 @@ void StringWrite(const FunctionCallbackInfo<Value>& args) {
697704

698705
THROW_AND_RETURN_IF_NOT_STRING(env, args[0], "argument");
699706

700-
Local<String> str = args[0]->ToString(env->context()).ToLocalChecked();
707+
Local<String> str;
708+
if (!args[0]->ToString(env->context()).ToLocal(&str)) {
709+
return;
710+
}
701711

702712
size_t offset = 0;
703713
size_t max_length = 0;
@@ -1238,10 +1248,12 @@ void GetZeroFillToggle(const FunctionCallbackInfo<Value>& args) {
12381248
ab = ArrayBuffer::New(env->isolate(), std::move(backing));
12391249
}
12401250

1241-
ab->SetPrivate(
1242-
env->context(),
1243-
env->untransferable_object_private_symbol(),
1244-
True(env->isolate())).Check();
1251+
if (ab->SetPrivate(env->context(),
1252+
env->untransferable_object_private_symbol(),
1253+
True(env->isolate()))
1254+
.IsNothing()) {
1255+
return;
1256+
}
12451257

12461258
args.GetReturnValue().Set(Uint32Array::New(ab, 0, 1));
12471259
}
@@ -1252,7 +1264,9 @@ void DetachArrayBuffer(const FunctionCallbackInfo<Value>& args) {
12521264
Local<ArrayBuffer> buf = args[0].As<ArrayBuffer>();
12531265
if (buf->IsDetachable()) {
12541266
std::shared_ptr<BackingStore> store = buf->GetBackingStore();
1255-
buf->Detach(Local<Value>()).Check();
1267+
if (buf->Detach(Local<Value>()).IsNothing()) {
1268+
return;
1269+
}
12561270
args.GetReturnValue().Set(ArrayBuffer::New(env->isolate(), store));
12571271
}
12581272
}
@@ -1461,7 +1475,10 @@ void SlowWriteString(const FunctionCallbackInfo<Value>& args) {
14611475

14621476
THROW_AND_RETURN_IF_NOT_STRING(env, args[1], "argument");
14631477

1464-
Local<String> str = args[1]->ToString(env->context()).ToLocalChecked();
1478+
Local<String> str;
1479+
if (!args[1]->ToString(env->context()).ToLocal(&str)) {
1480+
return;
1481+
}
14651482

14661483
size_t offset = 0;
14671484
size_t max_length = 0;

src/node_dotenv.cc

+30-33
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,15 @@
66

77
namespace node {
88

9+
using v8::EscapableHandleScope;
10+
using v8::JustVoid;
911
using v8::Local;
10-
using v8::NewStringType;
12+
using v8::Maybe;
13+
using v8::MaybeLocal;
14+
using v8::Nothing;
1115
using v8::Object;
1216
using v8::String;
17+
using v8::Value;
1318

1419
std::vector<Dotenv::env_file_data> Dotenv::GetDataFromArgs(
1520
const std::vector<std::string>& args) {
@@ -59,50 +64,42 @@ std::vector<Dotenv::env_file_data> Dotenv::GetDataFromArgs(
5964
return env_files;
6065
}
6166

62-
void Dotenv::SetEnvironment(node::Environment* env) {
63-
auto isolate = env->isolate();
67+
Maybe<void> Dotenv::SetEnvironment(node::Environment* env) {
68+
Local<Value> name;
69+
Local<Value> val;
70+
auto context = env->context();
6471

6572
for (const auto& entry : store_) {
66-
auto key = entry.first;
67-
auto value = entry.second;
68-
69-
auto existing = env->env_vars()->Get(key.data());
70-
73+
auto existing = env->env_vars()->Get(entry.first.data());
7174
if (!existing.has_value()) {
72-
env->env_vars()->Set(
73-
isolate,
74-
v8::String::NewFromUtf8(
75-
isolate, key.data(), NewStringType::kNormal, key.size())
76-
.ToLocalChecked(),
77-
v8::String::NewFromUtf8(
78-
isolate, value.data(), NewStringType::kNormal, value.size())
79-
.ToLocalChecked());
75+
if (!ToV8Value(context, entry.first).ToLocal(&name) ||
76+
!ToV8Value(context, entry.second).ToLocal(&val)) {
77+
return Nothing<void>();
78+
}
79+
env->env_vars()->Set(env->isolate(), name.As<String>(), val.As<String>());
8080
}
8181
}
82+
83+
return JustVoid();
8284
}
8385

84-
Local<Object> Dotenv::ToObject(Environment* env) const {
86+
MaybeLocal<Object> Dotenv::ToObject(Environment* env) const {
87+
EscapableHandleScope scope(env->isolate());
8588
Local<Object> result = Object::New(env->isolate());
8689

90+
Local<Value> name;
91+
Local<Value> val;
92+
auto context = env->context();
93+
8794
for (const auto& entry : store_) {
88-
auto key = entry.first;
89-
auto value = entry.second;
90-
91-
result
92-
->Set(
93-
env->context(),
94-
v8::String::NewFromUtf8(
95-
env->isolate(), key.data(), NewStringType::kNormal, key.size())
96-
.ToLocalChecked(),
97-
v8::String::NewFromUtf8(env->isolate(),
98-
value.data(),
99-
NewStringType::kNormal,
100-
value.size())
101-
.ToLocalChecked())
102-
.Check();
95+
if (!ToV8Value(context, entry.first).ToLocal(&name) ||
96+
!ToV8Value(context, entry.second).ToLocal(&val) ||
97+
result->Set(context, name, val).IsNothing()) {
98+
return MaybeLocal<Object>();
99+
}
103100
}
104101

105-
return result;
102+
return scope.Escape(result);
106103
}
107104

108105
// Removes space characters (spaces, tabs and newlines) from

src/node_dotenv.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ class Dotenv {
2828
void ParseContent(const std::string_view content);
2929
ParseResult ParsePath(const std::string_view path);
3030
void AssignNodeOptionsIfAvailable(std::string* node_options) const;
31-
void SetEnvironment(Environment* env);
32-
v8::Local<v8::Object> ToObject(Environment* env) const;
31+
v8::Maybe<void> SetEnvironment(Environment* env);
32+
v8::MaybeLocal<v8::Object> ToObject(Environment* env) const;
3333

3434
static std::vector<env_file_data> GetDataFromArgs(
3535
const std::vector<std::string>& args);

src/node_process_methods.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,7 @@ static void LoadEnvFile(const v8::FunctionCallbackInfo<v8::Value>& args) {
511511

512512
switch (dotenv.ParsePath(path)) {
513513
case dotenv.ParseResult::Valid: {
514-
dotenv.SetEnvironment(env);
514+
USE(dotenv.SetEnvironment(env));
515515
break;
516516
}
517517
case dotenv.ParseResult::InvalidContent: {

src/node_util.cc

+4-1
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,10 @@ static void ParseEnv(const FunctionCallbackInfo<Value>& args) {
244244
Utf8Value content(env->isolate(), args[0]);
245245
Dotenv dotenv{};
246246
dotenv.ParseContent(content.ToStringView());
247-
args.GetReturnValue().Set(dotenv.ToObject(env));
247+
Local<Object> obj;
248+
if (dotenv.ToObject(env).ToLocal(&obj)) {
249+
args.GetReturnValue().Set(obj);
250+
}
248251
}
249252

250253
static void GetCallSites(const FunctionCallbackInfo<Value>& args) {

0 commit comments

Comments
 (0)