summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2019-11-26 17:08:11 +0100
committerAnna Henningsen <anna@addaleax.net>2019-11-28 17:49:17 +0100
commit4c9db6c74150d3f5487798ca654496fdaf343422 (patch)
tree668281657a07142125eb395cbb147bba43fd21ad /src
parent5b59c248413af4e81a0616286790b3dc718107ef (diff)
downloadandroid-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.cc6
-rw-r--r--src/stream_pipe.h2
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);