Skip to content

Commit 926440b

Browse files
bpo-38410: Properly handle PySys_Audit() failures
_PyEval_SetAsyncGenFinalizer() and _PyEval_SetAsyncGenFirstiter() didn't include proper error handling for their PySys_Audit() calls. Co-authored-by: Zackery Spytz <[email protected]>
1 parent eb4a3df commit 926440b

File tree

3 files changed

+57
-32
lines changed

3 files changed

+57
-32
lines changed
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`. Based on patch by Zackery Spytz.

Python/ceval.c

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4742,39 +4742,13 @@ _PyEval_GetCoroutineOriginTrackingDepth(void)
47424742
return tstate->coroutine_origin_tracking_depth;
47434743
}
47444744

4745-
void
4746-
_PyEval_SetAsyncGenFirstiter(PyObject *firstiter)
4747-
{
4748-
PyThreadState *tstate = _PyThreadState_GET();
4749-
4750-
if (PySys_Audit("sys.set_asyncgen_hook_firstiter", NULL) < 0) {
4751-
return;
4752-
}
4753-
4754-
Py_XINCREF(firstiter);
4755-
Py_XSETREF(tstate->async_gen_firstiter, firstiter);
4756-
}
4757-
47584745
PyObject *
47594746
_PyEval_GetAsyncGenFirstiter(void)
47604747
{
47614748
PyThreadState *tstate = _PyThreadState_GET();
47624749
return tstate->async_gen_firstiter;
47634750
}
47644751

4765-
void
4766-
_PyEval_SetAsyncGenFinalizer(PyObject *finalizer)
4767-
{
4768-
PyThreadState *tstate = _PyThreadState_GET();
4769-
4770-
if (PySys_Audit("sys.set_asyncgen_hook_finalizer", NULL) < 0) {
4771-
return;
4772-
}
4773-
4774-
Py_XINCREF(finalizer);
4775-
Py_XSETREF(tstate->async_gen_finalizer, finalizer);
4776-
}
4777-
47784752
PyObject *
47794753
_PyEval_GetAsyncGenFinalizer(void)
47804754
{

Python/sysmodule.c

Lines changed: 55 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1178,6 +1178,51 @@ static PyStructSequence_Desc asyncgen_hooks_desc = {
11781178
2
11791179
};
11801180

1181+
static int
1182+
set_async_gen_firstiter(PyObject *firstiter)
1183+
{
1184+
PyThreadState *tstate = _PyThreadState_GET();
1185+
1186+
if (PySys_Audit("sys.set_asyncgen_hook_firstiter", NULL) < 0) {
1187+
return -1;
1188+
}
1189+
1190+
Py_XINCREF(firstiter);
1191+
Py_XSETREF(tstate->async_gen_firstiter, firstiter);
1192+
return 0;
1193+
}
1194+
1195+
void
1196+
_PyEval_SetAsyncGenFirstiter(PyObject *firstiter)
1197+
{
1198+
if (set_async_gen_firstiter(firstiter) < 0) {
1199+
PyErr_WriteUnraisable(NULL);
1200+
}
1201+
}
1202+
1203+
static int
1204+
set_async_gen_finalizer(PyObject *finalizer)
1205+
{
1206+
PyThreadState *tstate = _PyThreadState_GET();
1207+
1208+
if (PySys_Audit("sys.set_asyncgen_hook_finalizer", NULL) < 0) {
1209+
return -1;
1210+
}
1211+
1212+
Py_XINCREF(finalizer);
1213+
Py_XSETREF(tstate->async_gen_finalizer, finalizer);
1214+
return 0;
1215+
}
1216+
1217+
void
1218+
_PyEval_SetAsyncGenFinalizer(PyObject *finalizer)
1219+
{
1220+
if (set_async_gen_finalizer(finalizer) < 0) {
1221+
PyErr_WriteUnraisable(NULL);
1222+
}
1223+
}
1224+
1225+
11811226
static PyObject *
11821227
sys_set_asyncgen_hooks(PyObject *self, PyObject *args, PyObject *kw)
11831228
{
@@ -1198,10 +1243,12 @@ sys_set_asyncgen_hooks(PyObject *self, PyObject *args, PyObject *kw)
11981243
Py_TYPE(finalizer)->tp_name);
11991244
return NULL;
12001245
}
1201-
_PyEval_SetAsyncGenFinalizer(finalizer);
1246+
if (set_async_gen_finalizer(finalizer) < 0) {
1247+
return NULL;
1248+
}
12021249
}
1203-
else if (finalizer == Py_None) {
1204-
_PyEval_SetAsyncGenFinalizer(NULL);
1250+
else if (finalizer == Py_None && set_async_gen_finalizer(NULL) < 0) {
1251+
return NULL;
12051252
}
12061253

12071254
if (firstiter && firstiter != Py_None) {
@@ -1211,10 +1258,12 @@ sys_set_asyncgen_hooks(PyObject *self, PyObject *args, PyObject *kw)
12111258
Py_TYPE(firstiter)->tp_name);
12121259
return NULL;
12131260
}
1214-
_PyEval_SetAsyncGenFirstiter(firstiter);
1261+
if (set_async_gen_firstiter(firstiter) < 0) {
1262+
return NULL;
1263+
}
12151264
}
1216-
else if (firstiter == Py_None) {
1217-
_PyEval_SetAsyncGenFirstiter(NULL);
1265+
else if (firstiter == Py_None && set_async_gen_firstiter(NULL) < 0) {
1266+
return NULL;
12181267
}
12191268

12201269
Py_RETURN_NONE;

0 commit comments

Comments
 (0)