Skip to content

Commit 5d1adb8

Browse files
committed
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 <[email protected]> Reviewed-By: Rafael Gonzaga <[email protected]>
1 parent 3c36ad0 commit 5d1adb8

File tree

2 files changed

+24
-12
lines changed

2 files changed

+24
-12
lines changed

src/node_report.cc

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

src/permission/permission.h

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,31 +28,43 @@ class FSReqBase;
2828

2929
namespace permission {
3030

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

4044
#define ASYNC_THROW_IF_INSUFFICIENT_PERMISSIONS( \
41-
env, wrap, perm_, resource_, ...) \
45+
env, wrap, perm, resource, ...) \
4246
do { \
43-
if (!env->permission()->is_granted(env, perm_, resource_)) [[unlikely]] { \
47+
node::Environment* env__ = (env); \
48+
const node::permission::PermissionScope perm__ = (perm); \
49+
const auto resource__ = (resource); \
50+
if (!env__->permission()->is_granted(env__, perm__, resource__)) \
51+
[[unlikely]] { \
4452
node::permission::Permission::AsyncThrowAccessDenied( \
45-
(env), wrap, perm_, resource_); \
53+
env__, (wrap), perm__, resource__); \
4654
return __VA_ARGS__; \
4755
} \
4856
} while (0)
4957

5058
#define ERR_ACCESS_DENIED_IF_INSUFFICIENT_PERMISSIONS( \
51-
env, perm_, resource_, args, ...) \
59+
env, perm, resource, args, ...) \
5260
do { \
53-
if (!env->permission()->is_granted(env, perm_, resource_)) [[unlikely]] { \
61+
node::Environment* env__ = (env); \
62+
const node::permission::PermissionScope perm__ = (perm); \
63+
const auto resource__ = (resource); \
64+
if (!env__->permission()->is_granted(env__, perm__, resource__)) \
65+
[[unlikely]] { \
5466
Local<Value> err_access; \
55-
if (permission::CreateAccessDeniedError(env, perm_, resource_) \
67+
if (node::permission::CreateAccessDeniedError(env__, perm__, resource__) \
5668
.ToLocal(&err_access)) { \
5769
args.GetReturnValue().Set(err_access); \
5870
} else { \
@@ -63,11 +75,11 @@ namespace permission {
6375
} while (0)
6476

6577
#define SET_INSUFFICIENT_PERMISSION_ERROR_CALLBACK(scope) \
66-
void InsufficientPermissionError(const std::string resource) { \
78+
void InsufficientPermissionError(std::string_view resource) { \
6779
v8::HandleScope handle_scope(env()->isolate()); \
6880
v8::Context::Scope context_scope(env()->context()); \
6981
v8::Local<v8::Value> arg; \
70-
if (!permission::CreateAccessDeniedError(env(), scope, resource) \
82+
if (!permission::CreateAccessDeniedError(env(), (scope), resource) \
7183
.ToLocal(&arg)) { \
7284
} \
7385
MakeCallback(env()->oncomplete_string(), 1, &arg); \

0 commit comments

Comments
 (0)