Skip to content

Commit 79ceccd

Browse files
authored
bpo-38410: Properly handle PySys_Audit() failures (GH-16657)
1 parent 62d21c9 commit 79ceccd

File tree

4 files changed

+20
-12
lines changed

4 files changed

+20
-12
lines changed

Include/cpython/ceval.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ PyAPI_DATA(int) _PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyO
1111
PyAPI_FUNC(void) PyEval_SetTrace(Py_tracefunc, PyObject *);
1212
PyAPI_FUNC(int) _PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg);
1313
PyAPI_FUNC(int) _PyEval_GetCoroutineOriginTrackingDepth(void);
14-
PyAPI_FUNC(void) _PyEval_SetAsyncGenFirstiter(PyObject *);
14+
PyAPI_FUNC(int) _PyEval_SetAsyncGenFirstiter(PyObject *);
1515
PyAPI_FUNC(PyObject *) _PyEval_GetAsyncGenFirstiter(void);
16-
PyAPI_FUNC(void) _PyEval_SetAsyncGenFinalizer(PyObject *);
16+
PyAPI_FUNC(int) _PyEval_SetAsyncGenFinalizer(PyObject *);
1717
PyAPI_FUNC(PyObject *) _PyEval_GetAsyncGenFinalizer(void);
1818

1919
/* Helper to look up a builtin object */
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Properly handle :func:`sys.audit` failures in
2+
:func:`sys.set_asyncgen_hooks`.

Python/ceval.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4785,17 +4785,18 @@ _PyEval_GetCoroutineOriginTrackingDepth(void)
47854785
return tstate->coroutine_origin_tracking_depth;
47864786
}
47874787

4788-
void
4788+
int
47894789
_PyEval_SetAsyncGenFirstiter(PyObject *firstiter)
47904790
{
47914791
PyThreadState *tstate = _PyThreadState_GET();
47924792

47934793
if (PySys_Audit("sys.set_asyncgen_hook_firstiter", NULL) < 0) {
4794-
return;
4794+
return -1;
47954795
}
47964796

47974797
Py_XINCREF(firstiter);
47984798
Py_XSETREF(tstate->async_gen_firstiter, firstiter);
4799+
return 0;
47994800
}
48004801

48014802
PyObject *
@@ -4805,17 +4806,18 @@ _PyEval_GetAsyncGenFirstiter(void)
48054806
return tstate->async_gen_firstiter;
48064807
}
48074808

4808-
void
4809+
int
48094810
_PyEval_SetAsyncGenFinalizer(PyObject *finalizer)
48104811
{
48114812
PyThreadState *tstate = _PyThreadState_GET();
48124813

48134814
if (PySys_Audit("sys.set_asyncgen_hook_finalizer", NULL) < 0) {
4814-
return;
4815+
return -1;
48154816
}
48164817

48174818
Py_XINCREF(finalizer);
48184819
Py_XSETREF(tstate->async_gen_finalizer, finalizer);
4820+
return 0;
48194821
}
48204822

48214823
PyObject *

Python/sysmodule.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1222,10 +1222,12 @@ sys_set_asyncgen_hooks(PyObject *self, PyObject *args, PyObject *kw)
12221222
Py_TYPE(finalizer)->tp_name);
12231223
return NULL;
12241224
}
1225-
_PyEval_SetAsyncGenFinalizer(finalizer);
1225+
if (_PyEval_SetAsyncGenFinalizer(finalizer) < 0) {
1226+
return NULL;
1227+
}
12261228
}
1227-
else if (finalizer == Py_None) {
1228-
_PyEval_SetAsyncGenFinalizer(NULL);
1229+
else if (finalizer == Py_None && _PyEval_SetAsyncGenFinalizer(NULL) < 0) {
1230+
return NULL;
12291231
}
12301232

12311233
if (firstiter && firstiter != Py_None) {
@@ -1235,10 +1237,12 @@ sys_set_asyncgen_hooks(PyObject *self, PyObject *args, PyObject *kw)
12351237
Py_TYPE(firstiter)->tp_name);
12361238
return NULL;
12371239
}
1238-
_PyEval_SetAsyncGenFirstiter(firstiter);
1240+
if (_PyEval_SetAsyncGenFirstiter(firstiter) < 0) {
1241+
return NULL;
1242+
}
12391243
}
1240-
else if (firstiter == Py_None) {
1241-
_PyEval_SetAsyncGenFirstiter(NULL);
1244+
else if (firstiter == Py_None && _PyEval_SetAsyncGenFirstiter(NULL) < 0) {
1245+
return NULL;
12421246
}
12431247

12441248
Py_RETURN_NONE;

0 commit comments

Comments
 (0)