From 3b88dc6f19feda070ae1b9955dad7acfc6ed0142 Mon Sep 17 00:00:00 2001 From: Fedor Indutny Date: Fri, 28 Feb 2014 12:14:05 +0400 Subject: [PATCH] stream_wrap: don't write twice on uv_try_write err fix #7155 --- src/stream_wrap.cc | 21 +++++++++++++-------- src/tls_wrap.cc | 2 +- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/stream_wrap.cc b/src/stream_wrap.cc index 3a2d110efa1..62193fd796a 100644 --- a/src/stream_wrap.cc +++ b/src/stream_wrap.cc @@ -215,7 +215,9 @@ void StreamWrap::WriteBuffer(const FunctionCallbackInfo& args) { uv_buf_t* bufs = &buf; size_t count = 1; int err = wrap->callbacks()->TryWrite(&bufs, &count); - if (err == 0) + if (err != 0) + goto done; + if (count == 0) goto done; assert(count == 1); @@ -296,11 +298,15 @@ void StreamWrap::WriteStringImpl(const FunctionCallbackInfo& args) { size_t count = 1; err = wrap->callbacks()->TryWrite(&bufs, &count); - // Success - if (err == 0) + // Failure + if (err != 0) goto done; - // Failure, or partial write + // Success + if (count == 0) + goto done; + + // Partial write assert(count == 1); } @@ -603,6 +609,8 @@ int StreamWrapCallbacks::TryWrite(uv_buf_t** bufs, size_t* count) { size_t vcount = *count; err = uv_try_write(wrap()->stream(), vbufs, vcount); + if (err == UV_ENOSYS) + return 0; if (err < 0) return err; @@ -626,10 +634,7 @@ int StreamWrapCallbacks::TryWrite(uv_buf_t** bufs, size_t* count) { *bufs = vbufs; *count = vcount; - if (vcount == 0) - return 0; - else - return -1; + return 0; } diff --git a/src/tls_wrap.cc b/src/tls_wrap.cc index d7b2d42b0d4..d3768e5185f 100644 --- a/src/tls_wrap.cc +++ b/src/tls_wrap.cc @@ -530,7 +530,7 @@ const char* TLSCallbacks::Error() { int TLSCallbacks::TryWrite(uv_buf_t** bufs, size_t* count) { // TODO(indutny): Support it - return -1; + return 0; }