summaryrefslogtreecommitdiff
path: root/src/stream_wrap.cc
diff options
context:
space:
mode:
authorFedor Indutny <fedor@indutny.com>2014-10-24 19:46:25 +0400
committerFedor Indutny <fedor@indutny.com>2014-10-28 21:10:28 -0400
commit10d0dbc4274dccdcc59ed6d2cd70e7e4267453ee (patch)
tree78257e36db5cf4aa1f621ee8d670c2c761aaee04 /src/stream_wrap.cc
parentb782ef85f1b53384c884050c220efba3dd442bec (diff)
downloadandroid-node-v8-10d0dbc4274dccdcc59ed6d2cd70e7e4267453ee.tar.gz
android-node-v8-10d0dbc4274dccdcc59ed6d2cd70e7e4267453ee.tar.bz2
android-node-v8-10d0dbc4274dccdcc59ed6d2cd70e7e4267453ee.zip
stream_wrap: do not crash if handle was closed
Ignore cases where the handle is already gone, like we do in `handle_wrap.cc`. It should be safe to close handle and then call some binding methods on it, since the internal handle may be shared between `_tls_wrap.js` and `net.js` modules. Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> PR-URL: https://github.com/node-forward/node/pull/37
Diffstat (limited to 'src/stream_wrap.cc')
-rw-r--r--src/stream_wrap.cc15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/stream_wrap.cc b/src/stream_wrap.cc
index a6c64ac8bd..103d1e3038 100644
--- a/src/stream_wrap.cc
+++ b/src/stream_wrap.cc
@@ -90,6 +90,9 @@ void StreamWrap::UpdateWriteQueueSize() {
void StreamWrap::ReadStart(const FunctionCallbackInfo<Value>& args) {
StreamWrap* wrap = Unwrap<StreamWrap>(args.Holder());
+ if (!IsAlive(wrap))
+ return args.GetReturnValue().Set(UV_EINVAL);
+
int err = uv_read_start(wrap->stream(), OnAlloc, OnRead);
args.GetReturnValue().Set(err);
}
@@ -97,6 +100,8 @@ void StreamWrap::ReadStart(const FunctionCallbackInfo<Value>& args) {
void StreamWrap::ReadStop(const FunctionCallbackInfo<Value>& args) {
StreamWrap* wrap = Unwrap<StreamWrap>(args.Holder());
+ if (!IsAlive(wrap))
+ return args.GetReturnValue().Set(UV_EINVAL);
int err = uv_read_stop(wrap->stream());
args.GetReturnValue().Set(err);
}
@@ -183,6 +188,8 @@ void StreamWrap::WriteBuffer(const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);
StreamWrap* wrap = Unwrap<StreamWrap>(args.Holder());
+ if (!IsAlive(wrap))
+ return args.GetReturnValue().Set(UV_EINVAL);
CHECK(args[0]->IsObject());
CHECK(Buffer::HasInstance(args[1]));
@@ -240,6 +247,8 @@ void StreamWrap::WriteStringImpl(const FunctionCallbackInfo<Value>& args) {
int err;
StreamWrap* wrap = Unwrap<StreamWrap>(args.Holder());
+ if (!IsAlive(wrap))
+ return args.GetReturnValue().Set(UV_EINVAL);
CHECK(args[0]->IsObject());
CHECK(args[1]->IsString());
@@ -367,6 +376,8 @@ void StreamWrap::Writev(const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);
StreamWrap* wrap = Unwrap<StreamWrap>(args.Holder());
+ if (!IsAlive(wrap))
+ return args.GetReturnValue().Set(UV_EINVAL);
CHECK(args[0]->IsObject());
CHECK(args[1]->IsArray());
@@ -493,6 +504,8 @@ void StreamWrap::WriteBinaryString(const FunctionCallbackInfo<Value>& args) {
void StreamWrap::SetBlocking(const FunctionCallbackInfo<Value>& args) {
StreamWrap* wrap = Unwrap<StreamWrap>(args.Holder());
+ if (!IsAlive(wrap))
+ return args.GetReturnValue().Set(UV_EINVAL);
CHECK_GT(args.Length(), 0);
int err = uv_stream_set_blocking(wrap->stream(), args[0]->IsTrue());
args.GetReturnValue().Set(err);
@@ -537,6 +550,8 @@ void StreamWrap::Shutdown(const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);
StreamWrap* wrap = Unwrap<StreamWrap>(args.Holder());
+ if (!IsAlive(wrap))
+ return args.GetReturnValue().Set(UV_EINVAL);
CHECK(args[0]->IsObject());
Local<Object> req_wrap_obj = args[0].As<Object>();