Skip to content

Commit 6417dc8

Browse files
addaleaxRafaelGSS
authored andcommitted
src: bring permissions macros in line with general C/C++ standards
Specifically, avoid the hazard of unintentionally evaluating an argument multiple times during macro expansion, and do not assume the available of particular namespaces in the current scope. PR-URL: #60053 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com>
1 parent 04d568e commit 6417dc8

File tree

2 files changed

+45
-7
lines changed

2 files changed

+45
-7
lines changed

src/node_report.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -859,7 +859,7 @@ std::string TriggerNodeReport(Isolate* isolate,
859859
THROW_IF_INSUFFICIENT_PERMISSIONS(
860860
env,
861861
permission::PermissionScope::kFileSystemWrite,
862-
std::string_view(Environment::GetCwd(env->exec_path())),
862+
Environment::GetCwd(env->exec_path()),
863863
filename);
864864
}
865865
}

src/permission/permission.h

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,25 +27,63 @@ class FSReqBase;
2727

2828
namespace permission {
2929

30-
#define THROW_IF_INSUFFICIENT_PERMISSIONS(env, perm_, resource_, ...) \
30+
#define THROW_IF_INSUFFICIENT_PERMISSIONS(env, perm, resource, ...) \
3131
do { \
32-
if (!env->permission()->is_granted(env, perm_, resource_)) [[unlikely]] { \
32+
node::Environment* env__ = (env); \
33+
const node::permission::PermissionScope perm__ = (perm); \
34+
const auto resource__ = (resource); \
35+
if (!env__->permission()->is_granted(env__, perm__, resource__)) \
36+
[[unlikely]] { \
3337
node::permission::Permission::ThrowAccessDenied( \
34-
(env), perm_, resource_); \
38+
env__, perm__, resource__); \
3539
return __VA_ARGS__; \
3640
} \
3741
} while (0)
3842

3943
#define ASYNC_THROW_IF_INSUFFICIENT_PERMISSIONS( \
40-
env, wrap, perm_, resource_, ...) \
44+
env, wrap, perm, resource, ...) \
4145
do { \
42-
if (!env->permission()->is_granted(env, perm_, resource_)) [[unlikely]] { \
46+
node::Environment* env__ = (env); \
47+
const node::permission::PermissionScope perm__ = (perm); \
48+
const auto resource__ = (resource); \
49+
if (!env__->permission()->is_granted(env__, perm__, resource__)) \
50+
[[unlikely]] { \
4351
node::permission::Permission::AsyncThrowAccessDenied( \
44-
(env), wrap, perm_, resource_); \
52+
env__, (wrap), perm__, resource__); \
4553
return __VA_ARGS__; \
4654
} \
4755
} while (0)
4856

57+
#define ERR_ACCESS_DENIED_IF_INSUFFICIENT_PERMISSIONS( \
58+
env, perm, resource, args, ...) \
59+
do { \
60+
node::Environment* env__ = (env); \
61+
const node::permission::PermissionScope perm__ = (perm); \
62+
const auto resource__ = (resource); \
63+
if (!env__->permission()->is_granted(env__, perm__, resource__)) \
64+
[[unlikely]] { \
65+
Local<Value> err_access; \
66+
if (node::permission::CreateAccessDeniedError(env__, perm__, resource__) \
67+
.ToLocal(&err_access)) { \
68+
args.GetReturnValue().Set(err_access); \
69+
} else { \
70+
args.GetReturnValue().Set(UV_EACCES); \
71+
} \
72+
return __VA_ARGS__; \
73+
} \
74+
} while (0)
75+
76+
#define SET_INSUFFICIENT_PERMISSION_ERROR_CALLBACK(scope) \
77+
void InsufficientPermissionError(std::string_view resource) { \
78+
v8::HandleScope handle_scope(env()->isolate()); \
79+
v8::Context::Scope context_scope(env()->context()); \
80+
v8::Local<v8::Value> arg; \
81+
if (!permission::CreateAccessDeniedError(env(), (scope), resource) \
82+
.ToLocal(&arg)) { \
83+
} \
84+
MakeCallback(env()->oncomplete_string(), 1, &arg); \
85+
}
86+
4987
class Permission {
5088
public:
5189
Permission();

0 commit comments

Comments
 (0)