From: Jeremy Hylton Date: Fri, 14 Dec 2001 16:15:11 +0000 (+0000) Subject: Partial fix for problem in SF buf #487458 X-Git-Tag: v2.2.1c1~368 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2a05bc72d61377772ed988507bd67961bcbf35a0;p=python 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. --- diff --git a/Lib/asyncore.py b/Lib/asyncore.py index 5740fe1fc2..e79593a7c6 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