diff options
author | Santiago Gimeno <santiago.gimeno@gmail.com> | 2020-03-31 21:56:01 +0300 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2020-04-06 03:58:53 +0300 |
commit | c7a235f0a75164b80289a6dc8f23263e0fbbbaab (patch) | |
tree | f76adab12179ab0d8a533da329c2a79ef641701f /src/stream_base.cc | |
parent | d3af1fe9fe5a7f015a4d8b21e0f29b1788bc993f (diff) |
net: fix crash if POLLHUP is received
If the `onread` socket option is used and a `POLLHUP` event is received,
libuv returns `UV_EOF` along with a `NULL` buffer in the read callback,
causing the crash. Deal with this case.
Fixes: https://github.com/nodejs/node/issues/31823
PR-URL: https://github.com/nodejs/node/pull/32590
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'src/stream_base.cc')
-rw-r--r-- | src/stream_base.cc | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/src/stream_base.cc b/src/stream_base.cc index 63b06378f7c..d8a191dc2e5 100644 --- a/src/stream_base.cc +++ b/src/stream_base.cc @@ -517,13 +517,21 @@ uv_buf_t CustomBufferJSListener::OnStreamAlloc(size_t suggested_size) { void CustomBufferJSListener::OnStreamRead(ssize_t nread, const uv_buf_t& buf) { CHECK_NOT_NULL(stream_); - CHECK_EQ(buf.base, buffer_.base); StreamBase* stream = static_cast<StreamBase*>(stream_); Environment* env = stream->stream_env(); HandleScope handle_scope(env->isolate()); Context::Scope context_scope(env->context()); + // To deal with the case where POLLHUP is received and UV_EOF is returned, as + // libuv returns an empty buffer (on unices only). + if (nread == UV_EOF && buf.base == nullptr) { + stream->CallJSOnreadMethod(nread, Local<ArrayBuffer>()); + return; + } + + CHECK_EQ(buf.base, buffer_.base); + MaybeLocal<Value> ret = stream->CallJSOnreadMethod(nread, Local<ArrayBuffer>(), 0, |