[3.14] gh-137490: Fix signal.sigwaitinfo() on NetBSD (GH-137523) (GH-138935)

Handle ECANCELED in the same way as EINTR to work around the Posix
violation in the NetBSD's implementation.
(cherry picked from commit 07d0b95b05dfaf5832f44c2fbc956761f9e29571)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
Miss Islington (bot) 2025-10-08 14:33:30 +02:00 committed by GitHub
parent cbd532f2e8
commit 4e8f5e65eb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 9 additions and 1 deletions

View File

@ -0,0 +1,2 @@
Handle :data:`~errno.ECANCELED` in the same way as :data:`~errno.EINTR` in
:func:`signal.sigwaitinfo` on NetBSD.

View File

@ -1180,7 +1180,13 @@ signal_sigwaitinfo_impl(PyObject *module, sigset_t sigset)
err = sigwaitinfo(&sigset, &si);
Py_END_ALLOW_THREADS
} while (err == -1
&& errno == EINTR && !(async_err = PyErr_CheckSignals()));
&& (errno == EINTR
#if defined(__NetBSD__)
/* NetBSD's implementation violates POSIX by setting
* errno to ECANCELED instead of EINTR. */
|| errno == ECANCELED
#endif
) && !(async_err = PyErr_CheckSignals()));
if (err == -1)
return (!async_err) ? PyErr_SetFromErrno(PyExc_OSError) : NULL;