Skip to content

Commit 118cbb7

Browse files
jasnelladuh95
authored andcommitted
src: improve error handling in buffer and dotenv
Replacing ToLocalChecked() PR-URL: #57189 Reviewed-By: Yagiz Nizipli <[email protected]> Reviewed-By: Robert Nagy <[email protected]>
1 parent 355e8eb commit 118cbb7

File tree

5 files changed

+65
-48
lines changed

5 files changed

+65
-48
lines changed

src/node_buffer.cc

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -571,9 +571,14 @@ void SlowCopy(const FunctionCallbackInfo<Value>& args) {
571571
ArrayBufferViewContents<char> source(args[0]);
572572
SPREAD_BUFFER_ARG(args[1].As<Object>(), target);
573573

574-
const auto target_start = args[2]->Uint32Value(env->context()).ToChecked();
575-
const auto source_start = args[3]->Uint32Value(env->context()).ToChecked();
576-
const auto to_copy = args[4]->Uint32Value(env->context()).ToChecked();
574+
uint32_t target_start;
575+
uint32_t source_start;
576+
uint32_t to_copy;
577+
if (!args[2]->Uint32Value(env->context()).To(&target_start) ||
578+
!args[3]->Uint32Value(env->context()).To(&source_start) ||
579+
!args[4]->Uint32Value(env->context()).To(&to_copy)) {
580+
return;
581+
}
577582

578583
memmove(target_data + target_start, source.data() + source_start, to_copy);
579584
args.GetReturnValue().Set(to_copy);
@@ -638,7 +643,9 @@ void Fill(const FunctionCallbackInfo<Value>& args) {
638643
return;
639644
}
640645

641-
str_obj = args[1]->ToString(env->context()).ToLocalChecked();
646+
if (!args[1]->ToString(env->context()).ToLocal(&str_obj)) {
647+
return;
648+
}
642649
enc = ParseEncoding(env->isolate(), args[4], UTF8);
643650

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

702709
THROW_AND_RETURN_IF_NOT_STRING(env, args[0], "argument");
703710

704-
Local<String> str = args[0]->ToString(env->context()).ToLocalChecked();
711+
Local<String> str;
712+
if (!args[0]->ToString(env->context()).ToLocal(&str)) {
713+
return;
714+
}
705715

706716
size_t offset = 0;
707717
size_t max_length = 0;
@@ -1241,10 +1251,12 @@ void GetZeroFillToggle(const FunctionCallbackInfo<Value>& args) {
12411251
ab = ArrayBuffer::New(env->isolate(), std::move(backing));
12421252
}
12431253

1244-
ab->SetPrivate(
1245-
env->context(),
1246-
env->untransferable_object_private_symbol(),
1247-
True(env->isolate())).Check();
1254+
if (ab->SetPrivate(env->context(),
1255+
env->untransferable_object_private_symbol(),
1256+
True(env->isolate()))
1257+
.IsNothing()) {
1258+
return;
1259+
}
12481260

12491261
args.GetReturnValue().Set(Uint32Array::New(ab, 0, 1));
12501262
}
@@ -1255,7 +1267,9 @@ void DetachArrayBuffer(const FunctionCallbackInfo<Value>& args) {
12551267
Local<ArrayBuffer> buf = args[0].As<ArrayBuffer>();
12561268
if (buf->IsDetachable()) {
12571269
std::shared_ptr<BackingStore> store = buf->GetBackingStore();
1258-
buf->Detach(Local<Value>()).Check();
1270+
if (buf->Detach(Local<Value>()).IsNothing()) {
1271+
return;
1272+
}
12591273
args.GetReturnValue().Set(ArrayBuffer::New(env->isolate(), store));
12601274
}
12611275
}
@@ -1464,7 +1478,10 @@ void SlowWriteString(const FunctionCallbackInfo<Value>& args) {
14641478

14651479
THROW_AND_RETURN_IF_NOT_STRING(env, args[1], "argument");
14661480

1467-
Local<String> str = args[1]->ToString(env->context()).ToLocalChecked();
1481+
Local<String> str;
1482+
if (!args[1]->ToString(env->context()).ToLocal(&str)) {
1483+
return;
1484+
}
14681485

14691486
size_t offset = 0;
14701487
size_t max_length = 0;

src/node_dotenv.cc

Lines changed: 30 additions & 33 deletions
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

Lines changed: 2 additions & 2 deletions
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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@ static void LoadEnvFile(const v8::FunctionCallbackInfo<v8::Value>& args) {
487487

488488
switch (dotenv.ParsePath(path)) {
489489
case dotenv.ParseResult::Valid: {
490-
dotenv.SetEnvironment(env);
490+
USE(dotenv.SetEnvironment(env));
491491
break;
492492
}
493493
case dotenv.ParseResult::InvalidContent: {

src/node_util.cc

Lines changed: 4 additions & 1 deletion
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)