Skip to content

Commit

Permalink
Upgrade libuv to v1.48.0 (MagicStack#600)
Browse files Browse the repository at this point in the history
* Fix for libuv 1.48
* Fix for macOS (resolve empty host string as "localhost")
* Add test

---------

Co-authored-by: Fantix King <[email protected]>
  • Loading branch information
niklasr22 and fantix authored Aug 15, 2024
1 parent 62f9239 commit 7777852
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 11 deletions.
16 changes: 14 additions & 2 deletions tests/test_dns.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,13 @@ def _test_getaddrinfo(self, *args, _patch=False, **kwargs):
a1 = patched_getaddrinfo(*args, **kwargs)
else:
a1 = socket.getaddrinfo(*args, **kwargs)
except socket.gaierror as ex:
except (socket.gaierror, UnicodeError) as ex:
err = ex

try:
a2 = self.loop.run_until_complete(
self.loop.getaddrinfo(*args, **kwargs))
except socket.gaierror as ex:
except (socket.gaierror, UnicodeError) as ex:
if err is not None:
self.assertEqual(ex.args, err.args)
else:
Expand Down Expand Up @@ -187,6 +187,18 @@ def test_getaddrinfo_20(self):
self._test_getaddrinfo('127.0.0.1', 80, type=socket.SOCK_STREAM,
flags=socket.AI_CANONNAME, _patch=patch)

# https://github.com/libuv/libuv/security/advisories/GHSA-f74f-cvh7-c6q6
# See also: https://github.com/MagicStack/uvloop/pull/600
def test_getaddrinfo_21(self):
payload = f'0x{"0" * 246}7f000001.example.com'.encode('ascii')
self._test_getaddrinfo(payload, 80)
self._test_getaddrinfo(payload, 80, type=socket.SOCK_STREAM)

def test_getaddrinfo_22(self):
payload = f'0x{"0" * 246}7f000001.example.com'
self._test_getaddrinfo(payload, 80)
self._test_getaddrinfo(payload, 80, type=socket.SOCK_STREAM)

######

def test_getnameinfo_1(self):
Expand Down
24 changes: 16 additions & 8 deletions uvloop/dns.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,11 @@ cdef class AddrInfoRequest(UVRequest):

if host is None:
chost = NULL
elif host == b'' and sys.platform == 'darwin':
# It seems `getaddrinfo("", ...)` on macOS is equivalent to
# `getaddrinfo("localhost", ...)`. This is inconsistent with
# libuv 1.48 which treats empty nodename as EINVAL.
chost = <char*>'localhost'
else:
chost = <char*>host

Expand All @@ -356,13 +361,6 @@ cdef class AddrInfoRequest(UVRequest):
else:
cport = <char*>port

if cport is NULL and chost is NULL:
self.on_done()
msg = system.gai_strerror(socket_EAI_NONAME).decode('utf-8')
ex = socket_gaierror(socket_EAI_NONAME, msg)
callback(ex)
return

memset(&self.hints, 0, sizeof(system.addrinfo))
self.hints.ai_flags = flags
self.hints.ai_family = family
Expand All @@ -382,7 +380,17 @@ cdef class AddrInfoRequest(UVRequest):

if err < 0:
self.on_done()
callback(convert_error(err))
try:
if err == uv.UV_EINVAL:
# Convert UV_EINVAL to EAI_NONAME to match libc behavior
msg = system.gai_strerror(socket_EAI_NONAME).decode('utf-8')
ex = socket_gaierror(socket_EAI_NONAME, msg)
else:
ex = convert_error(err)
except Exception as ex:
callback(ex)
else:
callback(ex)


cdef class NameInfoRequest(UVRequest):
Expand Down
2 changes: 1 addition & 1 deletion vendor/libuv
Submodule libuv updated 240 files

0 comments on commit 7777852

Please sign in to comment.