Skip to content

Commit 9e412f0

Browse files
committed
Fix SSLProtocol.data_received() to propagate errors correctly
1 parent 4e4c386 commit 9e412f0

File tree

2 files changed

+45
-7
lines changed

2 files changed

+45
-7
lines changed

Lib/asyncio/sslproto.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -524,12 +524,8 @@ def data_received(self, data):
524524

525525
try:
526526
ssldata, appdata = self._sslpipe.feed_ssldata(data)
527-
except ssl.SSLError as e:
528-
if self._loop.get_debug():
529-
logger.warning('%r: SSL error errno:%s (reason %s)',
530-
self, getattr(e, 'errno', 'missing'),
531-
e.reason)
532-
self._abort()
527+
except Exception as e:
528+
self._fatal_error(e, 'SSL error in data received')
533529
return
534530

535531
for chunk in ssldata:

Lib/test/test_asyncio/test_sslproto.py

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -599,7 +599,6 @@ def server(sock):
599599
sock.start_tls(
600600
sslctx,
601601
server_side=True)
602-
sock.connect()
603602
except ssl.SSLError:
604603
pass
605604
finally:
@@ -622,6 +621,49 @@ async def client(addr):
622621

623622
self.assertEqual(messages, [])
624623

624+
def test_start_tls_client_corrupted_ssl(self):
625+
messages = []
626+
self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx))
627+
628+
sslctx = test_utils.simple_server_sslcontext()
629+
client_sslctx = test_utils.simple_client_sslcontext()
630+
631+
def server(sock):
632+
orig_sock = sock.dup()
633+
try:
634+
sock.start_tls(
635+
sslctx,
636+
server_side=True)
637+
sock.sendall(b'A\n')
638+
sock.recv_all(1)
639+
orig_sock.send(b'please corrupt the SSL connection')
640+
except ssl.SSLError:
641+
pass
642+
finally:
643+
sock.close()
644+
645+
async def client(addr):
646+
reader, writer = await asyncio.open_connection(
647+
*addr,
648+
ssl=client_sslctx,
649+
server_hostname='',
650+
loop=self.loop)
651+
652+
self.assertEqual(await reader.readline(), b'A\n')
653+
writer.write(b'B')
654+
with self.assertRaises(ssl.SSLError):
655+
await reader.readline()
656+
return 'OK'
657+
658+
with self.tcp_server(server,
659+
max_clients=1,
660+
backlog=1) as srv:
661+
662+
res = self.loop.run_until_complete(client(srv.addr))
663+
664+
self.assertEqual(res, 'OK')
665+
self.assertEqual(messages, [])
666+
625667

626668
@unittest.skipIf(ssl is None, 'No ssl module')
627669
class SelectorStartTLSTests(BaseStartTLS, unittest.TestCase):

0 commit comments

Comments
 (0)