https://github.com/python/cpython/commit/b6a2eef2c1e259fde6f416e34f9ecd636d17f0e9
commit: b6a2eef2c1e259fde6f416e34f9ecd636d17f0e9
branch: main
author: Victor Stinner <[email protected]>
committer: vstinner <[email protected]>
date: 2026-06-15T13:11:26+02:00
summary:
Fix issues reported by cpython-review-toolkit in faulthandler (#151341)
* snprintf() is not async-signal-safe: replace it with
_Py_DumpDecimal().
* Fix tid type from 'long' to 'unsigned long'.
* Replace PyLong_AsLong() with PyLong_AsInt().
* Avoid unnecessary narrowing cast on _Py_write_noraise() call.
files:
M Modules/faulthandler.c
diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c
index 7c727d8c2d4ff0e..3b0647152ceffed 100644
--- a/Modules/faulthandler.c
+++ b/Modules/faulthandler.c
@@ -101,8 +101,6 @@ static int
faulthandler_get_fileno(PyObject **file_ptr)
{
PyObject *result;
- long fd_long;
- int fd;
PyObject *file = *file_ptr;
if (file == NULL || file == Py_None) {
@@ -124,7 +122,7 @@ faulthandler_get_fileno(PyObject **file_ptr)
return -1;
}
}
- fd = PyLong_AsInt(file);
+ int fd = PyLong_AsInt(file);
if (fd == -1 && PyErr_Occurred())
return -1;
if (fd < 0) {
@@ -145,15 +143,16 @@ faulthandler_get_fileno(PyObject **file_ptr)
return -1;
}
- fd = -1;
+ int fd;
if (PyLong_Check(result)) {
- fd_long = PyLong_AsLong(result);
- if (0 <= fd_long && fd_long < INT_MAX)
- fd = (int)fd_long;
+ fd = PyLong_AsInt(result);
+ }
+ else {
+ fd = -1;
}
Py_DECREF(result);
- if (fd == -1) {
+ if (fd < 0) {
PyErr_SetString(PyExc_RuntimeError,
"file.fileno() is not a valid file descriptor");
Py_DECREF(file);
@@ -407,10 +406,8 @@ faulthandler_fatal_error(int signum)
PUTS(fd, "\n\n");
}
else {
- char unknown_signum[23] = {0,};
- snprintf(unknown_signum, 23, "%d", signum);
PUTS(fd, "Fatal Python error from unexpected signum: ");
- PUTS(fd, unknown_signum);
+ _Py_DumpDecimal(fd, signum);
PUTS(fd, "\n\n");
}
@@ -713,7 +710,7 @@ faulthandler_thread(void *unused)
/* Timeout => dump traceback */
assert(st == PY_LOCK_FAILURE);
- (void)_Py_write_noraise(thread.fd, thread.header,
(int)thread.header_len);
+ (void)_Py_write_noraise(thread.fd, thread.header, thread.header_len);
errmsg = PyUnstable_DumpTracebackThreads(thread.fd, thread.interp,
NULL,
thread.max_threads);
@@ -1224,7 +1221,7 @@ static PyObject *
faulthandler__fatal_error_c_thread_impl(PyObject *module)
/*[clinic end generated code: output=101bc8aaf4a5eec1 input=fbdca6fffd639a39]*/
{
- long tid;
+ unsigned long tid;
PyThread_type_lock lock;
faulthandler_suppress_crash_report();
@@ -1236,7 +1233,7 @@ faulthandler__fatal_error_c_thread_impl(PyObject *module)
PyThread_acquire_lock(lock, WAIT_LOCK);
tid = PyThread_start_new_thread(faulthandler_fatal_error_thread, lock);
- if (tid == -1) {
+ if (tid == PYTHREAD_INVALID_THREAD_ID) {
PyThread_free_lock(lock);
PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
return NULL;
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]