mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
[3.13] gh-130163: Fix crashes related to PySys_GetObject() (GH-130503) (GH-130556)
The use of PySys_GetObject() and _PySys_GetAttr(), which return a borrowed
reference, has been replaced by using one of the following functions, which
return a strong reference and distinguish a missing attribute from an error:
_PySys_GetOptionalAttr(), _PySys_GetOptionalAttrString(),
_PySys_GetRequiredAttr(), and _PySys_GetRequiredAttrString().
(cherry picked from commit 0ef4ffeefd
)
This commit is contained in:
parent
b0d3f49195
commit
7c1b76fce8
23 changed files with 505 additions and 180 deletions
|
@ -1530,14 +1530,15 @@ write_unraisable_exc(PyThreadState *tstate, PyObject *exc_type,
|
|||
PyObject *exc_value, PyObject *exc_tb, PyObject *err_msg,
|
||||
PyObject *obj)
|
||||
{
|
||||
PyObject *file = _PySys_GetAttr(tstate, &_Py_ID(stderr));
|
||||
PyObject *file;
|
||||
if (_PySys_GetOptionalAttr(&_Py_ID(stderr), &file) < 0) {
|
||||
return -1;
|
||||
}
|
||||
if (file == NULL || file == Py_None) {
|
||||
Py_XDECREF(file);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Hold a strong reference to ensure that sys.stderr doesn't go away
|
||||
while we use it */
|
||||
Py_INCREF(file);
|
||||
int res = write_unraisable_exc_file(tstate, exc_type, exc_value, exc_tb,
|
||||
err_msg, obj, file);
|
||||
Py_DECREF(file);
|
||||
|
@ -1636,13 +1637,20 @@ format_unraisable_v(const char *format, va_list va, PyObject *obj)
|
|||
goto error;
|
||||
}
|
||||
|
||||
PyObject *hook = _PySys_GetAttr(tstate, &_Py_ID(unraisablehook));
|
||||
PyObject *hook;
|
||||
if (_PySys_GetOptionalAttr(&_Py_ID(unraisablehook), &hook) < 0) {
|
||||
Py_DECREF(hook_args);
|
||||
err_msg_str = NULL;
|
||||
obj = NULL;
|
||||
goto error;
|
||||
}
|
||||
if (hook == NULL) {
|
||||
Py_DECREF(hook_args);
|
||||
goto default_hook;
|
||||
}
|
||||
|
||||
if (_PySys_Audit(tstate, "sys.unraisablehook", "OO", hook, hook_args) < 0) {
|
||||
Py_DECREF(hook);
|
||||
Py_DECREF(hook_args);
|
||||
err_msg_str = "Exception ignored in audit hook";
|
||||
obj = NULL;
|
||||
|
@ -1650,11 +1658,13 @@ format_unraisable_v(const char *format, va_list va, PyObject *obj)
|
|||
}
|
||||
|
||||
if (hook == Py_None) {
|
||||
Py_DECREF(hook);
|
||||
Py_DECREF(hook_args);
|
||||
goto default_hook;
|
||||
}
|
||||
|
||||
PyObject *res = PyObject_CallOneArg(hook, hook_args);
|
||||
Py_DECREF(hook);
|
||||
Py_DECREF(hook_args);
|
||||
if (res != NULL) {
|
||||
Py_DECREF(res);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue