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 <oswald.buddenhagen@digia.com>
This commit is contained in:
Joerg Bornemann 2012-11-01 12:14:09 +01:00 committed by The Qt Project
parent 44e0d2b328
commit c6f3d919dd
2 changed files with 6 additions and 3 deletions

View File

@ -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;
}
}

View File

@ -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}"