From 9298861fa30f646801c14ee34af3075a87675f33 Mon Sep 17 00:00:00 2001 From: rubikscraft Date: Fri, 17 Jun 2022 12:56:13 +0200 Subject: [PATCH] Fix CVE-2022-21211 --- src/posix.cc | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/posix.cc b/src/posix.cc index 036fa6f..373ee5d 100644 --- a/src/posix.cc +++ b/src/posix.cc @@ -43,7 +43,7 @@ NAN_METHOD(node_getpgid) { return Nan::ThrowTypeError("getpgid: first argument must be an integer"); } - const pid_t pid = Nan::To(info[0]).ToLocalChecked()->Value(); + const pid_t pid = Nan::To(info[0]).FromMaybe(0); // on some platforms pid_t is defined as long hence the static_cast info.GetReturnValue().Set(Nan::New(static_cast(getpgid(pid)))); } @@ -63,7 +63,7 @@ NAN_METHOD(node_setpgid) { return Nan::ThrowTypeError("setpgid: first argument must be an integer"); } - if (setpgid(Nan::To(info[0]).ToLocalChecked()->Value(), Nan::To(info[1]).ToLocalChecked()->Value()) < 0) { + if (setpgid(Nan::To(info[0]).FromMaybe(0), Nan::To(info[1]).FromMaybe(0)) < 0) { return Nan::ThrowError(Nan::ErrnoException(errno, "setpgid", "")); } @@ -227,26 +227,26 @@ NAN_METHOD(node_setrlimit) { return Nan::ThrowError("setrlimit: unknown resource name"); } - Local limit_in = Nan::To(info[1]).ToLocalChecked(); // Cast + Local limit_in = Nan::To(info[1]).FromMaybe(Nan::New()); // Cast Local soft_key = Nan::New("soft").ToLocalChecked(); Local hard_key = Nan::New("hard").ToLocalChecked(); struct rlimit limit; bool get_soft = false, get_hard = false; - if (Nan::Has(limit_in, soft_key).ToChecked()) { - if (Nan::Get(limit_in, soft_key).ToLocalChecked()->IsNull()) { + if (Nan::Has(limit_in, soft_key).FromMaybe(false)) { + if (Nan::Get(limit_in, soft_key).FromMaybe(Nan::Null())->IsNull()) { limit.rlim_cur = RLIM_INFINITY; } else { - limit.rlim_cur = Nan::To(Nan::Get(limit_in, soft_key).ToLocalChecked()).ToLocalChecked()->Value(); + limit.rlim_cur = Nan::To(Nan::Get(limit_in, soft_key).FromMaybe(Nan::Null())).FromMaybe(0); } } else { get_soft = true; } - if (Nan::Has(limit_in, hard_key).ToChecked()) { - if (Nan::Get(limit_in, hard_key).ToLocalChecked()->IsNull()) { + if (Nan::Has(limit_in, hard_key).FromMaybe(false)) { + if (Nan::Get(limit_in, hard_key).FromMaybe(Nan::Null())->IsNull()) { limit.rlim_max = RLIM_INFINITY; } else { - limit.rlim_max = Nan::To(Nan::Get(limit_in, hard_key).ToLocalChecked()).ToLocalChecked()->Value(); + limit.rlim_max = Nan::To(Nan::Get(limit_in, hard_key).FromMaybe(Nan::Null())).FromMaybe(0); } } else { get_hard = true; @@ -280,7 +280,7 @@ NAN_METHOD(node_getpwnam) { errno = 0; // reset errno before the call if (info[0]->IsNumber()) { - pwd = getpwuid(Nan::To(info[0]).ToLocalChecked()->Value()); + pwd = getpwuid(Nan::To(info[0]).FromMaybe(0)); if (errno) { return Nan::ThrowError(Nan::ErrnoException(errno, "getpwuid", "")); } @@ -325,7 +325,7 @@ NAN_METHOD(node_getgrnam) { errno = 0; // reset errno before the call if (info[0]->IsNumber()) { - grp = getgrgid(Nan::To(info[0]).ToLocalChecked()->Value()); + grp = getgrgid(Nan::To(info[0]).FromMaybe(0)); if (errno) { return Nan::ThrowError(Nan::ErrnoException(errno, "getgrgid", "")); } @@ -371,7 +371,7 @@ NAN_METHOD(node_initgroups) { } Nan::Utf8String unam(info[0]); - if (initgroups(*unam, Nan::To(info[1]).ToLocalChecked()->Value())) { + if (initgroups(*unam, Nan::To(info[1]).FromMaybe(0))) { return Nan::ThrowError(Nan::ErrnoException(errno, "initgroups", "")); } @@ -385,7 +385,7 @@ NAN_METHOD(node_seteuid) { return Nan::ThrowError("seteuid: requires exactly 1 argument"); } - if (seteuid(Nan::To(info[0]).ToLocalChecked()->Value())) { + if (seteuid(Nan::To(info[0]).FromMaybe(0))) { return Nan::ThrowError(Nan::ErrnoException(errno, "seteuid", "")); } @@ -399,7 +399,7 @@ NAN_METHOD(node_setegid) { return Nan::ThrowError("setegid: requires exactly 1 argument"); } - if (setegid(Nan::To(info[0]).ToLocalChecked()->Value())) { + if (setegid(Nan::To(info[0]).FromMaybe(0))) { return Nan::ThrowError(Nan::ErrnoException(errno, "setegid", "")); } @@ -413,7 +413,7 @@ NAN_METHOD(node_setregid) { return Nan::ThrowError("setregid: requires exactly 2 arguments"); } - if (setregid(Nan::To(info[0]).ToLocalChecked()->Value(), Nan::To(info[1]).ToLocalChecked()->Value())) { + if (setregid(Nan::To(info[0]).FromMaybe(0), Nan::To(info[1]).FromMaybe(0))) { return Nan::ThrowError(Nan::ErrnoException(errno, "setregid", "")); } @@ -427,7 +427,7 @@ NAN_METHOD(node_setreuid) { return Nan::ThrowError("setreuid: requires exactly 2 arguments"); } - if (setreuid(Nan::To(info[0]).ToLocalChecked()->Value(), Nan::To(info[1]).ToLocalChecked()->Value())) { + if (setreuid(Nan::To(info[0]).FromMaybe(0), Nan::To(info[1]).FromMaybe(0))) { return Nan::ThrowError(Nan::ErrnoException(errno, "setreuid", "")); } @@ -453,7 +453,7 @@ NAN_METHOD(node_openlog) { return Nan::ThrowError("openlog: invalid argument values"); } // note: openlog does not ever fail, no return value - openlog(syslog_ident, Nan::To(info[1]).ToLocalChecked()->Value(), Nan::To(info[2]).ToLocalChecked()->Value()); + openlog(syslog_ident, Nan::To(info[1]).FromMaybe(0), Nan::To(info[2]).FromMaybe(0)); info.GetReturnValue().Set(Nan::Undefined()); } @@ -480,7 +480,7 @@ NAN_METHOD(node_syslog) { Nan::Utf8String message(info[1]); // note: syslog does not ever fail, no return value - syslog(Nan::To(info[0]).ToLocalChecked()->Value(), "%s", *message); + syslog(Nan::To(info[0]).FromMaybe(0), "%s", *message); info.GetReturnValue().Set(Nan::Undefined()); } @@ -492,7 +492,7 @@ NAN_METHOD(node_setlogmask) { return Nan::ThrowError("setlogmask: takes exactly 1 argument"); } - info.GetReturnValue().Set(Nan::New(setlogmask(Nan::To(info[0]).ToLocalChecked()->Value()))); + info.GetReturnValue().Set(Nan::New(setlogmask(Nan::To(info[0]).FromMaybe(0)))); } #define ADD_MASK_FLAG(name, flag) \ @@ -510,7 +510,7 @@ NAN_METHOD(node_update_syslog_constants) { return Nan::ThrowTypeError("update_syslog_constants: argument must be an object"); } - Local obj = Nan::To(info[0]).ToLocalChecked(); + Local obj = Nan::To(info[0]).FromMaybe(Nan::New()); ADD_MASK_FLAG("emerg", LOG_EMERG); ADD_MASK_FLAG("alert", LOG_ALERT); ADD_MASK_FLAG("crit", LOG_CRIT); @@ -617,7 +617,7 @@ NAN_METHOD(node_swapon) { Nan::Utf8String str(info[0]); - int rc = swapon(*str, Nan::To(info[1]).ToLocalChecked()->Value()); + int rc = swapon(*str, Nan::To(info[1]).FromMaybe(0)); if (rc != 0) { return Nan::ThrowError(Nan::ErrnoException(errno, "swapon", "")); } @@ -657,7 +657,7 @@ NAN_METHOD(node_update_swap_constants) { return Nan::ThrowTypeError("update_syslog_constants: argument must be an object"); } - Local obj = Nan::To(info[0]).ToLocalChecked(); + Local obj = Nan::To(info[0]).FromMaybe(Nan::New()); Nan::Set(obj, Nan::New("prefer").ToLocalChecked(), Nan::New(SWAP_FLAG_PREFER)); #ifdef SWAP_FLAG_DISCARD Nan::Set(obj, Nan::New("discard").ToLocalChecked(), Nan::New(SWAP_FLAG_DISCARD)); @@ -672,7 +672,7 @@ NAN_METHOD(node_update_swap_constants) { Nan::GetFunction(Nan::New(symbol)).ToLocalChecked() \ ) -void init(Local exports) { +void init(Local exports, Local val, void* data) { EXPORT("getppid", node_getppid); EXPORT("getpgid", node_getpgid); EXPORT("setpgid", node_setpgid);