From 583a868bcdd9254d597fc459df9fa43c1f313f74 Mon Sep 17 00:00:00 2001 From: Fedor Indutny Date: Thu, 5 Mar 2015 18:26:01 -0500 Subject: [PATCH] stream_wrap: add HandleScope's in uv callbacks Ensure that no handles will leak into global HandleScope by adding HandleScope's in all JS-calling libuv callbacks in `stream_wrap.cc`. Fix: https://github.com/iojs/io.js/issues/1075 PR-URL: https://github.com/iojs/io.js/pull/1078 Reviewed-By: Ben Noordhuis --- src/stream_wrap.cc | 8 ++++++++ src/tls_wrap.cc | 14 -------------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/src/stream_wrap.cc b/src/stream_wrap.cc index 8f6fcac85d76b1..2deae209fd64df 100644 --- a/src/stream_wrap.cc +++ b/src/stream_wrap.cc @@ -145,6 +145,9 @@ void StreamWrap::OnAlloc(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { StreamWrap* wrap = static_cast(handle->data); + HandleScope scope(wrap->env()->isolate()); + Context::Scope context_scope(wrap->env()->context()); + CHECK_EQ(wrap->stream(), reinterpret_cast(handle)); return static_cast(wrap)->OnAlloc(suggested_size, buf); @@ -229,6 +232,7 @@ void StreamWrap::OnReadCommon(uv_stream_t* handle, const uv_buf_t* buf, uv_handle_type pending) { StreamWrap* wrap = static_cast(handle->data); + HandleScope scope(wrap->env()->isolate()); // We should not be getting this callback if someone as already called // uv_close() on the handle. @@ -280,6 +284,8 @@ int StreamWrap::DoShutdown(ShutdownWrap* req_wrap) { void StreamWrap::AfterShutdown(uv_shutdown_t* req, int status) { ShutdownWrap* req_wrap = ContainerOf(&ShutdownWrap::req_, req); + HandleScope scope(req_wrap->env()->isolate()); + Context::Scope context_scope(req_wrap->env()->context()); req_wrap->Done(status); } @@ -354,6 +360,8 @@ int StreamWrap::DoWrite(WriteWrap* w, void StreamWrap::AfterWrite(uv_write_t* req, int status) { WriteWrap* req_wrap = ContainerOf(&WriteWrap::req_, req); + HandleScope scope(req_wrap->env()->isolate()); + Context::Scope context_scope(req_wrap->env()->context()); req_wrap->Done(status); } diff --git a/src/tls_wrap.cc b/src/tls_wrap.cc index 1647ab669b29a3..b05b8891d0fdd5 100644 --- a/src/tls_wrap.cc +++ b/src/tls_wrap.cc @@ -26,7 +26,6 @@ using v8::Function; using v8::FunctionCallbackInfo; using v8::FunctionTemplate; using v8::Handle; -using v8::HandleScope; using v8::Integer; using v8::Local; using v8::Null; @@ -251,8 +250,6 @@ void TLSWrap::SSLInfoCallback(const SSL* ssl_, int where, int ret) { SSL* ssl = const_cast(ssl_); TLSWrap* c = static_cast(SSL_get_app_data(ssl)); Environment* env = c->env(); - HandleScope handle_scope(env->isolate()); - Context::Scope context_scope(env->context()); Local object = c->object(); if (where & SSL_CB_HANDSHAKE_START) { @@ -395,9 +392,6 @@ void TLSWrap::ClearOut() { if (eof_) return; - HandleScope handle_scope(env()->isolate()); - Context::Scope context_scope(env()->context()); - CHECK_NE(ssl_, nullptr); char out[kClearOutChunkSize]; @@ -470,9 +464,6 @@ bool TLSWrap::ClearIn() { return true; } - HandleScope handle_scope(env()->isolate()); - Context::Scope context_scope(env()->context()); - // Error or partial write int err; Local arg = GetSSLError(written, &err, &error_); @@ -588,8 +579,6 @@ int TLSWrap::DoWrite(WriteWrap* w, if (i != count) { int err; - HandleScope handle_scope(env()->isolate()); - Context::Scope context_scope(env()->context()); Local arg = GetSSLError(written, &err, &error_); if (!arg.IsEmpty()) return UV_EPROTO; @@ -662,8 +651,6 @@ void TLSWrap::DoRead(ssize_t nread, eof_ = true; } - HandleScope handle_scope(env()->isolate()); - Context::Scope context_scope(env()->context()); OnRead(nread, nullptr); return; } @@ -796,7 +783,6 @@ int TLSWrap::SelectSNIContextCallback(SSL* s, int* ad, void* arg) { if (servername == nullptr) return SSL_TLSEXT_ERR_OK; - HandleScope scope(env->isolate()); // Call the SNI callback and use its return value as context Local object = p->object(); Local ctx = object->Get(env->sni_context_string());