bpo-38410: Properly handle PySys_Audit() failures (GH-18658)
_PyEval_SetAsyncGenFinalizer() and _PyEval_SetAsyncGenFirstiter() didn't include proper error handling for their PySys_Audit() calls. Co-authored-by: Zackery Spytz <zspytz@gmail.com>
This commit is contained in:
parent
a7b8a969eb
commit
87a4cd5fbe
|
@ -0,0 +1,2 @@
|
|||
Properly handle :func:`sys.audit` failures in
|
||||
:func:`sys.set_asyncgen_hooks`. Based on patch by Zackery Spytz.
|
|
@ -4742,19 +4742,6 @@ _PyEval_GetCoroutineOriginTrackingDepth(void)
|
|||
return tstate->coroutine_origin_tracking_depth;
|
||||
}
|
||||
|
||||
void
|
||||
_PyEval_SetAsyncGenFirstiter(PyObject *firstiter)
|
||||
{
|
||||
PyThreadState *tstate = _PyThreadState_GET();
|
||||
|
||||
if (PySys_Audit("sys.set_asyncgen_hook_firstiter", NULL) < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
Py_XINCREF(firstiter);
|
||||
Py_XSETREF(tstate->async_gen_firstiter, firstiter);
|
||||
}
|
||||
|
||||
PyObject *
|
||||
_PyEval_GetAsyncGenFirstiter(void)
|
||||
{
|
||||
|
@ -4762,19 +4749,6 @@ _PyEval_GetAsyncGenFirstiter(void)
|
|||
return tstate->async_gen_firstiter;
|
||||
}
|
||||
|
||||
void
|
||||
_PyEval_SetAsyncGenFinalizer(PyObject *finalizer)
|
||||
{
|
||||
PyThreadState *tstate = _PyThreadState_GET();
|
||||
|
||||
if (PySys_Audit("sys.set_asyncgen_hook_finalizer", NULL) < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
Py_XINCREF(finalizer);
|
||||
Py_XSETREF(tstate->async_gen_finalizer, finalizer);
|
||||
}
|
||||
|
||||
PyObject *
|
||||
_PyEval_GetAsyncGenFinalizer(void)
|
||||
{
|
||||
|
|
|
@ -1178,6 +1178,51 @@ static PyStructSequence_Desc asyncgen_hooks_desc = {
|
|||
2
|
||||
};
|
||||
|
||||
static int
|
||||
set_async_gen_firstiter(PyObject *firstiter)
|
||||
{
|
||||
PyThreadState *tstate = _PyThreadState_GET();
|
||||
|
||||
if (PySys_Audit("sys.set_asyncgen_hook_firstiter", NULL) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
Py_XINCREF(firstiter);
|
||||
Py_XSETREF(tstate->async_gen_firstiter, firstiter);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
_PyEval_SetAsyncGenFirstiter(PyObject *firstiter)
|
||||
{
|
||||
if (set_async_gen_firstiter(firstiter) < 0) {
|
||||
PyErr_WriteUnraisable(NULL);
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
set_async_gen_finalizer(PyObject *finalizer)
|
||||
{
|
||||
PyThreadState *tstate = _PyThreadState_GET();
|
||||
|
||||
if (PySys_Audit("sys.set_asyncgen_hook_finalizer", NULL) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
Py_XINCREF(finalizer);
|
||||
Py_XSETREF(tstate->async_gen_finalizer, finalizer);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
_PyEval_SetAsyncGenFinalizer(PyObject *finalizer)
|
||||
{
|
||||
if (set_async_gen_finalizer(finalizer) < 0) {
|
||||
PyErr_WriteUnraisable(NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static PyObject *
|
||||
sys_set_asyncgen_hooks(PyObject *self, PyObject *args, PyObject *kw)
|
||||
{
|
||||
|
@ -1198,10 +1243,12 @@ sys_set_asyncgen_hooks(PyObject *self, PyObject *args, PyObject *kw)
|
|||
Py_TYPE(finalizer)->tp_name);
|
||||
return NULL;
|
||||
}
|
||||
_PyEval_SetAsyncGenFinalizer(finalizer);
|
||||
if (set_async_gen_finalizer(finalizer) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
else if (finalizer == Py_None) {
|
||||
_PyEval_SetAsyncGenFinalizer(NULL);
|
||||
}
|
||||
else if (finalizer == Py_None && set_async_gen_finalizer(NULL) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (firstiter && firstiter != Py_None) {
|
||||
|
@ -1211,10 +1258,12 @@ sys_set_asyncgen_hooks(PyObject *self, PyObject *args, PyObject *kw)
|
|||
Py_TYPE(firstiter)->tp_name);
|
||||
return NULL;
|
||||
}
|
||||
_PyEval_SetAsyncGenFirstiter(firstiter);
|
||||
if (set_async_gen_firstiter(firstiter) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
else if (firstiter == Py_None) {
|
||||
_PyEval_SetAsyncGenFirstiter(NULL);
|
||||
}
|
||||
else if (firstiter == Py_None && set_async_gen_firstiter(NULL) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Py_RETURN_NONE;
|
||||
|
|
Loading…
Reference in New Issue