Skip to content

Commit

Permalink
Merge branch 'master' into cython3_update
Browse files Browse the repository at this point in the history
  • Loading branch information
fantix authored Aug 26, 2024
2 parents ca06a74 + 4083a94 commit c11671c
Show file tree
Hide file tree
Showing 12 changed files with 66 additions and 20 deletions.
1 change: 1 addition & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ jobs:
test:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
os: [ubuntu-latest, macos-latest]
Expand Down
2 changes: 1 addition & 1 deletion README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ To build uvloop, you'll need Python 3.8 or greater:

.. code::
$ python3.7 -m venv uvloop-dev
$ python3 -m venv uvloop-dev
$ source uvloop-dev/bin/activate
3. Install development dependencies:
Expand Down
6 changes: 5 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,11 @@ def build_libuv(self):
cmd,
cwd=LIBUV_BUILD_DIR, env=env, check=True)

j_flag = '-j{}'.format(os.cpu_count() or 1)
try:
njobs = len(os.sched_getaffinity(0))
except AttributeError:
njobs = os.cpu_count()
j_flag = '-j{}'.format(njobs or 1)
c_flag = "CFLAGS={}".format(env['CFLAGS'])
subprocess.run(
['make', j_flag, c_flag],
Expand Down
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
5 changes: 3 additions & 2 deletions tests/test_tcp.py
Original file line number Diff line number Diff line change
Expand Up @@ -248,8 +248,9 @@ def test_create_server_4(self):
addr = sock.getsockname()

with self.assertRaisesRegex(OSError,
r"error while attempting.*\('127.*: "
r"address( already)? in use"):
r"error while attempting.*\('127.*:"
r"( \[errno \d+\])? address"
r"( already)? in use"):

self.loop.run_until_complete(
self.loop.create_server(object, *addr))
Expand Down
2 changes: 1 addition & 1 deletion uvloop/_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,4 @@
# supported platforms, publish the packages on PyPI, merge the PR
# to the target branch, create a Git tag pointing to the commit.

__version__ = '0.19.0'
__version__ = '0.20.0'
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
20 changes: 20 additions & 0 deletions uvloop/includes/compat.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include <errno.h>
#include <stddef.h>
#include <signal.h>
#include <sys/socket.h>
#include <sys/un.h>
#include "Python.h"
Expand Down Expand Up @@ -83,3 +84,22 @@ int Context_Exit(PyObject *ctx) {
}

#endif

/* inlined from cpython/Modules/signalmodule.c
* https://github.com/python/cpython/blob/v3.13.0a6/Modules/signalmodule.c#L1931-L1951
* private _Py_RestoreSignals has been moved to CPython internals in Python 3.13
* https://github.com/python/cpython/pull/106400 */

void
_Py_RestoreSignals(void)
{
#ifdef SIGPIPE
PyOS_setsig(SIGPIPE, SIG_DFL);
#endif
#ifdef SIGXFZ
PyOS_setsig(SIGXFZ, SIG_DFL);
#endif
#ifdef SIGXFSZ
PyOS_setsig(SIGXFSZ, SIG_DFL);
#endif
}
4 changes: 2 additions & 2 deletions uvloop/includes/python.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ cdef extern from "Python.h":
object PyUnicode_EncodeFSDefault(object)
void PyErr_SetInterrupt() nogil

void _Py_RestoreSignals()

object PyMemoryView_FromMemory(char *mem, ssize_t size, int flags)
object PyMemoryView_FromObject(object obj)
int PyMemoryView_Check(object obj)
Expand All @@ -29,3 +27,5 @@ cdef extern from "includes/compat.h":
void PyOS_BeforeFork()
void PyOS_AfterFork_Parent()
void PyOS_AfterFork_Child()

void _Py_RestoreSignals()
2 changes: 1 addition & 1 deletion uvloop/includes/uv.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ cdef extern from "uv.h" nogil:
cdef int SOL_SOCKET
cdef int SO_ERROR
cdef int SO_REUSEADDR
cdef int SO_REUSEPORT
# use has_SO_REUSEPORT and SO_REUSEPORT in stdlib.pxi instead
cdef int AF_INET
cdef int AF_INET6
cdef int AF_UNIX
Expand Down
2 changes: 1 addition & 1 deletion uvloop/loop.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -1774,7 +1774,7 @@ cdef class Loop:
if reuse_address:
sock.setsockopt(uv.SOL_SOCKET, uv.SO_REUSEADDR, 1)
if reuse_port:
sock.setsockopt(uv.SOL_SOCKET, uv.SO_REUSEPORT, 1)
sock.setsockopt(uv.SOL_SOCKET, SO_REUSEPORT, 1)
# Disable IPv4/IPv6 dual stack support (enabled by
# default on Linux) which makes a single socket
# listen on both address families.
Expand Down
2 changes: 1 addition & 1 deletion vendor/libuv
Submodule libuv updated 240 files

0 comments on commit c11671c

Please sign in to comment.