diff --git a/src/windows/common/relay.cpp b/src/windows/common/relay.cpp index 9b65283db..271717ae0 100644 --- a/src/windows/common/relay.cpp +++ b/src/windows/common/relay.cpp @@ -297,6 +297,8 @@ void wsl::windows::common::relay::BidirectionalRelay(_In_ HANDLE LeftHandle, _In bool leftReadPending = false; bool rightReadPending = false; + bool leftReadClosed = (LeftHandle == nullptr); + bool rightReadClosed = (RightHandle == nullptr); auto cancelReads = wil::scope_exit_log(WI_DIAGNOSTICS_INFO, [&] { DWORD bytes; if (leftReadPending) @@ -316,13 +318,13 @@ void wsl::windows::common::relay::BidirectionalRelay(_In_ HANDLE LeftHandle, _In const HANDLE waitObjects[] = {leftOverlapped.hEvent, rightOverlapped.hEvent}; for (;;) { - if ((LeftHandle == nullptr) || (RightHandle == nullptr)) + if (leftReadClosed && rightReadClosed) { break; } DWORD leftBytesRead = 0; - if (!leftReadPending && LeftHandle) + if (!leftReadPending && !leftReadClosed && LeftHandle) { if (!ReadFile(LeftHandle, leftReadSpan.data(), gsl::narrow_cast(leftReadSpan.size()), &leftBytesRead, &leftOverlapped)) { @@ -333,7 +335,7 @@ void wsl::windows::common::relay::BidirectionalRelay(_In_ HANDLE LeftHandle, _In } DWORD rightBytesRead = 0; - if (!rightReadPending && RightHandle) + if (!rightReadPending && !rightReadClosed && RightHandle) { if (!ReadFile(RightHandle, rightReadSpan.data(), gsl::narrow_cast(rightReadSpan.size()), &rightBytesRead, &rightOverlapped)) { @@ -352,7 +354,7 @@ void wsl::windows::common::relay::BidirectionalRelay(_In_ HANDLE LeftHandle, _In leftReadPending = false; if (leftBytesRead == 0) { - LeftHandle = nullptr; + leftReadClosed = true; if (WI_IsFlagSet(Flags, RelayFlags::RightIsSocket)) { LOG_LAST_ERROR_IF(shutdown(reinterpret_cast(RightHandle), SD_SEND) == SOCKET_ERROR); @@ -380,7 +382,7 @@ void wsl::windows::common::relay::BidirectionalRelay(_In_ HANDLE LeftHandle, _In rightReadPending = false; if (rightBytesRead == 0) { - RightHandle = nullptr; + rightReadClosed = true; if (WI_IsFlagSet(Flags, RelayFlags::LeftIsSocket)) { LOG_LAST_ERROR_IF(shutdown(reinterpret_cast(LeftHandle), SD_SEND) == SOCKET_ERROR);