New submission from Paul McGuire:

In writing a simple UDP client using asyncio, I tripped over a call to 
getsockname() in the _SelectorTransport class in asyncio/selector_events.py.


    def __init__(self, loop, sock, protocol, extra=None, server=None):
        super().__init__(extra, loop)
        self._extra['socket'] = sock
        self._extra['sockname'] = sock.getsockname()

Since this is a sending-only client, the socket does not get bound to an 
address. On Linux, this is not a problem; getsockname() will return ('0.0.0.0', 
0) for IPV4, ('::', 0, 0, 0) for IPV6, and so on. But on Windows, a socket that 
is not bound to an address will raise this error when getsockname() is called:

    OSError: [WinError 10022] An invalid argument was supplied

This forces me to write a wrapper for the socket to intercept getsockname() and 
return None.

In asyncio/proactor_events.py, this is guarded against, with this code in the 
_ProactorSocketTransport class:

        try:
            self._extra['sockname'] = sock.getsockname()
        except (socket.error, AttributeError):
            if self._loop.get_debug():
                logger.warning("getsockname() failed on %r",
                             sock, exc_info=True)


Please add similar guarding code to the _SelectorTransport class in 
asyncio/selector_events.py.

----------
components: asyncio
messages: 273290
nosy: Paul McGuire, gvanrossum, haypo, yselivanov
priority: normal
severity: normal
status: open
title: Fail to create _SelectorTransport with unbound socket
type: behavior
versions: Python 3.6

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue27822>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to