Skip to content

Commit be8e2b4

Browse files
jasnelltargos
authored andcommitted
src: improve error handling in permission.cc
PR-URL: #56904 Reviewed-By: Michaël Zasso <[email protected]> Reviewed-By: Yagiz Nizipli <[email protected]> Reviewed-By: Xuguang Mei <[email protected]>
1 parent d6cf091 commit be8e2b4

File tree

1 file changed

+21
-18
lines changed

1 file changed

+21
-18
lines changed

src/permission/permission.cc

+21-18
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ namespace node {
1717

1818
using v8::Context;
1919
using v8::FunctionCallbackInfo;
20+
using v8::IntegrityLevel;
2021
using v8::Local;
2122
using v8::MaybeLocal;
22-
using v8::NewStringType;
2323
using v8::Object;
2424
using v8::String;
2525
using v8::Value;
@@ -32,10 +32,9 @@ namespace {
3232
// permission.has('fs.in')
3333
static void Has(const FunctionCallbackInfo<Value>& args) {
3434
Environment* env = Environment::GetCurrent(args);
35-
v8::Isolate* isolate = env->isolate();
3635
CHECK(args[0]->IsString());
3736

38-
String::Utf8Value utf8_deny_scope(isolate, args[0]);
37+
String::Utf8Value utf8_deny_scope(env->isolate(), args[0]);
3938
if (*utf8_deny_scope == nullptr) {
4039
return;
4140
}
@@ -47,7 +46,7 @@ static void Has(const FunctionCallbackInfo<Value>& args) {
4746
}
4847

4948
if (args.Length() > 1 && !args[1]->IsUndefined()) {
50-
String::Utf8Value utf8_arg(isolate, args[1]);
49+
String::Utf8Value utf8_arg(env->isolate(), args[1]);
5150
if (*utf8_arg == nullptr) {
5251
return;
5352
}
@@ -111,14 +110,12 @@ MaybeLocal<Value> CreateAccessDeniedError(Environment* env,
111110
PermissionScope perm,
112111
const std::string_view& res) {
113112
Local<Object> err = ERR_ACCESS_DENIED(env->isolate());
114-
Local<String> perm_string;
115-
Local<String> resource_string;
116-
if (!String::NewFromUtf8(env->isolate(),
117-
Permission::PermissionToString(perm),
118-
NewStringType::kNormal)
113+
Local<Value> perm_string;
114+
Local<Value> resource_string;
115+
std::string_view perm_str = Permission::PermissionToString(perm);
116+
if (!ToV8Value(env->context(), perm_str, env->isolate())
119117
.ToLocal(&perm_string) ||
120-
!String::NewFromUtf8(
121-
env->isolate(), std::string(res).c_str(), NewStringType::kNormal)
118+
!ToV8Value(env->context(), res, env->isolate())
122119
.ToLocal(&resource_string) ||
123120
err->Set(env->context(), env->permission_string(), perm_string)
124121
.IsNothing() ||
@@ -132,18 +129,24 @@ MaybeLocal<Value> CreateAccessDeniedError(Environment* env,
132129
void Permission::ThrowAccessDenied(Environment* env,
133130
PermissionScope perm,
134131
const std::string_view& res) {
135-
MaybeLocal<Value> err = CreateAccessDeniedError(env, perm, res);
136-
if (err.IsEmpty()) return;
137-
env->isolate()->ThrowException(err.ToLocalChecked());
132+
Local<Value> err;
133+
if (CreateAccessDeniedError(env, perm, res).ToLocal(&err)) {
134+
env->isolate()->ThrowException(err);
135+
}
136+
// If ToLocal returned false, then v8 will have scheduled a
137+
// superseding error to be thrown.
138138
}
139139

140140
void Permission::AsyncThrowAccessDenied(Environment* env,
141141
fs::FSReqBase* req_wrap,
142142
PermissionScope perm,
143143
const std::string_view& res) {
144-
MaybeLocal<Value> err = CreateAccessDeniedError(env, perm, res);
145-
if (err.IsEmpty()) return;
146-
return req_wrap->Reject(err.ToLocalChecked());
144+
Local<Value> err;
145+
if (CreateAccessDeniedError(env, perm, res).ToLocal(&err)) {
146+
return req_wrap->Reject(err);
147+
}
148+
// If ToLocal returned false, then v8 will have scheduled a
149+
// superseding error to be thrown.
147150
}
148151

149152
void Permission::EnablePermissions() {
@@ -167,7 +170,7 @@ void Initialize(Local<Object> target,
167170
void* priv) {
168171
SetMethodNoSideEffect(context, target, "has", Has);
169172

170-
target->SetIntegrityLevel(context, v8::IntegrityLevel::kFrozen).FromJust();
173+
target->SetIntegrityLevel(context, IntegrityLevel::kFrozen).FromJust();
171174
}
172175

173176
void RegisterExternalReferences(ExternalReferenceRegistry* registry) {

0 commit comments

Comments
 (0)