New submission from Péter Szabó <pts...@gmail.com>:

Here is how to reproduce the leak in Python 2.6.4 and Python 2.7:

  import gc
  import socket
  import ssl
  sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  gc.disable()
  gc.collect()
  count0 = gc.get_count()[0]
  for i in xrange(1000):
    ssl.SSLSocket(sock)
  count1 = gc.get_count()[0]
  # This should be less than 100 without the leak, but it is >1000.
  diff = count1 - count0
  assert diff < 1000, diff

The reason why the memory usage has increased is that the SSLSocket objects 
contain a circular reference (self -> __init__ ->  recv -> lambda -> self), and 
thus Python cannot free them without garbage collection.

A side effect is that if the SSLSocket doesn't have external references, the 
underlying socket._realsocket may remain unclosed for a long time (until the 
garbage collection kicks in), because the SSLSocket still refers to it. Another 
side effect is that when there is an exception in the wrapping in 
SSLSocket.accept() (e.g. keyfile not found), then the newly accepted socket 
won't get closed immediately, and the client will experience a hanging open 
socket.

With gc.enable(), the leak goes away (the garbage collector finds and frees the 
SSLSocket objects with circular reference). Python 3.1.1 is not affected since 
it has a very different SSLSocket implementation.

Here is an easy fix: replace the self.recv = lambda ... lines in the code of 
ssl.SSLSocket.__init__ with this:

  import socket as socket_module
  for attr in socket_module._delegate_methods:
    delattr(self, attr)  

See the attached patch. You can also download the patch from 
http://code.google.com/p/pts-mini-gpl/source/browse/trunk/patches/pts-python2.6.4-ssl-init-memory-leak-fix.patch

----------
components: IO, Library (Lib)
files: pts-python2.6.4-ssl-init-memory-leak-fix.patch
keywords: patch
messages: 99423
nosy: Péter.Szabó
severity: normal
status: open
title: Memory leak due to circular references in ssl.SSLSocket
type: resource usage
versions: Python 2.6, Python 2.7
Added file: 
http://bugs.python.org/file16234/pts-python2.6.4-ssl-init-memory-leak-fix.patch

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue7943>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to