From 3b486fc4f8081355fc0b87ebbf6c261692d7a418 Mon Sep 17 00:00:00 2001 From: Imre SZEBENYI Date: Wed, 27 Oct 2010 13:34:47 +0200 Subject: [PATCH 1/2] Fixed IOStream._handle_events (try/except block) Fixed IOStream._handle_events (try/except block) to prevent infinite loop when an unhandled exception occurs --- tornado/iostream.py | 46 +++++++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/tornado/iostream.py b/tornado/iostream.py index 9482330a..4a487593 100644 --- a/tornado/iostream.py +++ b/tornado/iostream.py @@ -189,27 +189,33 @@ class IOStream(object): if not self.socket: logging.warning("Got events for closed stream %d", fd) return - if events & self.io_loop.READ: - self._handle_read() - if not self.socket: - return - if events & self.io_loop.WRITE: - if self._connecting: - self._handle_connect() - self._handle_write() - if not self.socket: - return - if events & self.io_loop.ERROR: + try: + if events & self.io_loop.READ: + self._handle_read() + if not self.socket: + return + if events & self.io_loop.WRITE: + if self._connecting: + self._handle_connect() + self._handle_write() + if not self.socket: + return + if events & self.io_loop.ERROR: + self.close() + return + state = self.io_loop.ERROR + if self._read_delimiter or self._read_bytes: + state |= self.io_loop.READ + if self._write_buffer: + state |= self.io_loop.WRITE + if state != self._state: + self._state = state + self.io_loop.update_handler(self.socket.fileno(), self._state) + except: + logging.error("Uncaught exception, closing connection.", + exc_info=True) self.close() - return - state = self.io_loop.ERROR - if self._read_delimiter or self._read_bytes: - state |= self.io_loop.READ - if self._write_buffer: - state |= self.io_loop.WRITE - if state != self._state: - self._state = state - self.io_loop.update_handler(self.socket.fileno(), self._state) + raise def _run_callback(self, callback, *args, **kwargs): try: From 2dbb05d5a09406b2369ee30661c88cd890b09e63 Mon Sep 17 00:00:00 2001 From: Imre SZEBENYI Date: Wed, 27 Oct 2010 13:36:12 +0200 Subject: [PATCH 2/2] SSLIOStream._do_ssl_handshake SSL error check --- tornado/iostream.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tornado/iostream.py b/tornado/iostream.py index 4a487593..2897fdc7 100644 --- a/tornado/iostream.py +++ b/tornado/iostream.py @@ -391,6 +391,9 @@ class SSLIOStream(IOStream): elif err.args[0] in (ssl.SSL_ERROR_EOF, ssl.SSL_ERROR_ZERO_RETURN): return self.close() + elif err.args[0] == ssl.SSL_ERROR_SSL: + logging.warning("SSL Error on %d: %s", self.socket.fileno(), err) + return self.close() raise except socket.error, err: if err.args[0] == errno.ECONNABORTED: