Skip to content

Commit 342c324

Browse files
committedOct 2, 2024
src: handle errors correctly in permission.cc
Return an empty `MaybeLocal` to indicate that an exception is pending. PR-URL: #54541 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Mohammed Keyvanzadeh <mohammadkeyvanzade94@gmail.com>
1 parent 90ff714 commit 342c324

File tree

1 file changed

+24
-25
lines changed

1 file changed

+24
-25
lines changed
 

‎src/permission/permission.cc

+24-25
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ namespace node {
1818
using v8::Context;
1919
using v8::FunctionCallbackInfo;
2020
using v8::Local;
21+
using v8::MaybeLocal;
22+
using v8::NewStringType;
2123
using v8::Object;
2224
using v8::String;
2325
using v8::Value;
@@ -105,46 +107,43 @@ Permission::Permission() : enabled_(false) {
105107
#undef V
106108
}
107109

108-
Local<Value> CreateAccessDeniedError(Environment* env,
109-
PermissionScope perm,
110-
const std::string_view& res) {
111-
Local<Value> err = ERR_ACCESS_DENIED(env->isolate());
112-
CHECK(err->IsObject());
113-
if (err.As<Object>()
114-
->Set(env->context(),
115-
env->permission_string(),
116-
v8::String::NewFromUtf8(env->isolate(),
117-
Permission::PermissionToString(perm),
118-
v8::NewStringType::kNormal)
119-
.ToLocalChecked())
110+
MaybeLocal<Value> CreateAccessDeniedError(Environment* env,
111+
PermissionScope perm,
112+
const std::string_view& res) {
113+
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)
119+
.ToLocal(&perm_string) ||
120+
!String::NewFromUtf8(
121+
env->isolate(), std::string(res).c_str(), NewStringType::kNormal)
122+
.ToLocal(&resource_string) ||
123+
err->Set(env->context(), env->permission_string(), perm_string)
120124
.IsNothing() ||
121-
err.As<Object>()
122-
->Set(env->context(),
123-
env->resource_string(),
124-
v8::String::NewFromUtf8(env->isolate(),
125-
std::string(res).c_str(),
126-
v8::NewStringType::kNormal)
127-
.ToLocalChecked())
128-
.IsNothing())
129-
return Local<Value>();
125+
err->Set(env->context(), env->resource_string(), resource_string)
126+
.IsNothing()) {
127+
return MaybeLocal<Value>();
128+
}
130129
return err;
131130
}
132131

133132
void Permission::ThrowAccessDenied(Environment* env,
134133
PermissionScope perm,
135134
const std::string_view& res) {
136-
Local<Value> err = CreateAccessDeniedError(env, perm, res);
135+
MaybeLocal<Value> err = CreateAccessDeniedError(env, perm, res);
137136
if (err.IsEmpty()) return;
138-
env->isolate()->ThrowException(err);
137+
env->isolate()->ThrowException(err.ToLocalChecked());
139138
}
140139

141140
void Permission::AsyncThrowAccessDenied(Environment* env,
142141
fs::FSReqBase* req_wrap,
143142
PermissionScope perm,
144143
const std::string_view& res) {
145-
Local<Value> err = CreateAccessDeniedError(env, perm, res);
144+
MaybeLocal<Value> err = CreateAccessDeniedError(env, perm, res);
146145
if (err.IsEmpty()) return;
147-
return req_wrap->Reject(err);
146+
return req_wrap->Reject(err.ToLocalChecked());
148147
}
149148

150149
void Permission::EnablePermissions() {

0 commit comments

Comments
 (0)
Please sign in to comment.