From a6e9b9c9e4460f77fc173a3610b167e15f66f4ec Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 17 Jan 2018 11:17:28 -0500 Subject: CTest: Fix process output read error cases The libuv documentation states that the stream read callback may be called with `nread == 0` for EAGAIN. Handle this gracefully. It also states that the callee is responsible for closing the stream on error. Always close the stream for `nread < 0`. --- Source/CTest/cmProcess.cxx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Source/CTest/cmProcess.cxx b/Source/CTest/cmProcess.cxx index 4454715..e332a77 100644 --- a/Source/CTest/cmProcess.cxx +++ b/Source/CTest/cmProcess.cxx @@ -244,6 +244,10 @@ void cmProcess::OnRead(ssize_t nread, const uv_buf_t* buf) return; } + if (nread == 0) { + return; + } + // The process will provide no more data. if (nread != UV_EOF) { auto error = static_cast(nread); @@ -257,6 +261,7 @@ void cmProcess::OnRead(ssize_t nread, const uv_buf_t* buf) } this->ReadHandleClosed = true; + this->PipeReader.reset(); if (this->ProcessHandleClosed) { uv_timer_stop(this->Timer); this->Runner.FinalizeTest(); -- cgit v0.12