[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:
Serhiy Storchaka 2025-02-26 00:50:26 +02:00 committed by GitHub
parent b0d3f49195
commit 7c1b76fce8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
23 changed files with 505 additions and 180 deletions

View file

@ -9,7 +9,7 @@
#include "pycore_intrinsics.h" // INTRINSIC_PRINT
#include "pycore_pyerrors.h" // _PyErr_SetString()
#include "pycore_runtime.h" // _Py_ID()
#include "pycore_sysmodule.h" // _PySys_GetAttr()
#include "pycore_sysmodule.h" // _PySys_GetRequiredAttr()
#include "pycore_typevarobject.h" // _Py_make_typevar()
@ -23,16 +23,16 @@ no_intrinsic1(PyThreadState* tstate, PyObject *unused)
}
static PyObject *
print_expr(PyThreadState* tstate, PyObject *value)
print_expr(PyThreadState* Py_UNUSED(ignored), PyObject *value)
{
PyObject *hook = _PySys_GetAttr(tstate, &_Py_ID(displayhook));
PyObject *hook = _PySys_GetRequiredAttr(&_Py_ID(displayhook));
// Can't use ERROR_IF here.
if (hook == NULL) {
_PyErr_SetString(tstate, PyExc_RuntimeError,
"lost sys.displayhook");
return NULL;
}
return PyObject_CallOneArg(hook, value);
PyObject *res = PyObject_CallOneArg(hook, value);
Py_DECREF(hook);
return res;
}
static int