Skip to content

Commit

Permalink
fs: uids and gids must be unsigned ints
Browse files Browse the repository at this point in the history
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 nodejs#5890.
  • Loading branch information
bnoordhuis committed Jul 23, 2013
1 parent 14f45ba commit ed80638
Showing 1 changed file with 8 additions and 8 deletions.
16 changes: 8 additions & 8 deletions src/node_file.cc
Original file line number Diff line number Diff line change
Expand Up @@ -826,12 +826,12 @@ static Handle<Value> 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<int>(args[1]->Int32Value());
int gid = static_cast<int>(args[2]->Int32Value());
uv_uid_t uid = static_cast<uv_uid_t>(args[1]->Uint32Value());
uv_gid_t gid = static_cast<uv_gid_t>(args[2]->Uint32Value());

if (args[3]->IsFunction()) {
ASYNC_CALL(chown, args[3], *path, uid, gid);
Expand All @@ -853,12 +853,12 @@ static Handle<Value> 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<int>(args[1]->Int32Value());
int gid = static_cast<int>(args[2]->Int32Value());
uv_uid_t uid = static_cast<uv_uid_t>(args[1]->Uint32Value());
uv_gid_t gid = static_cast<uv_gid_t>(args[2]->Uint32Value());

if (args[3]->IsFunction()) {
ASYNC_CALL(fchown, args[3], fd, uid, gid);
Expand Down

0 comments on commit ed80638

Please sign in to comment.