@@ -824,6 +824,68 @@ async def client(addr):
824824 with self .assertRaises (ssl .SSLCertVerificationError ):
825825 self .loop .run_until_complete (client (srv .addr ))
826826
827+ def test_create_connection_ssl_failed_certificate_no_cycles (self ):
828+ # gh-159049
829+ sslctx = test_utils .simple_server_sslcontext ()
830+ client_sslctx = test_utils .simple_client_sslcontext (
831+ disable_verify = False )
832+ transports = []
833+
834+ def server (sock ):
835+ try :
836+ sock .start_tls (sslctx , server_side = True )
837+ except OSError :
838+ pass
839+
840+ connection_made = sslproto .SSLProtocol .connection_made
841+
842+ def remember_transport (proto , tr ):
843+ transports .append (weakref .ref (tr ))
844+ connection_made (proto , tr )
845+
846+ async def conn (addr ):
847+ try :
848+ await self .loop .create_connection (
849+ asyncio .Protocol , * addr ,
850+ ssl = client_sslctx , server_hostname = '' )
851+ except ssl .SSLCertVerificationError :
852+ pass
853+
854+ support .gc_collect ()
855+ with (self .tcp_server (server ) as srv , support .disable_gc (),
856+ mock .patch .object (sslproto .SSLProtocol , 'connection_made' ,
857+ remember_transport )):
858+ self .loop .run_until_complete (conn (srv .addr ))
859+ self .assertEqual ([tr () for tr in transports ], [None ])
860+
861+ def test_start_tls_failed_certificate_no_cycles (self ):
862+ # gh-159049
863+ sslctx = test_utils .simple_server_sslcontext ()
864+ client_sslctx = test_utils .simple_client_sslcontext (
865+ disable_verify = False )
866+ transports = []
867+
868+ def server (sock ):
869+ try :
870+ sock .start_tls (sslctx , server_side = True )
871+ except OSError :
872+ pass
873+
874+ async def client (addr ):
875+ tr , proto = await self .loop .create_connection (
876+ asyncio .Protocol , * addr )
877+ transports .append (weakref .ref (tr ))
878+ try :
879+ await self .loop .start_tls (
880+ tr , proto , client_sslctx , server_hostname = '' )
881+ except ssl .SSLCertVerificationError :
882+ pass
883+
884+ support .gc_collect ()
885+ with self .tcp_server (server ) as srv , support .disable_gc ():
886+ self .loop .run_until_complete (client (srv .addr ))
887+ self .assertEqual ([tr () for tr in transports ], [None ])
888+
827889 def test_start_tls_client_corrupted_ssl (self ):
828890 self .loop .set_exception_handler (lambda loop , ctx : None )
829891
0 commit comments