Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSantiago Gimeno <santiago.gimeno@gmail.com>2020-03-31 21:56:01 +0300
committerAnna Henningsen <anna@addaleax.net>2020-04-06 03:58:53 +0300
commitc7a235f0a75164b80289a6dc8f23263e0fbbbaab (patch)
treef76adab12179ab0d8a533da329c2a79ef641701f /src/stream_base.cc
parentd3af1fe9fe5a7f015a4d8b21e0f29b1788bc993f (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.cc10
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,