]> granicus.if.org Git - python/commitdiff
bpo-31323: Fix reference leak in test_ssl (#3263)
authorVictor Stinner <victor.stinner@gmail.com>
Fri, 1 Sep 2017 22:26:17 +0000 (00:26 +0200)
committerGitHub <noreply@github.com>
Fri, 1 Sep 2017 22:26:17 +0000 (00:26 +0200)
Store exceptions as string rather than object to prevent reference
cycles which cause leaking dangling threads.

Lib/test/test_ssl.py

index 104b7f377a52dbfb108c6d526d24286b515267b3..5e143f95e39b874fc7184eb78dd360eb62e4b3a3 100644 (file)
@@ -1889,7 +1889,11 @@ if _have_threads:
                     # XXX Various errors can have happened here, for example
                     # a mismatching protocol version, an invalid certificate,
                     # or a low-level bug. This should be made more discriminating.
-                    self.server.conn_errors.append(e)
+                    #
+                    # bpo-31323: Store the exception as string to prevent
+                    # a reference leak: server -> conn_errors -> exception
+                    # -> traceback -> self (ConnectionHandler) -> server
+                    self.server.conn_errors.append(str(e))
                     if self.server.chatty:
                         handle_error("\n server:  bad connection attempt from " + repr(self.addr) + ":\n")
                     self.running = False
@@ -3097,7 +3101,7 @@ if _have_threads:
                 with context.wrap_socket(socket.socket()) as s:
                     with self.assertRaises(OSError):
                         s.connect((HOST, server.port))
-            self.assertIn("no shared cipher", str(server.conn_errors[0]))
+            self.assertIn("no shared cipher", server.conn_errors[0])
 
         def test_version_basic(self):
             """