From 2a05bc72d61377772ed988507bd67961bcbf35a0 Mon Sep 17 00:00:00 2001 From: Jeremy Hylton Date: Fri, 14 Dec 2001 16:15:11 +0000 Subject: Partial fix for problem in SF buf #487458 Rev 1.20 introduced a call to getpeername() in the dispatcher constructor. This only works for a connected socket. Apparently earlier versions of the code worked with un-connected sockets, e.g. a listening socket. It's not clear that the code is supposed to accept these sockets, because it sets self.connected = 1 when passed a socket. But it's also not clear that it should be a fatal error to pass a listening socket. The solution, for now, is to put a try/except around the getpeername() call and continue if it fails. The self.addr attribute is used primarily (only?) to produce a nice repr for the object, so it hardly matters. If there is a real error on a connected socket, it's likely that subsequent calls will fail too. --- Lib/asyncore.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Lib/asyncore.py b/Lib/asyncore.py index 5740fe1..e79593a 100644 --- a/Lib/asyncore.py +++ b/Lib/asyncore.py @@ -212,7 +212,13 @@ class dispatcher: # I think it should inherit this anyway self.socket.setblocking (0) self.connected = 1 - self.addr = sock.getpeername() + # XXX Does the constructor require that the socket passed + # be connected? + try: + self.addr = sock.getpeername() + except socket.error: + # The addr isn't crucial + pass else: self.socket = None -- cgit v0.12