]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Fixed IOStream._handle_events (try/except block)
authorImre SZEBENYI <szeim@elte.hu>
Wed, 27 Oct 2010 11:34:47 +0000 (13:34 +0200)
committerImre SZEBENYI <szeim@elte.hu>
Wed, 27 Oct 2010 11:34:47 +0000 (13:34 +0200)
Fixed IOStream._handle_events (try/except block) to prevent
infinite loop when an unhandled exception occurs

tornado/iostream.py

index 9482330a7a6dd09823401cec2658e403dba74bb6..4a4875936f9c6c368db8bc84a16f7bf7400ab862 100644 (file)
@@ -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: