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 5740fe1..e79593a 100644
--- a/Lib/asyncore.py
+++ b/Lib/asyncore.py
@@ -212,7 +212,13 @@
# 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