aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Python/errors.c
diff options
context:
space:
mode:
authorKumar Aditya <kumaraditya@python.org>2025-03-19 14:35:47 +0530
committerGitHub <noreply@github.com>2025-03-19 14:35:47 +0530
commit74b87515a72a2b7a6e601423f4b3b19b6566377f (patch)
treec47bd9125be4b116c0cd4e866d50d913af2d87cd /Python/errors.c
parent61b4b2c57c9327273f2e306bafa23cf2c70eac8e (diff)
downloadcpython-74b87515a72a2b7a6e601423f4b3b19b6566377f.tar.gz
cpython-74b87515a72a2b7a6e601423f4b3b19b6566377f.zip
gh-131401: fix data race in `_PyErr_Restore` (#131406)
Diffstat (limited to 'Python/errors.c')
-rw-r--r--Python/errors.c23
1 files changed, 10 insertions, 13 deletions
diff --git a/Python/errors.c b/Python/errors.c
index 04b0be089f9..306fb073bc2 100644
--- a/Python/errors.c
+++ b/Python/errors.c
@@ -73,7 +73,11 @@ _PyErr_Restore(PyThreadState *tstate, PyObject *type, PyObject *value,
assert(PyExceptionClass_Check(type));
if (value != NULL && type == (PyObject *)Py_TYPE(value)) {
/* Already normalized */
- assert(((PyBaseExceptionObject *)value)->traceback != Py_None);
+#ifdef Py_DEBUG
+ PyObject *tb = PyException_GetTraceback(value);
+ assert(tb != Py_None);
+ Py_XDECREF(tb);
+#endif
}
else {
PyObject *exc = _PyErr_CreateException(type, value);
@@ -86,22 +90,15 @@ _PyErr_Restore(PyThreadState *tstate, PyObject *type, PyObject *value,
value = exc;
}
assert(PyExceptionInstance_Check(value));
- if (traceback != NULL && !PyTraceBack_Check(traceback)) {
- if (traceback == Py_None) {
- Py_DECREF(Py_None);
- traceback = NULL;
- }
- else {
- PyErr_SetString(PyExc_TypeError, "traceback must be a Traceback or None");
- Py_XDECREF(value);
+ if (traceback != NULL) {
+ if (PyException_SetTraceback(value, traceback) < 0) {
+ Py_DECREF(traceback);
+ Py_DECREF(value);
Py_DECREF(type);
- Py_XDECREF(traceback);
return;
}
+ Py_DECREF(traceback);
}
- PyObject *old_traceback = ((PyBaseExceptionObject *)value)->traceback;
- ((PyBaseExceptionObject *)value)->traceback = traceback;
- Py_XDECREF(old_traceback);
_PyErr_SetRaisedException(tstate, value);
Py_DECREF(type);
}