| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 61381d7 commit 20cc695
11 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -266,6 +266,7 @@ The variables defined in the :mod:`signal` module are: | |||
| 266 | 266 | .. data:: NSIG | |
| 267 | 267 | ||
| 268 | 268 | One more than the number of the highest signal number. | |
| 269 | + Use :func:`valid_signals` to get valid signal numbers. | ||
| 269 | 270 | ||
| 270 | 271 | ||
| 271 | 272 | .. data:: ITIMER_REAL | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -8,24 +8,8 @@ extern "C" { | |||
| 8 | 8 | # error "this header requires Py_BUILD_CORE define" | |
| 9 | 9 | #endif | |
| 10 | 10 | ||
| 11 | - #ifdef HAVE_SIGNAL_H | ||
| 12 | - #include <signal.h> | ||
| 13 | - #endif | ||
| 14 | - | ||
| 15 | 11 | #include "pycore_runtime.h" // _PyRuntimeState | |
| 16 | 12 | ||
| 17 | - #ifndef NSIG | ||
| 18 | - # if defined(_NSIG) | ||
| 19 | - # define NSIG _NSIG /* For BSD/SysV */ | ||
| 20 | - # elif defined(_SIGMAX) | ||
| 21 | - # define NSIG (_SIGMAX + 1) /* For QNX */ | ||
| 22 | - # elif defined(SIGMAX) | ||
| 23 | - # define NSIG (SIGMAX + 1) /* For djgpp */ | ||
| 24 | - # else | ||
| 25 | - # define NSIG 64 /* Use a reasonable default value */ | ||
| 26 | - # endif | ||
| 27 | - #endif | ||
| 28 | - | ||
| 29 | 13 | /* Forward declarations */ | |
| 30 | 14 | struct _PyArgv; | |
| 31 | 15 | struct pyruntimestate; | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,35 @@ | |||
| 1 | + // Define Py_NSIG constant for signal handling. | ||
| 2 | + | ||
| 3 | + #ifndef Py_INTERNAL_SIGNAL_H | ||
| 4 | + #define Py_INTERNAL_SIGNAL_H | ||
| 5 | + #ifdef __cplusplus | ||
| 6 | + extern "C" { | ||
| 7 | + #endif | ||
| 8 | + | ||
| 9 | + #ifndef Py_BUILD_CORE | ||
| 10 | + # error "this header requires Py_BUILD_CORE define" | ||
| 11 | + #endif | ||
| 12 | + | ||
| 13 | + #include <signal.h> // NSIG | ||
| 14 | + | ||
| 15 | + #ifdef _SIG_MAXSIG | ||
| 16 | + // gh-91145: On FreeBSD, <signal.h> defines NSIG as 32: it doesn't include | ||
| 17 | + // realtime signals: [SIGRTMIN,SIGRTMAX]. Use _SIG_MAXSIG instead. For | ||
| 18 | + // example on x86-64 FreeBSD 13, SIGRTMAX is 126 and _SIG_MAXSIG is 128. | ||
| 19 | + # define Py_NSIG _SIG_MAXSIG | ||
| 20 | + #elif defined(NSIG) | ||
| 21 | + # define Py_NSIG NSIG | ||
| 22 | + #elif defined(_NSIG) | ||
| 23 | + # define Py_NSIG _NSIG // BSD/SysV | ||
| 24 | + #elif defined(_SIGMAX) | ||
| 25 | + # define Py_NSIG (_SIGMAX + 1) // QNX | ||
| 26 | + #elif defined(SIGMAX) | ||
| 27 | + # define Py_NSIG (SIGMAX + 1) // djgpp | ||
| 28 | + #else | ||
| 29 | + # define Py_NSIG 64 // Use a reasonable default value | ||
| 30 | + #endif | ||
| 31 | + | ||
| 32 | + #ifdef __cplusplus | ||
| 33 | + } | ||
| 34 | + #endif | ||
| 35 | + #endif // !Py_INTERNAL_SIGNAL_H | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -116,6 +116,16 @@ def test_valid_signals(self): | |||
| 116 | 116 | self.assertNotIn(signal.NSIG, s) | |
| 117 | 117 | self.assertLess(len(s), signal.NSIG) | |
| 118 | 118 | ||
| 119 | + # gh-91145: Make sure that all SIGxxx constants exposed by the Python | ||
| 120 | + # signal module have a number in the [0; signal.NSIG-1] range. | ||
| 121 | + for name in dir(signal): | ||
| 122 | + if not name.startswith("SIG"): | ||
| 123 | + continue | ||
| 124 | + with self.subTest(name=name): | ||
| 125 | + signum = getattr(signal, name) | ||
| 126 | + self.assertGreaterEqual(signum, 0) | ||
| 127 | + self.assertLess(signum, signal.NSIG) | ||
| 128 | + | ||
| 119 | 129 | @unittest.skipUnless(sys.executable, "sys.executable required.") | |
| 120 | 130 | @support.requires_subprocess() | |
| 121 | 131 | def test_keyboard_interrupt_exit_code(self): | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1622,6 +1622,7 @@ PYTHON_HEADERS= \ | |||
| 1622 | 1622 | $(srcdir)/Include/internal/pycore_pystate.h \ | |
| 1623 | 1623 | $(srcdir)/Include/internal/pycore_runtime.h \ | |
| 1624 | 1624 | $(srcdir)/Include/internal/pycore_runtime_init.h \ | |
| 1625 | + $(srcdir)/Include/internal/pycore_signal.h \ | ||
| 1625 | 1626 | $(srcdir)/Include/internal/pycore_sliceobject.h \ | |
| 1626 | 1627 | $(srcdir)/Include/internal/pycore_strhex.h \ | |
| 1627 | 1628 | $(srcdir)/Include/internal/pycore_structseq.h \ | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,3 @@ | |||
| 1 | + Fix :data:`signal.NSIG` value on FreeBSD to accept signal numbers greater than | ||
| 2 | + 32, like :data:`signal.SIGRTMIN` and :data:`signal.SIGRTMAX`. Patch by Victor | ||
| 3 | + Stinner. | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -2,6 +2,7 @@ | |||
| 2 | 2 | #include "pycore_initconfig.h" // _PyStatus_ERR | |
| 3 | 3 | #include "pycore_pyerrors.h" // _Py_DumpExtensionModules | |
| 4 | 4 | #include "pycore_pystate.h" // _PyThreadState_GET() | |
| 5 | + #include "pycore_signal.h" // Py_NSIG | ||
| 5 | 6 | #include "pycore_traceback.h" // _Py_DumpTracebackThreads | |
| 6 | 7 | ||
| 7 | 8 | #include "frameobject.h" | |
@@ -115,19 +116,6 @@ typedef struct { | |||
| 115 | 116 | ||
| 116 | 117 | static user_signal_t *user_signals; | |
| 117 | 118 | ||
| 118 | - /* the following macros come from Python: Modules/signalmodule.c */ | ||
| 119 | - #ifndef NSIG | ||
| 120 | - # if defined(_NSIG) | ||
| 121 | - # define NSIG _NSIG /* For BSD/SysV */ | ||
| 122 | - # elif defined(_SIGMAX) | ||
| 123 | - # define NSIG (_SIGMAX + 1) /* For QNX */ | ||
| 124 | - # elif defined(SIGMAX) | ||
| 125 | - # define NSIG (SIGMAX + 1) /* For djgpp */ | ||
| 126 | - # else | ||
| 127 | - # define NSIG 64 /* Use a reasonable default value */ | ||
| 128 | - # endif | ||
| 129 | - #endif | ||
| 130 | - | ||
| 131 | 119 | static void faulthandler_user(int signum); | |
| 132 | 120 | #endif /* FAULTHANDLER_USER */ | |
| 133 | 121 | ||
@@ -896,7 +884,7 @@ check_signum(int signum) | |||
| 896 | 884 | return 0; | |
| 897 | 885 | } | |
| 898 | 886 | } | |
| 899 | - if (signum < 1 || NSIG <= signum) { | ||
| 887 | + if (signum < 1 || Py_NSIG <= signum) { | ||
| 900 | 888 | PyErr_SetString(PyExc_ValueError, "signal number out of range"); | |
| 901 | 889 | return 0; | |
| 902 | 890 | } | |
@@ -935,7 +923,7 @@ faulthandler_register_py(PyObject *self, | |||
| 935 | 923 | return NULL; | |
| 936 | 924 | ||
| 937 | 925 | if (user_signals == NULL) { | |
| 938 | - user_signals = PyMem_Calloc(NSIG, sizeof(user_signal_t)); | ||
| 926 | + user_signals = PyMem_Calloc(Py_NSIG, sizeof(user_signal_t)); | ||
| 939 | 927 | if (user_signals == NULL) | |
| 940 | 928 | return PyErr_NoMemory(); | |
| 941 | 929 | } | |
@@ -1215,7 +1203,7 @@ faulthandler_traverse(PyObject *module, visitproc visit, void *arg) | |||
| 1215 | 1203 | Py_VISIT(thread.file); | |
| 1216 | 1204 | #ifdef FAULTHANDLER_USER | |
| 1217 | 1205 | if (user_signals != NULL) { | |
| 1218 | - for (size_t signum=0; signum < NSIG; signum++) | ||
| 1206 | + for (size_t signum=0; signum < Py_NSIG; signum++) | ||
| 1219 | 1207 | Py_VISIT(user_signals[signum].file); | |
| 1220 | 1208 | } | |
| 1221 | 1209 | #endif | |
@@ -1416,7 +1404,7 @@ void _PyFaulthandler_Fini(void) | |||
| 1416 | 1404 | #ifdef FAULTHANDLER_USER | |
| 1417 | 1405 | /* user */ | |
| 1418 | 1406 | if (user_signals != NULL) { | |
| 1419 | - for (size_t signum=0; signum < NSIG; signum++) { | ||
| 1407 | + for (size_t signum=0; signum < Py_NSIG; signum++) { | ||
| 1420 | 1408 | faulthandler_unregister(&user_signals[signum], signum); | |
| 1421 | 1409 | } | |
| 1422 | 1410 | PyMem_Free(user_signals); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -29,6 +29,7 @@ | |||
| 29 | 29 | #include "pycore_moduleobject.h" // _PyModule_GetState() | |
| 30 | 30 | #include "pycore_object.h" // _PyObject_LookupSpecial() | |
| 31 | 31 | #include "pycore_pystate.h" // _PyInterpreterState_GET() | |
| 32 | + #include "pycore_signal.h" // Py_NSIG | ||
| 32 | 33 | ||
| 33 | 34 | #include "structmember.h" // PyMemberDef | |
| 34 | 35 | #ifndef MS_WINDOWS | |
@@ -1503,10 +1504,11 @@ _Py_Sigset_Converter(PyObject *obj, void *addr) | |||
| 1503 | 1504 | while ((item = PyIter_Next(iterator)) != NULL) { | |
| 1504 | 1505 | signum = PyLong_AsLongAndOverflow(item, &overflow); | |
| 1505 | 1506 | Py_DECREF(item); | |
| 1506 | - if (signum <= 0 || signum >= NSIG) { | ||
| 1507 | + if (signum <= 0 || signum >= Py_NSIG) { | ||
| 1507 | 1508 | if (overflow || signum != -1 || !PyErr_Occurred()) { | |
| 1508 | 1509 | PyErr_Format(PyExc_ValueError, | |
| 1509 | - "signal number %ld out of range", signum); | ||
| 1510 | + "signal number %ld out of range [1; %i]", | ||
| 1511 | + signum, Py_NSIG - 1); | ||
| 1510 | 1512 | } | |
| 1511 | 1513 | goto error; | |
| 1512 | 1514 | } | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -7,13 +7,13 @@ | |||
| 7 | 7 | #include "pycore_atomic.h" // _Py_atomic_int | |
| 8 | 8 | #include "pycore_call.h" // _PyObject_Call() | |
| 9 | 9 | #include "pycore_ceval.h" // _PyEval_SignalReceived() | |
| 10 | + #include "pycore_emscripten_signal.h" // _Py_CHECK_EMSCRIPTEN_SIGNALS | ||
| 10 | 11 | #include "pycore_fileutils.h" // _Py_BEGIN_SUPPRESS_IPH | |
| 11 | 12 | #include "pycore_frame.h" // _PyInterpreterFrame | |
| 12 | 13 | #include "pycore_moduleobject.h" // _PyModule_GetState() | |
| 13 | 14 | #include "pycore_pyerrors.h" // _PyErr_SetString() | |
| 14 | - #include "pycore_pylifecycle.h" // NSIG | ||
| 15 | 15 | #include "pycore_pystate.h" // _PyThreadState_GET() | |
| 16 | - #include "pycore_emscripten_signal.h" // _Py_CHECK_EMSCRIPTEN_SIGNALS | ||
| 16 | + #include "pycore_signal.h" // Py_NSIG | ||
| 17 | 17 | ||
| 18 | 18 | #ifndef MS_WINDOWS | |
| 19 | 19 | # include "posixmodule.h" | |
@@ -106,7 +106,7 @@ static volatile struct { | |||
| 106 | 106 | * (even though it would probably be otherwise, anyway). | |
| 107 | 107 | */ | |
| 108 | 108 | _Py_atomic_address func; | |
| 109 | - } Handlers[NSIG]; | ||
| 109 | + } Handlers[Py_NSIG]; | ||
| 110 | 110 | ||
| 111 | 111 | #ifdef MS_WINDOWS | |
| 112 | 112 | #define INVALID_FD ((SOCKET_T)-1) | |
@@ -542,7 +542,7 @@ signal_signal_impl(PyObject *module, int signalnum, PyObject *handler) | |||
| 542 | 542 | "of the main interpreter"); | |
| 543 | 543 | return NULL; | |
| 544 | 544 | } | |
| 545 | - if (signalnum < 1 || signalnum >= NSIG) { | ||
| 545 | + if (signalnum < 1 || signalnum >= Py_NSIG) { | ||
| 546 | 546 | _PyErr_SetString(tstate, PyExc_ValueError, | |
| 547 | 547 | "signal number out of range"); | |
| 548 | 548 | return NULL; | |
@@ -601,7 +601,7 @@ signal_getsignal_impl(PyObject *module, int signalnum) | |||
| 601 | 601 | /*[clinic end generated code: output=35b3e0e796fd555e input=ac23a00f19dfa509]*/ | |
| 602 | 602 | { | |
| 603 | 603 | PyObject *old_handler; | |
| 604 | - if (signalnum < 1 || signalnum >= NSIG) { | ||
| 604 | + if (signalnum < 1 || signalnum >= Py_NSIG) { | ||
| 605 | 605 | PyErr_SetString(PyExc_ValueError, | |
| 606 | 606 | "signal number out of range"); | |
| 607 | 607 | return NULL; | |
@@ -634,7 +634,7 @@ signal_strsignal_impl(PyObject *module, int signalnum) | |||
| 634 | 634 | { | |
| 635 | 635 | const char *res; | |
| 636 | 636 | ||
| 637 | - if (signalnum < 1 || signalnum >= NSIG) { | ||
| 637 | + if (signalnum < 1 || signalnum >= Py_NSIG) { | ||
| 638 | 638 | PyErr_SetString(PyExc_ValueError, | |
| 639 | 639 | "signal number out of range"); | |
| 640 | 640 | return NULL; | |
@@ -712,7 +712,7 @@ static PyObject * | |||
| 712 | 712 | signal_siginterrupt_impl(PyObject *module, int signalnum, int flag) | |
| 713 | 713 | /*[clinic end generated code: output=063816243d85dd19 input=4160acacca3e2099]*/ | |
| 714 | 714 | { | |
| 715 | - if (signalnum < 1 || signalnum >= NSIG) { | ||
| 715 | + if (signalnum < 1 || signalnum >= Py_NSIG) { | ||
| 716 | 716 | PyErr_SetString(PyExc_ValueError, | |
| 717 | 717 | "signal number out of range"); | |
| 718 | 718 | return NULL; | |
@@ -964,7 +964,7 @@ sigset_to_set(sigset_t mask) | |||
| 964 | 964 | if (result == NULL) | |
| 965 | 965 | return NULL; | |
| 966 | 966 | ||
| 967 | - for (sig = 1; sig < NSIG; sig++) { | ||
| 967 | + for (sig = 1; sig < Py_NSIG; sig++) { | ||
| 968 | 968 | if (sigismember(&mask, sig) != 1) | |
| 969 | 969 | continue; | |
| 970 | 970 | ||
@@ -1439,13 +1439,15 @@ the first is the signal number, the second is the interrupted stack frame."); | |||
| 1439 | 1439 | static int | |
| 1440 | 1440 | signal_add_constants(PyObject *module) | |
| 1441 | 1441 | { | |
| 1442 | + if (PyModule_AddIntConstant(module, "NSIG", Py_NSIG) < 0) { | ||
| 1443 | + return -1; | ||
| 1444 | + } | ||
| 1445 | + | ||
| 1442 | 1446 | #define ADD_INT_MACRO(macro) \ | |
| 1443 | 1447 | if (PyModule_AddIntConstant(module, #macro, macro) < 0) { \ | |
| 1444 | 1448 | return -1; \ | |
| 1445 | 1449 | } | |
| 1446 | 1450 | ||
| 1447 | - ADD_INT_MACRO(NSIG); | ||
| 1448 | - | ||
| 1449 | 1451 | // SIG_xxx pthread_sigmask() constants | |
| 1450 | 1452 | #ifdef SIG_BLOCK | |
| 1451 | 1453 | ADD_INT_MACRO(SIG_BLOCK); | |
@@ -1605,7 +1607,7 @@ static int | |||
| 1605 | 1607 | signal_get_set_handlers(signal_state_t *state, PyObject *mod_dict) | |
| 1606 | 1608 | { | |
| 1607 | 1609 | // Get signal handlers | |
| 1608 | - for (int signum = 1; signum < NSIG; signum++) { | ||
| 1610 | + for (int signum = 1; signum < Py_NSIG; signum++) { | ||
| 1609 | 1611 | void (*c_handler)(int) = PyOS_getsig(signum); | |
| 1610 | 1612 | PyObject *func; | |
| 1611 | 1613 | if (c_handler == SIG_DFL) { | |
@@ -1762,7 +1764,7 @@ _PySignal_Fini(void) | |||
| 1762 | 1764 | signal_state_t *state = &signal_global_state; | |
| 1763 | 1765 | ||
| 1764 | 1766 | // Restore default signals and clear handlers | |
| 1765 | - for (int signum = 1; signum < NSIG; signum++) { | ||
| 1767 | + for (int signum = 1; signum < Py_NSIG; signum++) { | ||
| 1766 | 1768 | PyObject *func = get_handler(signum); | |
| 1767 | 1769 | _Py_atomic_store_relaxed(&Handlers[signum].tripped, 0); | |
| 1768 | 1770 | set_handler(signum, NULL); | |
@@ -1828,7 +1830,7 @@ _PyErr_CheckSignalsTstate(PyThreadState *tstate) | |||
| 1828 | 1830 | ||
| 1829 | 1831 | _PyInterpreterFrame *frame = tstate->cframe->current_frame; | |
| 1830 | 1832 | signal_state_t *state = &signal_global_state; | |
| 1831 | - for (int i = 1; i < NSIG; i++) { | ||
| 1833 | + for (int i = 1; i < Py_NSIG; i++) { | ||
| 1832 | 1834 | if (!_Py_atomic_load_relaxed(&Handlers[i].tripped)) { | |
| 1833 | 1835 | continue; | |
| 1834 | 1836 | } | |
@@ -1905,7 +1907,7 @@ _PyErr_CheckSignals(void) | |||
| 1905 | 1907 | int | |
| 1906 | 1908 | PyErr_SetInterruptEx(int signum) | |
| 1907 | 1909 | { | |
| 1908 | - if (signum < 1 || signum >= NSIG) { | ||
| 1910 | + if (signum < 1 || signum >= Py_NSIG) { | ||
| 1909 | 1911 | return -1; | |
| 1910 | 1912 | } | |
| 1911 | 1913 | ||
@@ -1995,7 +1997,7 @@ _PySignal_Init(int install_signal_handlers) | |||
| 1995 | 1997 | } | |
| 1996 | 1998 | #endif | |
| 1997 | 1999 | ||
| 1998 | - for (int signum = 1; signum < NSIG; signum++) { | ||
| 2000 | + for (int signum = 1; signum < Py_NSIG; signum++) { | ||
| 1999 | 2001 | _Py_atomic_store_relaxed(&Handlers[signum].tripped, 0); | |
| 2000 | 2002 | } | |
| 2001 | 2003 | ||
@@ -2045,7 +2047,7 @@ _clear_pending_signals(void) | |||
| 2045 | 2047 | } | |
| 2046 | 2048 | ||
| 2047 | 2049 | _Py_atomic_store(&is_tripped, 0); | |
| 2048 | - for (int i = 1; i < NSIG; ++i) { | ||
| 2050 | + for (int i = 1; i < Py_NSIG; ++i) { | ||
| 2049 | 2051 | _Py_atomic_store_relaxed(&Handlers[i].tripped, 0); | |
| 2050 | 2052 | } | |
| 2051 | 2053 | } | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -238,6 +238,7 @@ | |||
| 238 | 238 | <ClInclude Include="..\Include\internal\pycore_pystate.h" /> | |
| 239 | 239 | <ClInclude Include="..\Include\internal\pycore_runtime.h" /> | |
| 240 | 240 | <ClInclude Include="..\Include\internal\pycore_runtime_init.h" /> | |
| 241 | + <ClInclude Include="..\Include\internal\pycore_signal.h" /> | ||
| 241 | 242 | <ClInclude Include="..\Include\internal\pycore_sliceobject.h" /> | |
| 242 | 243 | <ClInclude Include="..\Include\internal\pycore_strhex.h" /> | |
| 243 | 244 | <ClInclude Include="..\Include\internal\pycore_structseq.h" /> | |
| Back | FazBrowse Home | New Git URL |
0 commit comments