https://github.com/python/cpython/commit/b12af0a48f4afa9b26656d4588589f28979ed6d7
commit: b12af0a48f4afa9b26656d4588589f28979ed6d7
branch: main
author: Kumar Aditya <[email protected]>
committer: kumaraditya303 <[email protected]>
date: 2025-03-20T12:02:05+05:30
summary:
gh-131401: fix data races in exception handling (#131447)
files:
M Python/ceval.c
M Python/errors.c
diff --git a/Python/ceval.c b/Python/ceval.c
index 42f5eaddd2e510..0090a2c79ec7ef 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -3120,7 +3120,7 @@ _PyEval_FormatKwargsError(PyThreadState *tstate, PyObject
*func, PyObject *kwarg
}
else if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
PyObject *exc = _PyErr_GetRaisedException(tstate);
- PyObject *args = ((PyBaseExceptionObject *)exc)->args;
+ PyObject *args = PyException_GetArgs(exc);
if (exc && PyTuple_Check(args) && PyTuple_GET_SIZE(args) == 1) {
_PyErr_Clear(tstate);
PyObject *funcstr = _PyObject_FunctionStr(func);
@@ -3137,6 +3137,7 @@ _PyEval_FormatKwargsError(PyThreadState *tstate, PyObject
*func, PyObject *kwarg
else {
_PyErr_SetRaisedException(tstate, exc);
}
+ Py_DECREF(args);
}
}
diff --git a/Python/errors.c b/Python/errors.c
index 306fb073bc2296..14999d6dbaf72e 100644
--- a/Python/errors.c
+++ b/Python/errors.c
@@ -517,7 +517,7 @@ _PyErr_Fetch(PyThreadState *tstate, PyObject **p_type,
PyObject **p_value,
}
else {
*p_type = Py_NewRef(Py_TYPE(exc));
- *p_traceback = Py_XNewRef(((PyBaseExceptionObject *)exc)->traceback);
+ *p_traceback = PyException_GetTraceback(exc);
}
}
@@ -545,7 +545,7 @@ PyErr_Clear(void)
}
static PyObject*
-get_exc_type(PyObject *exc_value) /* returns a borrowed ref */
+get_exc_type(PyObject *exc_value) /* returns a strong ref */
{
if (exc_value == NULL || exc_value == Py_None) {
return Py_None;
@@ -554,12 +554,12 @@ get_exc_type(PyObject *exc_value) /* returns a borrowed
ref */
assert(PyExceptionInstance_Check(exc_value));
PyObject *type = PyExceptionInstance_Class(exc_value);
assert(type != NULL);
- return type;
+ return Py_NewRef(type);
}
}
static PyObject*
-get_exc_traceback(PyObject *exc_value) /* returns a borrowed ref */
+get_exc_traceback(PyObject *exc_value) /* returns a strong ref */
{
if (exc_value == NULL || exc_value == Py_None) {
return Py_None;
@@ -567,7 +567,6 @@ get_exc_traceback(PyObject *exc_value) /* returns a
borrowed ref */
else {
assert(PyExceptionInstance_Check(exc_value));
PyObject *tb = PyException_GetTraceback(exc_value);
- Py_XDECREF(tb);
return tb ? tb : Py_None;
}
}
@@ -578,9 +577,9 @@ _PyErr_GetExcInfo(PyThreadState *tstate,
{
_PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
- *p_type = Py_XNewRef(get_exc_type(exc_info->exc_value));
+ *p_type = get_exc_type(exc_info->exc_value);
*p_value = Py_XNewRef(exc_info->exc_value);
- *p_traceback = Py_XNewRef(get_exc_traceback(exc_info->exc_value));
+ *p_traceback = get_exc_traceback(exc_info->exc_value);
}
PyObject*
@@ -641,14 +640,19 @@ _PyErr_StackItemToExcInfoTuple(_PyErr_StackItem *err_info)
exc_value == Py_None ||
PyExceptionInstance_Check(exc_value));
+ PyObject *ret = PyTuple_New(3);
+ if (ret == NULL) {
+ return NULL;
+ }
+
PyObject *exc_type = get_exc_type(exc_value);
PyObject *exc_traceback = get_exc_traceback(exc_value);
- return PyTuple_Pack(
- 3,
- exc_type ? exc_type : Py_None,
- exc_value ? exc_value : Py_None,
- exc_traceback ? exc_traceback : Py_None);
+ PyTuple_SET_ITEM(ret, 0, exc_type ? exc_type : Py_None);
+ PyTuple_SET_ITEM(ret, 1, exc_value ? Py_NewRef(exc_value) : Py_None);
+ PyTuple_SET_ITEM(ret, 2, exc_traceback ? exc_traceback : Py_None);
+
+ return ret;
}
_______________________________________________
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]