From: Steve Dower Date: Sun, 29 Jul 2018 09:32:30 +0000 (+0100) Subject: bpo-30237: Output error when ReadConsole is canceled by CancelSynchronousIo. (GH... X-Git-Tag: v3.6.7rc1~142 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=28bbbdabb1e3601047530febac1b05b7b89dc65e;p=thirdparty%2FPython%2Fcpython.git bpo-30237: Output error when ReadConsole is canceled by CancelSynchronousIo. (GH-7911) Co-authored-by: ValeriyaSinevich --- 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 000000000000..18aac756cb58 --- /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 0d1b0926baee..979bcfc49b9b 100644 --- a/Modules/_io/winconsoleio.c +++ b/Modules/_io/winconsoleio.c @@ -573,7 +573,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); @@ -581,6 +582,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 bb0263135720..476af717451b 100644 --- a/Parser/myreadline.c +++ b/Parser/myreadline.c @@ -114,7 +114,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; @@ -126,6 +126,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();