diff options
author | Anna Henningsen <anna@addaleax.net> | 2019-11-26 17:08:11 +0100 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2019-11-28 17:49:17 +0100 |
commit | 4c9db6c74150d3f5487798ca654496fdaf343422 (patch) | |
tree | 668281657a07142125eb395cbb147bba43fd21ad /src | |
parent | 5b59c248413af4e81a0616286790b3dc718107ef (diff) | |
download | android-node-v8-4c9db6c74150d3f5487798ca654496fdaf343422.tar.gz android-node-v8-4c9db6c74150d3f5487798ca654496fdaf343422.tar.bz2 android-node-v8-4c9db6c74150d3f5487798ca654496fdaf343422.zip |
src: no SetImmediate from destructor in stream_pipe code
Guard against running `SetImmediate()` from the destructor.
The object will not be alive or usable in the callback,
so it does not make sense to attempt to schedule the
`SetImmediate()`.
PR-URL: https://github.com/nodejs/node/pull/30666
Fixes: https://github.com/nodejs/node/issues/30643
Refs: https://github.com/nodejs/node/pull/30374
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/stream_pipe.cc | 6 | ||||
-rw-r--r-- | src/stream_pipe.h | 2 |
2 files changed, 5 insertions, 3 deletions
diff --git a/src/stream_pipe.cc b/src/stream_pipe.cc index b84c8f4c66..d405c4d5cb 100644 --- a/src/stream_pipe.cc +++ b/src/stream_pipe.cc @@ -42,7 +42,7 @@ StreamPipe::StreamPipe(StreamBase* source, } StreamPipe::~StreamPipe() { - Unpipe(); + Unpipe(true); } StreamBase* StreamPipe::source() { @@ -53,7 +53,7 @@ StreamBase* StreamPipe::sink() { return static_cast<StreamBase*>(writable_listener_.stream()); } -void StreamPipe::Unpipe() { +void StreamPipe::Unpipe(bool is_in_deletion) { if (is_closed_) return; @@ -68,6 +68,8 @@ void StreamPipe::Unpipe() { source()->RemoveStreamListener(&readable_listener_); sink()->RemoveStreamListener(&writable_listener_); + if (is_in_deletion) return; + // Delay the JS-facing part with SetImmediate, because this might be from // inside the garbage collector, so we can’t run JS here. HandleScope handle_scope(env()->isolate()); diff --git a/src/stream_pipe.h b/src/stream_pipe.h index 061ad9842e..0e15500610 100644 --- a/src/stream_pipe.h +++ b/src/stream_pipe.h @@ -12,7 +12,7 @@ class StreamPipe : public AsyncWrap { StreamPipe(StreamBase* source, StreamBase* sink, v8::Local<v8::Object> obj); ~StreamPipe() override; - void Unpipe(); + void Unpipe(bool is_in_deletion = false); static void New(const v8::FunctionCallbackInfo<v8::Value>& args); static void Start(const v8::FunctionCallbackInfo<v8::Value>& args); |