diff --git a/Misc/NEWS.d/next/Windows/2018-06-25-09-33-48.bpo-30237.EybiZA.rst b/Misc/NEWS.d/next/Windows/2018-06-25-09-33-48.bpo-30237.EybiZA.rst new file mode 100644 index 00000000000..18aac756cb5 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2018-06-25-09-33-48.bpo-30237.EybiZA.rst @@ -0,0 +1,2 @@ +Output error when ReadConsole is canceled by CancelSynchronousIo instead of +crashing. diff --git a/Modules/_io/winconsoleio.c b/Modules/_io/winconsoleio.c index 2bf48eb5553..f08406643f0 100644 --- a/Modules/_io/winconsoleio.c +++ b/Modules/_io/winconsoleio.c @@ -556,7 +556,8 @@ read_console_w(HANDLE handle, DWORD maxlen, DWORD *readlen) { Py_BEGIN_ALLOW_THREADS DWORD off = 0; while (off < maxlen) { - DWORD n, len = min(maxlen - off, BUFSIZ); + DWORD n = (DWORD)-1; + DWORD len = min(maxlen - off, BUFSIZ); SetLastError(0); BOOL res = ReadConsoleW(handle, &buf[off], len, &n, NULL); @@ -564,6 +565,9 @@ read_console_w(HANDLE handle, DWORD maxlen, DWORD *readlen) { err = GetLastError(); break; } + if (n == (DWORD)-1 && (err = GetLastError()) == ERROR_OPERATION_ABORTED) { + break; + } if (n == 0) { err = GetLastError(); if (err != ERROR_OPERATION_ABORTED) diff --git a/Parser/myreadline.c b/Parser/myreadline.c index 2aa3bef2b0b..edb291a6691 100644 --- a/Parser/myreadline.c +++ b/Parser/myreadline.c @@ -109,7 +109,7 @@ _PyOS_WindowsConsoleReadline(HANDLE hStdIn) char *buf = NULL; int err = 0; - n_read = 0; + n_read = (DWORD)-1; total_read = 0; wbuf = wbuf_local; wbuflen = sizeof(wbuf_local) / sizeof(wbuf_local[0]) - 1; @@ -121,6 +121,9 @@ _PyOS_WindowsConsoleReadline(HANDLE hStdIn) err = GetLastError(); goto exit; } + if (n_read == (DWORD)-1 && (err = GetLastError()) == ERROR_OPERATION_ABORTED) { + break; + } if (n_read == 0) { int s; err = GetLastError();