From: Ben Darnell Date: Mon, 28 Sep 2015 00:23:56 +0000 (-0400) Subject: Handle EINTR in IOStream. X-Git-Tag: v4.3.0b1~27^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=61f7d1047fd34d33fa70297cae646dc6dc6f9023;p=thirdparty%2Ftornado.git Handle EINTR in IOStream. Fixes #1287 --- diff --git a/tornado/iostream.py b/tornado/iostream.py index 1e6771045..0bad0acd6 100644 --- a/tornado/iostream.py +++ b/tornado/iostream.py @@ -725,18 +725,22 @@ class BaseIOStream(object): to read (i.e. the read returns EWOULDBLOCK or equivalent). On error closes the socket and raises an exception. """ - try: - chunk = self.read_from_fd() - except (socket.error, IOError, OSError) as e: - # ssl.SSLError is a subclass of socket.error - if self._is_connreset(e): - # Treat ECONNRESET as a connection close rather than - # an error to minimize log spam (the exception will - # be available on self.error for apps that care). + while True: + try: + chunk = self.read_from_fd() + except (socket.error, IOError, OSError) as e: + if errno_from_exception(e) == errno.EINTR: + continue + # ssl.SSLError is a subclass of socket.error + if self._is_connreset(e): + # Treat ECONNRESET as a connection close rather than + # an error to minimize log spam (the exception will + # be available on self.error for apps that care). + self.close(exc_info=True) + return self.close(exc_info=True) - return - self.close(exc_info=True) - raise + raise + break if chunk is None: return 0 self._read_buffer.append(chunk)