[issue40628] sockmodule.c: sock_connect vs negative errno values...

Ryan C. Gordon report at bugs.python.org
Thu May 14 14:55:17 EDT 2020


New submission from Ryan C. Gordon <icculus at icculus.org>:

(Forgive any obvious mistakes in this report, I'm almost illiterate with Python, doubly so with Python internals.)

In trying to get buildbot-worker running on Haiku ( https://haiku-os.org/ ), it runs into a situation where it tries to connect a non-blocking TCP socket, which correctly reports EINPROGRESS, and cpython/Modules/sockmodule.c's internal_connect() returns this error code to sock_connect() and sock_connect_ex().

Both of the sock_connect* functions will return NULL if the error code is negative, but on Haiku, all the errno values are negative (EINPROGRESS, for example, is -2147454940).

I _think_ what sock_connect is intending to do here...

    res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
    if (res < 0)
        return NULL;

...is say "if we had a devastating and unexpected system error, give up immediately." Buildbot-worker seems to confirm this by throwing this exception in response:

  builtins.SystemError: <method 'connect_ex' of '_socket.socket' objects> returned NULL without setting an error

internal_connect returns -1 in those devastating-and-unexpected cases--namely when an exception is to be raised--and does not ever use that to otherwise signify a legit socket error. Linux and other systems don't otherwise fall into this "res < 0" condition because errno values are positive on those systems.

So I believe the correct fix here, in sock_connect() and sock_connect_ex(), is to check "if (res == -1)" instead of "res < 0" and let all other negative error codes carry on.

If this seems like the correct approach, I can assemble a pull request, but I don't know the full ramifications of this small change, so I thought I'd report it here first.

--ryan.

----------
components: Extension Modules
messages: 368863
nosy: icculus
priority: normal
severity: normal
status: open
title: sockmodule.c: sock_connect vs negative errno values...
type: behavior
versions: Python 3.7

_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue40628>
_______________________________________


More information about the Python-bugs-list mailing list