From 52c950f229199fa14bd75e1709183d0b08e90182 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 9 Apr 2011 15:55:44 +0200 Subject: [PATCH] Issue #11650: PyOS_StdioReadline() retries fgets() if it was interrupted (EINTR), for example if the program is stopped with CTRL+z on Mac OS X. Patch written by Charles-Francois Natali. --- Misc/NEWS | 4 ++++ Parser/myreadline.c | 9 +++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index 2d1327cb314..895e50d6fa4 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,10 @@ What's New in Python 3.1.4? Core and Builtins ----------------- +- Issue #11650: PyOS_StdioReadline() retries fgets() if it was interrupted + (EINTR), for example if the program is stopped with CTRL+z on Mac OS X. Patch + written by Charles-Francois Natali. + - Issue #8651: PyArg_Parse*() functions raise an OverflowError if the file doesn't have PY_SSIZE_T_CLEAN define and the size doesn't fit in an int (length bigger than 2^31-1 bytes). diff --git a/Parser/myreadline.c b/Parser/myreadline.c index a62e208a72c..7166fc1d010 100644 --- a/Parser/myreadline.c +++ b/Parser/myreadline.c @@ -36,7 +36,7 @@ static int my_fgets(char *buf, int len, FILE *fp) { char *p; - for (;;) { + while (1) { if (PyOS_InputHook != NULL) (void)(PyOS_InputHook)(); errno = 0; @@ -85,9 +85,10 @@ my_fgets(char *buf, int len, FILE *fp) #ifdef WITH_THREAD PyEval_SaveThread(); #endif - if (s < 0) { - return 1; - } + if (s < 0) + return 1; + /* try again */ + continue; } #endif if (PyOS_InterruptOccurred()) {