[PYTHON-CRYPTO] m2crypto - close_wait when running echod_async
Andre Reitz
reitz at INWORKS.DE
Tue Jun 22 11:47:28 CEST 2004
I did the same for me.
I think that this is the only solution.
By the way:
the patch on m2crypto homepage
doesn't work at all (at least under Python 2.2)
http://sandbox.rulemaker.net/ngps/Dist/0.13p1.patch <<--doesn't work.
Greetings, Andre'
On Mon, 21 Jun 2004 18:54:19 -0500
"CARNES, MARK E (MARK)" <carnesm at LUCENT.COM> wrote:
> I've been looking at a server that is using the SSL.ssl_dispatcher and asyncore.dispatcher, and noticed
> file descriptors that aren't being closed. I went back and ran the echod_async example from the demo
> directory and interestingly enough got the same result.
>
> It looks like the socket is never being closed on the server side. If I manually go do a self.socket.socket.close()
> I can get it to go away, but it looks like it normally wouldn't call that method unless it goes through the __del__
> method in Connection, and the reference count was never going to 0.
>
> The end result is that the "Connection" class self references its own methods "self._write_bio", and "self._write_nbio",
> which causes a circular reference and if you don't have garbage collection enabled, this object never gets collected.
>
> I tested a variation of "Connection" where I just created a "self.mode" and corresponding "self.send", "self.write", "self.recv",
> and "self.read" methods instead of using the method references.
>
> Is there a better way to approach this problem?
>
> Here's the code I changed
>
> -------------------------------------------------------------------------------------------------------------------------------------------------------------
>
> <<snip>>
>
> class Connection:
>
> """An SSL connection."""
>
> def __init__(self, ctx, sock=None):
> self.ctx = ctx
> self.ssl = m2.ssl_new(self.ctx.ctx)
> if sock is not None:
> self.socket = sock
> else:
> self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
> self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
> self._fileno = self.socket.fileno()
> self.mode = 0 # -- ADDED
>
> <<snip>>
>
> def setblocking(self, mode):
> """Set this connection's underlying socket to _mode_."""
> self.socket.setblocking(mode)
> self.mode = mode # -- ADDED
> # if mode: -- REMOVED
> # self.send = self.write = self._write_bio -- REMOVED
> # self.recv = self.read = self._read_bio -- REMOVED
> # else: -- REMOVED
> # self.send = self.write = self._write_nbio -- REMOVED
> # self.recv = self.read = self._read_nbio -- REMOVED
>
> # NEW METHODS FOLLOW
>
> def send(self, data):
> if self.mode:
> return self._write_bio(data)
> else:
> return self._write_nbio(data)
>
> def write(self, data):
> if self.mode:
> return self._write_bio(data)
> else:
> return self._write_nbio(data)
>
> def recv(self, size=1024):
> if self.mode:
> return self._read_bio(size)
> else:
> return self._read_nbio(size)
>
> def read(self, size=1024):
> if self.mode:
> return self._read_bio(size)
> else:
> return self._read_nbio(size)
>
> # END NEW METHODS
>
> <<snip>>
--
__________________________________________________________________________
Als Technologieunternehmen konzipieren und entwickeln wir maßgeschneiderte Feedback- und
Monitoring-Systeme - wie beispielsweise Lösungen für Beschwerde- und Ideenmanagement.
Mit dem Inquery® Survey Server bieten wir eine der leistungsfähigsten Standardlösungen für
Online-Umfragen mit dem Schwerpunkt auf der Messung von Kundenzufriedenheit an.
__________________________________________________________________________
Inworks GmbH
Andre Reitz, Leiter Entwicklung
Hörvelsinger Weg 39, 89081 Ulm, Germany
Tel +49 (0) 731 / 93807-21
Fax +49(0)731/93807-18
Internet: http://www.inworks.de
More information about the python-crypto
mailing list