From ed806385bfd6d7d0e7e31b49586a78dd33d82d37 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Tue, 23 Jul 2013 13:28:14 +0200 Subject: [PATCH] fs: uids and gids must be unsigned ints Before this commit, fs.chown() and fs.fchown() coerced the uid and gid arguments to signed integers which is wrong because uid_t and gid_t are unsigned on most all platforms and IDs that don't fit in a signed integer do exist. This commit changes the aforementioned functions to take unsigned ints instead. No test because we can't assume the system has [GU]IDs that large. This change depends on joyent/libuv@d779eb5. Fixes #5890. --- src/node_file.cc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/node_file.cc b/src/node_file.cc index c4441bd1255..589ecdf7c95 100644 --- a/src/node_file.cc +++ b/src/node_file.cc @@ -826,12 +826,12 @@ static Handle Chown(const Arguments& args) { if (len < 2) return TYPE_ERROR("uid required"); if (len < 3) return TYPE_ERROR("gid required"); if (!args[0]->IsString()) return TYPE_ERROR("path must be a string"); - if (!args[1]->IsInt32()) return TYPE_ERROR("uid must be an int"); - if (!args[2]->IsInt32()) return TYPE_ERROR("gid must be an int"); + if (!args[1]->IsUint32()) return TYPE_ERROR("uid must be an unsigned int"); + if (!args[2]->IsUint32()) return TYPE_ERROR("gid must be an unsigned int"); String::Utf8Value path(args[0]); - int uid = static_cast(args[1]->Int32Value()); - int gid = static_cast(args[2]->Int32Value()); + uv_uid_t uid = static_cast(args[1]->Uint32Value()); + uv_gid_t gid = static_cast(args[2]->Uint32Value()); if (args[3]->IsFunction()) { ASYNC_CALL(chown, args[3], *path, uid, gid); @@ -853,12 +853,12 @@ static Handle FChown(const Arguments& args) { if (len < 2) return TYPE_ERROR("uid required"); if (len < 3) return TYPE_ERROR("gid required"); if (!args[0]->IsInt32()) return TYPE_ERROR("fd must be an int"); - if (!args[1]->IsInt32()) return TYPE_ERROR("uid must be an int"); - if (!args[2]->IsInt32()) return TYPE_ERROR("gid must be an int"); + if (!args[1]->IsUint32()) return TYPE_ERROR("uid must be an unsigned int"); + if (!args[2]->IsUint32()) return TYPE_ERROR("gid must be an unsigned int"); int fd = args[0]->Int32Value(); - int uid = static_cast(args[1]->Int32Value()); - int gid = static_cast(args[2]->Int32Value()); + uv_uid_t uid = static_cast(args[1]->Uint32Value()); + uv_gid_t gid = static_cast(args[2]->Uint32Value()); if (args[3]->IsFunction()) { ASYNC_CALL(fchown, args[3], fd, uid, gid);