From 1650eaeac4d344a21f08923dc39ab09637f71ab8 Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Wed, 28 Feb 2018 01:45:17 +0800 Subject: [PATCH] fs: throw fchownSync errors in JS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/19041 Reviewed-By: Michaƫl Zasso Reviewed-By: James M Snell --- lib/fs.js | 4 +++- src/node_file.cc | 25 ++++++++++++++++--------- test/parallel/test-fs-error-messages.js | 21 +++++++++++++++++++++ 3 files changed, 40 insertions(+), 10 deletions(-) diff --git a/lib/fs.js b/lib/fs.js index 2cafcefc53d..0671a05ae00 100644 --- a/lib/fs.js +++ b/lib/fs.js @@ -1110,7 +1110,9 @@ fs.fchownSync = function(fd, uid, gid) { validateUint32(uid, 'uid'); validateUint32(gid, 'gid'); - return binding.fchown(fd, uid, gid); + const ctx = {}; + binding.fchown(fd, uid, gid, undefined, ctx); + handleErrorFromBinding(ctx); }; fs.chown = function(path, uid, gid, callback) { diff --git a/src/node_file.cc b/src/node_file.cc index 623da28e817..61b4ed95873 100644 --- a/src/node_file.cc +++ b/src/node_file.cc @@ -1552,20 +1552,27 @@ static void Chown(const FunctionCallbackInfo& args) { static void FChown(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); - CHECK(args[0]->IsInt32()); - CHECK(args[1]->IsUint32()); - CHECK(args[2]->IsUint32()); + const int argc = args.Length(); + CHECK_GE(argc, 3); - int fd = args[0]->Int32Value(); - uv_uid_t uid = static_cast(args[1]->Uint32Value()); - uv_gid_t gid = static_cast(args[2]->Uint32Value()); + CHECK(args[0]->IsInt32()); + const int fd = args[0].As()->Value(); + + CHECK(args[1]->IsUint32()); + const uv_uid_t uid = static_cast(args[1].As()->Value()); + + CHECK(args[2]->IsUint32()); + const uv_gid_t gid = static_cast(args[2].As()->Value()); FSReqBase* req_wrap = GetReqWrap(env, args[3]); - if (req_wrap != nullptr) { + if (req_wrap != nullptr) { // fchown(fd, uid, gid, req) AsyncCall(env, req_wrap, args, "fchown", UTF8, AfterNoArgs, uv_fs_fchown, fd, uid, gid); - } else { - SYNC_CALL(fchown, 0, fd, uid, gid); + } else { // fchown(fd, uid, gid, undefined, ctx) + CHECK_EQ(argc, 5); + fs_req_wrap req_wrap; + SyncCall(env, args[4], &req_wrap, "fchown", + uv_fs_fchown, fd, uid, gid); } } diff --git a/test/parallel/test-fs-error-messages.js b/test/parallel/test-fs-error-messages.js index d14a5b8effc..1aa4e122949 100644 --- a/test/parallel/test-fs-error-messages.js +++ b/test/parallel/test-fs-error-messages.js @@ -749,3 +749,24 @@ if (!common.isAIX) { ); }); } + +// fchown +if (!common.isWindows) { + const validateError = (err) => { + assert.strictEqual(err.message, 'EBADF: bad file descriptor, fchown'); + assert.strictEqual(err.errno, uv.UV_EBADF); + assert.strictEqual(err.code, 'EBADF'); + assert.strictEqual(err.syscall, 'fchown'); + return true; + }; + + common.runWithInvalidFD((fd) => { + fs.fchown(fd, process.getuid(), process.getgid(), + common.mustCall(validateError)); + + assert.throws( + () => fs.fchownSync(fd, process.getuid(), process.getgid()), + validateError + ); + }); +}