From c6f3d919dd82497183bdf780b0d00aeb374aa934 Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Thu, 1 Nov 2012 12:14:09 +0100 Subject: [PATCH] fix error handling bug in QWindowsPipeReader If ReadFile returns with an error then we must set our internal state accordingly. QWindowsPipeReader::readSequenceStarted must be set to false. If ReadFile fails, we're not within a read sequence. Also, we must handle the ERROR_BROKEN_PIPE error. Task-number: QTBUG-25342 Change-Id: Ic9247f170fa9cc47fa7e45d0f47ccfedac06a593 Reviewed-by: Oswald Buddenhagen --- src/corelib/io/qwindowspipereader.cpp | 8 ++++++-- tests/auto/corelib/io/qprocess/test/test.pro | 1 - 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/corelib/io/qwindowspipereader.cpp b/src/corelib/io/qwindowspipereader.cpp index cca6e80810..bef6097043 100644 --- a/src/corelib/io/qwindowspipereader.cpp +++ b/src/corelib/io/qwindowspipereader.cpp @@ -213,7 +213,8 @@ void QWindowsPipeReader::startAsyncRead() // We get notified by the QWinOverlappedIoNotifier - even in the synchronous case. return; } else { - switch (GetLastError()) { + const DWORD dwError = GetLastError(); + switch (dwError) { case ERROR_IO_PENDING: // This is not an error. We're getting notified, when data arrives. return; @@ -223,16 +224,19 @@ void QWindowsPipeReader::startAsyncRead() // didn't fit into the pipe's system buffer. // We're getting notified by the QWinOverlappedIoNotifier. break; + case ERROR_BROKEN_PIPE: case ERROR_PIPE_NOT_CONNECTED: { // It may happen, that the other side closes the connection directly // after writing data. Then we must set the appropriate socket state. + readSequenceStarted = false; pipeBroken = true; emit pipeClosed(); return; } default: - emit winError(GetLastError(), QLatin1String("QWindowsPipeReader::startAsyncRead")); + readSequenceStarted = false; + emit winError(dwError, QLatin1String("QWindowsPipeReader::startAsyncRead")); return; } } diff --git a/tests/auto/corelib/io/qprocess/test/test.pro b/tests/auto/corelib/io/qprocess/test/test.pro index 458bbca738..79ea53cc6b 100644 --- a/tests/auto/corelib/io/qprocess/test/test.pro +++ b/tests/auto/corelib/io/qprocess/test/test.pro @@ -11,7 +11,6 @@ win32:TESTDATA += ../testBatFiles/* include(../qprocess.pri) -win32:CONFIG += insignificant_test # QTBUG-25342 - sometimes hangs mac:CONFIG += insignificant_test # QTBUG-25895 - sometimes hangs for(file, SUBPROGRAMS): TEST_HELPER_INSTALLS += "../$${file}/$${file}"