From 3b486fc4f8081355fc0b87ebbf6c261692d7a418 Mon Sep 17 00:00:00 2001 From: Imre SZEBENYI Date: Wed, 27 Oct 2010 13:34:47 +0200 Subject: [PATCH] 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: