Skip to content

Commit 74b8751

Browse files
gh-131401: fix data race in _PyErr_Restore (#131406)
1 parent 61b4b2c commit 74b8751

File tree

1 file changed

+10
-13
lines changed

1 file changed

+10
-13
lines changed

Python/errors.c

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,11 @@ _PyErr_Restore(PyThreadState *tstate, PyObject *type, PyObject *value,
7373
assert(PyExceptionClass_Check(type));
7474
if (value != NULL && type == (PyObject *)Py_TYPE(value)) {
7575
/* Already normalized */
76-
assert(((PyBaseExceptionObject *)value)->traceback != Py_None);
76+
#ifdef Py_DEBUG
77+
PyObject *tb = PyException_GetTraceback(value);
78+
assert(tb != Py_None);
79+
Py_XDECREF(tb);
80+
#endif
7781
}
7882
else {
7983
PyObject *exc = _PyErr_CreateException(type, value);
@@ -86,22 +90,15 @@ _PyErr_Restore(PyThreadState *tstate, PyObject *type, PyObject *value,
8690
value = exc;
8791
}
8892
assert(PyExceptionInstance_Check(value));
89-
if (traceback != NULL && !PyTraceBack_Check(traceback)) {
90-
if (traceback == Py_None) {
91-
Py_DECREF(Py_None);
92-
traceback = NULL;
93-
}
94-
else {
95-
PyErr_SetString(PyExc_TypeError, "traceback must be a Traceback or None");
96-
Py_XDECREF(value);
93+
if (traceback != NULL) {
94+
if (PyException_SetTraceback(value, traceback) < 0) {
95+
Py_DECREF(traceback);
96+
Py_DECREF(value);
9797
Py_DECREF(type);
98-
Py_XDECREF(traceback);
9998
return;
10099
}
100+
Py_DECREF(traceback);
101101
}
102-
PyObject *old_traceback = ((PyBaseExceptionObject *)value)->traceback;
103-
((PyBaseExceptionObject *)value)->traceback = traceback;
104-
Py_XDECREF(old_traceback);
105102
_PyErr_SetRaisedException(tstate, value);
106103
Py_DECREF(type);
107104
}

0 commit comments

Comments
 (0)