From c623ad08be75576cab889d6d8690231fe8fc33ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Fri, 3 Nov 2017 13:03:11 +0800 Subject: [PATCH 1/2] fs: fix stat dev unsigned cast overflow The `dev_t` is unsigned on Linux, use Integer::NewFromUnsigned to fix cast overflow Fixes: https://github.com/nodejs/node/issues/16496 --- src/node_file.cc | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/node_file.cc b/src/node_file.cc index af3ebdb1214816..2eacc4dbcae2ab 100644 --- a/src/node_file.cc +++ b/src/node_file.cc @@ -453,14 +453,6 @@ Local BuildStatsObject(Environment* env, const uv_stat_t* s) { # else Local blksize = Undefined(env->isolate()); # endif -#undef X - - // Integers. -#define X(name) \ - Local name = Integer::New(env->isolate(), s->st_##name); \ - if (name.IsEmpty()) \ - return Local(); \ - X(dev) X(mode) X(nlink) From 4a88989661d75a127627ed52904bf4d6035f4382 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Fri, 3 Nov 2017 13:29:31 +0800 Subject: [PATCH 2/2] fs: use Number::New since all fields are uint64_t --- src/node_file.cc | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/src/node_file.cc b/src/node_file.cc index 2eacc4dbcae2ab..255a7da4f36aa0 100644 --- a/src/node_file.cc +++ b/src/node_file.cc @@ -438,39 +438,26 @@ Local BuildStatsObject(Environment* env, const uv_stat_t* s) { // We need to check the return value of Number::New() and Date::New() // and make sure that we bail out when V8 returns an empty handle. - // Unsigned integers. It does not actually seem to be specified whether - // uid and gid are unsigned or not, but in practice they are unsigned, - // and Node’s (F)Chown functions do check their arguments for unsignedness. + // Numbers. #define X(name) \ - Local name = Integer::NewFromUnsigned(env->isolate(), s->st_##name); \ + Local name = Number::New(env->isolate(), \ + static_cast(s->st_##name)); \ if (name.IsEmpty()) \ return Local(); \ X(uid) X(gid) -# if defined(__POSIX__) - X(blksize) -# else - Local blksize = Undefined(env->isolate()); -# endif + X(ino) + X(size) X(dev) X(mode) X(nlink) X(rdev) -#undef X - - // Numbers. -#define X(name) \ - Local name = Number::New(env->isolate(), \ - static_cast(s->st_##name)); \ - if (name.IsEmpty()) \ - return Local(); \ - - X(ino) - X(size) # if defined(__POSIX__) + X(blksize) X(blocks) # else + Local blksize = Undefined(env->isolate()); Local blocks = Undefined(env->isolate()); # endif #undef X