From 17c68b8107e348aeaaa05f7ac5072cacff916022 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 30 Jan 2020 12:20:48 +0100 Subject: [PATCH] bpo-38631: Replace Py_FatalError() with assert() in ceval.c (GH-18279) Replace a few Py_FatalError() calls if tstate is NULL with assert(tstate != NULL) in ceval.c. PyEval_AcquireThread(), PyEval_ReleaseThread() and PyEval_RestoreThread() must never be called with a NULL tstate. --- Doc/c-api/init.rst | 2 +- Python/ceval.c | 14 ++++---------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 8913dbfe249..7ea48aec009 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -1110,7 +1110,7 @@ All of the following functions must be called after :c:func:`Py_Initialize`. .. c:function:: void PyEval_AcquireThread(PyThreadState *tstate) Acquire the global interpreter lock and set the current thread state to - *tstate*, which should not be ``NULL``. The lock must have been created earlier. + *tstate*, which must not be ``NULL``. The lock must have been created earlier. If this thread already has the lock, deadlock ensues. .. note:: diff --git a/Python/ceval.c b/Python/ceval.c index 2770dc6d08d..2bf64eda422 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -302,9 +302,7 @@ PyEval_ReleaseLock(void) void PyEval_AcquireThread(PyThreadState *tstate) { - if (tstate == NULL) { - Py_FatalError("PyEval_AcquireThread: NULL new thread state"); - } + assert(tstate != NULL); _PyRuntimeState *runtime = tstate->interp->runtime; struct _ceval_runtime_state *ceval = &runtime->ceval; @@ -321,9 +319,7 @@ PyEval_AcquireThread(PyThreadState *tstate) void PyEval_ReleaseThread(PyThreadState *tstate) { - if (tstate == NULL) { - Py_FatalError("PyEval_ReleaseThread: NULL thread state"); - } + assert(tstate != NULL); _PyRuntimeState *runtime = tstate->interp->runtime; PyThreadState *new_tstate = _PyThreadState_Swap(&runtime->gilstate, NULL); @@ -385,12 +381,10 @@ PyEval_SaveThread(void) void PyEval_RestoreThread(PyThreadState *tstate) { + assert(tstate != NULL); + _PyRuntimeState *runtime = tstate->interp->runtime; struct _ceval_runtime_state *ceval = &runtime->ceval; - - if (tstate == NULL) { - Py_FatalError("PyEval_RestoreThread: NULL tstate"); - } assert(gil_created(&ceval->gil)); int err = errno;