浏览代码

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`.
Brad King 7 年之前
父节点
当前提交
a6e9b9c9e4
共有 1 个文件被更改,包括 5 次插入0 次删除
  1. 5 0
      Source/CTest/cmProcess.cxx

+ 5 - 0
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<int>(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();