Browse Source

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.
v0.10.14-release
Ben Noordhuis 11 years ago
parent
commit
ed806385bf
  1. 16
      src/node_file.cc

16
src/node_file.cc

@ -826,12 +826,12 @@ static Handle<Value> Chown(const Arguments& args) {
if (len < 2) return TYPE_ERROR("uid required"); if (len < 2) return TYPE_ERROR("uid required");
if (len < 3) return TYPE_ERROR("gid required"); if (len < 3) return TYPE_ERROR("gid required");
if (!args[0]->IsString()) return TYPE_ERROR("path must be a string"); 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[1]->IsUint32()) return TYPE_ERROR("uid must be an unsigned int");
if (!args[2]->IsInt32()) return TYPE_ERROR("gid must be an int"); if (!args[2]->IsUint32()) return TYPE_ERROR("gid must be an unsigned int");
String::Utf8Value path(args[0]); String::Utf8Value path(args[0]);
int uid = static_cast<int>(args[1]->Int32Value()); uv_uid_t uid = static_cast<uv_uid_t>(args[1]->Uint32Value());
int gid = static_cast<int>(args[2]->Int32Value()); uv_gid_t gid = static_cast<uv_gid_t>(args[2]->Uint32Value());
if (args[3]->IsFunction()) { if (args[3]->IsFunction()) {
ASYNC_CALL(chown, args[3], *path, uid, gid); ASYNC_CALL(chown, args[3], *path, uid, gid);
@ -853,12 +853,12 @@ static Handle<Value> FChown(const Arguments& args) {
if (len < 2) return TYPE_ERROR("uid required"); if (len < 2) return TYPE_ERROR("uid required");
if (len < 3) return TYPE_ERROR("gid required"); if (len < 3) return TYPE_ERROR("gid required");
if (!args[0]->IsInt32()) return TYPE_ERROR("fd must be an int"); 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[1]->IsUint32()) return TYPE_ERROR("uid must be an unsigned int");
if (!args[2]->IsInt32()) return TYPE_ERROR("gid must be an int"); if (!args[2]->IsUint32()) return TYPE_ERROR("gid must be an unsigned int");
int fd = args[0]->Int32Value(); int fd = args[0]->Int32Value();
int uid = static_cast<int>(args[1]->Int32Value()); uv_uid_t uid = static_cast<uv_uid_t>(args[1]->Uint32Value());
int gid = static_cast<int>(args[2]->Int32Value()); uv_gid_t gid = static_cast<uv_gid_t>(args[2]->Uint32Value());
if (args[3]->IsFunction()) { if (args[3]->IsFunction()) {
ASYNC_CALL(fchown, args[3], fd, uid, gid); ASYNC_CALL(fchown, args[3], fd, uid, gid);

Loading…
Cancel
Save