Comment 5 for bug 286871

Revision history for this message
Andrew Bennetts (spiv) wrote :

Ah, the main change to this code since 1.7 is that it attempts to listen on IPv6 if possible, as well as IPv4.

The relevant patch hunk is:

@@ -59,13 +62,18 @@
         from socket import error as socket_error
         self._socket_error = socket_error
         self._socket_timeout = socket_timeout
- self._server_socket = socket.socket()
+ addrs = socket.getaddrinfo(host, port, socket.AF_UNSPEC,
+ socket.SOCK_STREAM, 0, socket.AI_PASSIVE)[0]
+
+ (family, socktype, proto, canonname, sockaddr) = addrs
+
+ self._server_socket = socket.socket(family, socktype, proto)
         # SO_REUSERADDR has a different meaning on Windows
         if sys.platform != 'win32':
             self._server_socket.setsockopt(socket.SOL_SOCKET,
                 socket.SO_REUSEADDR, 1)
         try:
- self._server_socket.bind((host, port))
+ self._server_socket.bind(sockaddr)
         except self._socket_error, message:
             raise errors.CannotBindAddress(host, port, message)
         self._sockname = self._server_socket.getsockname()

So I guess attempting to bind to an IPv6 port is raising an unexpected sort of socket error on your system?

If you can tell us which exception is being raised, we can probably fix this to just fall back to the IPv4-only code when it occurs.