From 34d71f7879358c181cfee4f5fb4b450331181a67 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 11 Jul 2026 13:07:53 +0300 Subject: [PATCH] [ROSAUTOTEST] Fix potential issues in pipe reading - Initialize m_ReadOverlapped.hEvent as unset - Reset m_ReadOverlapped.hEvent before use - Zero-inialize m_ReadOverlapped (except for hEvent) before use - Call CancelIo, if waiting on the asynchronous read event failed --- modules/rostests/rosautotest/CPipe.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/rostests/rosautotest/CPipe.cpp b/modules/rostests/rosautotest/CPipe.cpp index 76171658ac6..7462c3a4711 100644 --- a/modules/rostests/rosautotest/CPipe.cpp +++ b/modules/rostests/rosautotest/CPipe.cpp @@ -61,7 +61,7 @@ CPipe::CPipe() // Prepare the OVERLAPPED structure for reading. ZeroMemory(&m_ReadOverlapped, sizeof(m_ReadOverlapped)); - m_ReadOverlapped.hEvent = CreateEventW(NULL, TRUE, TRUE, NULL); + m_ReadOverlapped.hEvent = CreateEventW(NULL, TRUE, FALSE, NULL); if (!m_ReadOverlapped.hEvent) { FATAL("CreateEvent failed\n"); @@ -164,6 +164,9 @@ CPipe::Read(PVOID Buffer, DWORD NumberOfBytesToRead, PDWORD NumberOfBytesRead, D FATAL("Trying to read from a closed read pipe\n"); } + RtlZeroMemory(&m_ReadOverlapped, FIELD_OFFSET(OVERLAPPED, hEvent)); + ResetEvent(m_ReadOverlapped.hEvent); + if (ReadFile(m_hReadPipe, Buffer, NumberOfBytesToRead, NumberOfBytesRead, &m_ReadOverlapped)) { // The asynchronous read request could be satisfied immediately. @@ -199,6 +202,7 @@ CPipe::Read(PVOID Buffer, DWORD NumberOfBytesToRead, PDWORD NumberOfBytesRead, D else { // This may be WAIT_TIMEOUT or an unexpected error. + CancelIo(m_hReadPipe); return dwWaitResult; } }