-
Notifications
You must be signed in to change notification settings - Fork 30.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
stream_wrap: add HandleScope's in uv callbacks #1078
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
Ensure that no handles will leak into global HandleScope by adding HandleScope's in all JS-calling libuv callbacks in `stream_wrap.cc`. Fix: #1075
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -145,6 +145,9 @@ void StreamWrap::OnAlloc(uv_handle_t* handle, | |
size_t suggested_size, | ||
uv_buf_t* buf) { | ||
StreamWrap* wrap = static_cast<StreamWrap*>(handle->data); | ||
HandleScope scope(wrap->env()->isolate()); | ||
Context::Scope context_scope(wrap->env()->context()); | ||
|
||
CHECK_EQ(wrap->stream(), reinterpret_cast<uv_stream_t*>(handle)); | ||
|
||
return static_cast<StreamBase*>(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<StreamWrap*>(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,7 @@ 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()); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Shouldn't this have a Context::Scope as well? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It should, thanks! |
||
req_wrap->Done(status); | ||
} | ||
|
||
|
@@ -354,6 +359,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); | ||
} | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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*>(ssl_); | ||
TLSWrap* c = static_cast<TLSWrap*>(SSL_get_app_data(ssl)); | ||
Environment* env = c->env(); | ||
HandleScope handle_scope(env->isolate()); | ||
Context::Scope context_scope(env->context()); | ||
Local<Object> object = c->object(); | ||
|
||
if (where & SSL_CB_HANDSHAKE_START) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. These can be removed because SSLInfoCallback is called synchronously with a HandleScope and Context::Scope further down the stack? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah, this is correct. |
||
|
@@ -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<Value> 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<Value> 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> object = p->object(); | ||
Local<Value> ctx = object->Get(env->sni_context_string()); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What does this HandleScope do?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Captures all handles in this libuv callback?
OnReadCommon
callsOnRead()
which might create handles.