]> granicus.if.org Git - python/commitdiff
Partial fix for problem in SF buf #487458
authorJeremy Hylton <jeremy@alum.mit.edu>
Fri, 14 Dec 2001 16:15:11 +0000 (16:15 +0000)
committerJeremy Hylton <jeremy@alum.mit.edu>
Fri, 14 Dec 2001 16:15:11 +0000 (16:15 +0000)
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

index 5740fe1fc2c8bf050630946f7bede202b95bdd5f..e79593a7c6f05489630b922c4ad000dde084cf95 100644 (file)
@@ -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