diff -r b1f5b5d7997f Lib/asyncio/base_events.py --- a/Lib/asyncio/base_events.py Fri Apr 04 16:57:24 2014 +0200 +++ b/Lib/asyncio/base_events.py Fri Apr 04 18:38:08 2014 +0200 @@ -412,6 +412,10 @@ class BaseEventLoop(events.AbstractEvent if sock is not None: sock.close() exceptions.append(exc) + except: + if sock is not None: + sock.close() + raise else: break else: diff -r b1f5b5d7997f Lib/test/test_asyncio/test_base_events.py --- a/Lib/test/test_asyncio/test_base_events.py Fri Apr 04 16:57:24 2014 +0200 +++ b/Lib/test/test_asyncio/test_base_events.py Fri Apr 04 18:38:08 2014 +0200 @@ -583,6 +583,25 @@ class BaseEventLoopWithSelectorTests(uni self.assertEqual(str(cm.exception), 'Multiple exceptions: err1, err2') + @mock.patch('asyncio.base_events.socket') + def test_create_connection_timeout(self, m_socket): + sock = mock.Mock() + m_socket.socket.return_value = sock + + def getaddrinfo(*args, **kw): + fut = asyncio.Future(loop=self.loop) + addr = (socket.AF_INET, socket.SOCK_STREAM, 0, '', ('127.0.0.1', 80)) + fut.set_result([addr]) + return fut + self.loop.getaddrinfo = getaddrinfo + + sock.setblocking.side_effect = asyncio.TimeoutError + coro = self.loop.create_connection(MyProto, '127.0.0.1', 80) + with self.assertRaises(asyncio.TimeoutError) as cm: + self.loop.run_until_complete(coro) + + self.assertTrue(sock.close.called) + def test_create_connection_host_port_sock(self): coro = self.loop.create_connection( MyProto, 'example.com', 80, sock=object())