From 735460084991336dbd8e0c054bc939b209014d42 Mon Sep 17 00:00:00 2001 From: Roger Date: Wed, 8 Dec 2010 13:23:30 +0800 Subject: [PATCH] Fix a socket leak: delete object after close on both direction. (Note by apenwarr: seems to still work for me. The reason the problem occurred is that reassigning 'handlers' doesn't change it in its parent; it creates a whole new list, and the caller still owns the old one with all the dead sockets in it. The problem seems to have been introduced in commit 84376284db6199d4928797e5e8be4182449120f2 when I factored the runonce() functionality out of the client and server but didn't notice this reassignment.) --- ssnet.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ssnet.py b/ssnet.py index f307629..6f5b788 100644 --- a/ssnet.py +++ b/ssnet.py @@ -468,7 +468,10 @@ def runonce(handlers, mux): r = [] w = [] x = [] - handlers = filter(lambda s: s.ok, handlers) + to_remove = filter(lambda s: not s.ok, handlers) + for h in to_remove: + handlers.remove(h) + for s in handlers: s.pre_select(r,w,x) debug2('Waiting: %d r=%r w=%r x=%r (fullness=%d/%d)\n'