classification
Title: test_socket (testGetaddrinfo) failing on OS X 10.6.8 (32-bit)
Type: Stage: resolved
Components: Library (Lib), Tests Versions: Python 3.4, Python 3.3, Python 2.7
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: ned.deily Nosy List: geoffreyspear, ned.deily, python-dev
Priority: normal Keywords:

Created on 2014-02-12 02:10 by geoffreyspear, last changed 2014-02-14 06:58 by ned.deily. This issue is now closed.

Messages (6)
msg211053 - (view) Author: Geoffrey Spear (geoffreyspear) * Date: 2014-02-12 02:10
On OS X 10.6.8, I'm getting the following result for test_socket:

[cpython] % ./python.exe -m test test_socket
[1/1] test_socket
/Users/geoff/Documents/programming/cpython/Lib/test/test_socket.py:1721: RuntimeWarning: received malformed or improperly-truncated ancillary data
  result = sock.recvmsg(bufsize, *args)
/Users/geoff/Documents/programming/cpython/Lib/test/test_socket.py:1812: RuntimeWarning: received malformed or improperly-truncated ancillary data
  result = sock.recvmsg_into([buf], *args)
test test_socket failed -- Traceback (most recent call last):
  File "/Users/geoff/Documents/programming/cpython/Lib/test/test_socket.py", line 1169, in testGetaddrinfo
    socket.getaddrinfo("localhost", None, 0, 0, 0, socket.AI_NUMERICSERV)
socket.gaierror: [Errno 8] nodename nor servname provided, or not known

1 test failed:
    test_socket


According to the OS X manpage for getaddrinfo(3), (and RFC 3493) this error is the expected behavior for a POSIX socket implementation:

                    AI_NUMERICSERV  If the AI_NUMERICSERV bit is set, then a
                                    non-null servname string supplied shall be
                                    a numeric port string.  Otherwise, an
                                    EAI_NONAME error shall be returned.  This
                                    bit shall prevent any type of name resolu-
                                    tion service (for example, NIS+) from
                                    being invoked.

(servname is the 2nd argument to getaddrinfo(), where the test passes None. EAI_NONAME is Errno 8.)

Confirmed on 2.7.6, 3.3 and current HEAD of 3.4; the offending test code didn't exist in 3.2 and earlier.
msg211058 - (view) Author: Ned Deily (ned.deily) * (Python committer) Date: 2014-02-12 07:05
The test works for me on OS X 10.6 and OS X 10.9.  My guess is that the problem you are seeing is due to a failing lookup of "localhost".  What does your Python report for:

socket.gethostbyname("localhost")

The getaddrinfo(3) man page description does not really cover the case here since Python's socketmodule.c contains a workaround to prevent an OS X segfault (Issue17269) so the test that is failing is actually equivalent to:

socket.getaddrinfo("localhost", "00", 0, 0, 0, socket.AI_NUMERICSERV)

The equivalent C code executes without error on my systems regardless whether it is meaningful.
msg211082 - (view) Author: Geoffrey Spear (geoffreyspear) * Date: 2014-02-12 11:15
Ned:

>>> socket.gethostbyname("localhost")
'127.0.0.1'

>>> socket.getaddrinfo("localhost", "00", 0, 0, 0, socket.AI_NUMERICSERV)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.4/socket.py", line 530, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno 8] nodename nor servname provided, or not known


And to show that using AI_NUMERICSERV isn't *completely* broken on my machine:

>>> socket.getaddrinfo("localhost", "80", 0, 0, 0, socket.AI_NUMERICSERV)
[(<AddressFamily.AF_INET: 2>, <SocketType.SOCK_DGRAM: 2>, 17, '', ('127.0.0.1', 80)), (<AddressFamily.AF_INET: 2>, <SocketType.SOCK_STREAM: 1>, 6, '', ('127.0.0.1', 80)), (<AddressFamily.AF_INET6: 30>, <SocketType.SOCK_DGRAM: 2>, 17, '', ('::1', 80, 0, 0)), (<AddressFamily.AF_INET6: 30>, <SocketType.SOCK_STREAM: 1>, 6, '', ('::1', 80, 0, 0)), (<AddressFamily.AF_INET6: 30>, <SocketType.SOCK_DGRAM: 2>, 17, '', ('fe80::1%lo0', 80, 0, 1)), (<AddressFamily.AF_INET6: 30>, <SocketType.SOCK_STREAM: 1>, 6, '', ('fe80::1%lo0', 80, 0, 1))]
msg211120 - (view) Author: Ned Deily (ned.deily) * (Python committer) Date: 2014-02-13 00:15
OK, OK, it's not just your machine :=)  I was finally able to reproduce the same failure on a different 10.6 system.  I'm still not sure what the difference between them is but it really doesn't matter.  I have a patch forthcoming to make the test work in either case.
msg211203 - (view) Author: Roundup Robot (python-dev) Date: 2014-02-14 06:54
New changeset 6017d19669c3 by Ned Deily in branch '2.7':
Issue #20605: Make test_socket getaddrinfo OS X segfault test more robust.
http://hg.python.org/cpython/rev/6017d19669c3

New changeset 11a75f141cec by Ned Deily in branch '3.3':
Issue #20605: Make test_socket getaddrinfo OS X segfault test more robust.
http://hg.python.org/cpython/rev/11a75f141cec

New changeset 378bdb92e5b7 by Ned Deily in branch 'default':
Issue #20605: Make test_socket getaddrinfo OS X segfault test more robust.
http://hg.python.org/cpython/rev/378bdb92e5b7
msg211204 - (view) Author: Ned Deily (ned.deily) * (Python committer) Date: 2014-02-14 06:58
The committed changes should prevent spurious test failures.  Thanks for the report.
History
Date User Action Args
2014-02-14 06:58:08ned.deilysetstatus: open -> closed
resolution: fixed
messages: + msg211204

stage: needs patch -> resolved
2014-02-14 06:54:41python-devsetnosy: + python-dev
messages: + msg211203
2014-02-13 00:15:51ned.deilysetassignee: ned.deily
messages: + msg211120
stage: needs patch
2014-02-12 11:15:39geoffreyspearsetmessages: + msg211082
2014-02-12 07:05:12ned.deilysetnosy: + ned.deily
messages: + msg211058
2014-02-12 02:10:17geoffreyspearcreate