diff options
author | Trevor Norris <trev.norris@gmail.com> | 2016-04-13 13:16:42 -0600 |
---|---|---|
committer | Trevor Norris <trev.norris@gmail.com> | 2016-05-24 14:40:22 -0600 |
commit | c0e6c668e6e6f0ba6a924a5b83ff1ca5434d14ad (patch) | |
tree | 2f24e1329abb6b5432273246b4754ec44e7b3e8a /src/udp_wrap.cc | |
parent | 13e5d4f32014e3426142580a699d0ffdf02db26a (diff) | |
download | node-new-c0e6c668e6e6f0ba6a924a5b83ff1ca5434d14ad.tar.gz |
src: no abort from getter if object isn't wrapped
v8::Object::GetAlignedPointerFromInternalField() returns a random value
if Wrap() hasn't been run on the object handle. Causing v8 to abort if
certain getters are accessed. It's possible to access these getters and
functions during class construction through the AsyncWrap init()
callback, and also possible in a subset of those scenarios while running
the persistent handle visitor.
Mitigate this issue by manually setting the internal aligned pointer
field to nullptr in the BaseObject constructor and add necessary logic
to return appropriate values when nullptr is encountered.
PR-URL: https://github.com/nodejs/node/pull/6184
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Diffstat (limited to 'src/udp_wrap.cc')
-rw-r--r-- | src/udp_wrap.cc | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/src/udp_wrap.cc b/src/udp_wrap.cc index 8c5090ddf7..be141a672c 100644 --- a/src/udp_wrap.cc +++ b/src/udp_wrap.cc @@ -139,7 +139,7 @@ void UDPWrap::New(const FunctionCallbackInfo<Value>& args) { void UDPWrap::GetFD(Local<String>, const PropertyCallbackInfo<Value>& args) { - int fd = -1; + int fd = UV_EBADF; #if !defined(_WIN32) HandleScope scope(args.GetIsolate()); UDPWrap* wrap = Unwrap<UDPWrap>(args.Holder()); @@ -151,7 +151,10 @@ void UDPWrap::GetFD(Local<String>, const PropertyCallbackInfo<Value>& args) { void UDPWrap::DoBind(const FunctionCallbackInfo<Value>& args, int family) { - UDPWrap* wrap = Unwrap<UDPWrap>(args.Holder()); + UDPWrap* wrap; + ASSIGN_OR_RETURN_UNWRAP(&wrap, + args.Holder(), + args.GetReturnValue().Set(UV_EBADF)); // bind(ip, port, flags) CHECK_EQ(args.Length(), 3); @@ -199,7 +202,7 @@ void UDPWrap::Bind6(const FunctionCallbackInfo<Value>& args) { UDPWrap* wrap = Unwrap<UDPWrap>(args.Holder()); \ CHECK_EQ(args.Length(), 1); \ int flag = args[0]->Int32Value(); \ - int err = fn(&wrap->handle_, flag); \ + int err = wrap == nullptr ? UV_EBADF : fn(&wrap->handle_, flag); \ args.GetReturnValue().Set(err); \ } @@ -213,7 +216,10 @@ X(SetMulticastLoopback, uv_udp_set_multicast_loop) void UDPWrap::SetMembership(const FunctionCallbackInfo<Value>& args, uv_membership membership) { - UDPWrap* wrap = Unwrap<UDPWrap>(args.Holder()); + UDPWrap* wrap; + ASSIGN_OR_RETURN_UNWRAP(&wrap, + args.Holder(), + args.GetReturnValue().Set(UV_EBADF)); CHECK_EQ(args.Length(), 2); @@ -246,7 +252,10 @@ void UDPWrap::DropMembership(const FunctionCallbackInfo<Value>& args) { void UDPWrap::DoSend(const FunctionCallbackInfo<Value>& args, int family) { Environment* env = Environment::GetCurrent(args); - UDPWrap* wrap = Unwrap<UDPWrap>(args.Holder()); + UDPWrap* wrap; + ASSIGN_OR_RETURN_UNWRAP(&wrap, + args.Holder(), + args.GetReturnValue().Set(UV_EBADF)); // send(req, buffer, port, address, hasCallback) CHECK(args[0]->IsObject()); @@ -335,7 +344,10 @@ void UDPWrap::Send6(const FunctionCallbackInfo<Value>& args) { void UDPWrap::RecvStart(const FunctionCallbackInfo<Value>& args) { - UDPWrap* wrap = Unwrap<UDPWrap>(args.Holder()); + UDPWrap* wrap; + ASSIGN_OR_RETURN_UNWRAP(&wrap, + args.Holder(), + args.GetReturnValue().Set(UV_EBADF)); int err = uv_udp_recv_start(&wrap->handle_, OnAlloc, OnRecv); // UV_EALREADY means that the socket is already bound but that's okay if (err == UV_EALREADY) @@ -345,7 +357,10 @@ void UDPWrap::RecvStart(const FunctionCallbackInfo<Value>& args) { void UDPWrap::RecvStop(const FunctionCallbackInfo<Value>& args) { - UDPWrap* wrap = Unwrap<UDPWrap>(args.Holder()); + UDPWrap* wrap; + ASSIGN_OR_RETURN_UNWRAP(&wrap, + args.Holder(), + args.GetReturnValue().Set(UV_EBADF)); int r = uv_udp_recv_stop(&wrap->handle_); args.GetReturnValue().Set(r); } |