diff --git a/src/node_file.cc b/src/node_file.cc index 9636e42a9d556d..d7d9f7f63ff179 100644 --- a/src/node_file.cc +++ b/src/node_file.cc @@ -3074,11 +3074,15 @@ static void Mkdtemp(const FunctionCallbackInfo& args) { if (argc > 2) { // mkdtemp(tmpl, encoding, req) FSReqBase* req_wrap_async = GetReqWrap(args, 2); - ASYNC_THROW_IF_INSUFFICIENT_PERMISSIONS( - env, - req_wrap_async, - permission::PermissionScope::kFileSystemWrite, - tmpl.ToStringView()); + if (!env->permission()->is_granted( + env, permission::PermissionScope::kFileSystemWrite, + tmpl.ToStringView())) { + permission::Permission::AsyncThrowAccessDenied( + env, req_wrap_async, permission::PermissionScope::kFileSystemWrite, + tmpl.ToStringView()); + req_wrap_async->SetReturnValue(args); + return; + } FS_ASYNC_TRACE_BEGIN1( UV_FS_MKDTEMP, req_wrap_async, "path", TRACE_STR_COPY(*tmpl)) AsyncCall(env, req_wrap_async, args, "mkdtemp", encoding, AfterStringPath, diff --git a/test/parallel/test-permission-fs-promises-mkdtemp.js b/test/parallel/test-permission-fs-promises-mkdtemp.js new file mode 100644 index 00000000000000..a20e747b86f982 --- /dev/null +++ b/test/parallel/test-permission-fs-promises-mkdtemp.js @@ -0,0 +1,19 @@ +// Flags: --permission --allow-fs-read=* +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const fs = require('fs'); + +// This test verifies that fs.promises.mkdtemp() returns a proper rejected promise +// when permissions are denied, instead of throwing a TypeError +{ + // Test with simple string path (reproduces the exact issue from GitHub) + assert.rejects( + fs.promises.mkdtemp('test'), + { + code: 'ERR_ACCESS_DENIED', + permission: 'FileSystemWrite', + } + ).then(common.mustCall()); +} \ No newline at end of file