diff --git a/AUTHORS b/AUTHORS index 2860b57..69a851a 100644 --- a/AUTHORS +++ b/AUTHORS @@ -23,6 +23,7 @@ Linden Lab Contributors Thanks To --------- +* Taso Du Val, reproing an exception squelching bug, saving children's lives ;-) * R. Tyler Ballance, bug report on tpool on Windows * Sergey Shepelev, PEP 8 police :-) * Luci Stanescu, for reporting twisted hub bug diff --git a/eventlet/hubs/poll.py b/eventlet/hubs/poll.py index 9e26ea9..0c72a85 100644 --- a/eventlet/hubs/poll.py +++ b/eventlet/hubs/poll.py @@ -67,10 +67,17 @@ class Hub(BaseHub): for fileno, event in presult: try: - if event & READ_MASK: - readers[fileno][0](fileno) - if event & WRITE_MASK: - writers[fileno][0](fileno) + listener = None + try: + if event & READ_MASK: + listener = readers[fileno][0] + if event & WRITE_MASK: + listener = writers[fileno][0] + except KeyError: + pass + else: + if listener: + listener(fileno) if event & select.POLLNVAL: self.remove_descriptor(fileno) continue @@ -79,8 +86,6 @@ class Hub(BaseHub): writers.get(fileno, [])): for listener in listeners: listener(fileno) - except KeyError: - pass except SYSTEM_EXCEPTIONS: raise except: diff --git a/tests/greenio_test.py b/tests/greenio_test.py index c20ae3a..64863dc 100644 --- a/tests/greenio_test.py +++ b/tests/greenio_test.py @@ -5,6 +5,11 @@ import os import socket import sys +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO + def bufsized(sock, size=1): """ Resize both send and receive buffers on a socket. Useful for testing trampoline. Returns the socket. @@ -212,7 +217,6 @@ class TestGreenIo(LimitedTestCase): client.close() server_coro.wait() listener.close() - print len(results1), len(results2) self.assert_(len(results1) > 0) self.assert_(len(results2) > 0) @@ -224,6 +228,27 @@ class TestGreenIo(LimitedTestCase): else: sock = api.tcp_listener(('127.0.0.1', 0)) ssl_sock = ssl.wrap_socket(sock) + + def test_exception_squelching(self): + server = api.tcp_listener(('0.0.0.0', 0)) + client = api.connect_tcp(('127.0.0.1', server.getsockname()[1])) + client_2, addr = server.accept() + + def hurl(s): + s.recv(1) + {}[1] # keyerror + + fake = StringIO() + orig = sys.stderr + sys.stderr = fake + try: + api.spawn(hurl, client_2) + api.sleep(0) + client.send(' ') + api.sleep(0) + finally: + sys.stderr = orig + self.assert_('Traceback' in fake.getvalue()) class SSLTest(LimitedTestCase):