mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
Issue #25764: Preserve subprocess fork exception when preexec_fn used
Also fix handling of failure to release the import lock.
This commit is contained in:
parent
c7217d7c22
commit
afdd51343c
3 changed files with 37 additions and 17 deletions
|
@ -47,17 +47,25 @@
|
|||
#define POSIX_CALL(call) do { if ((call) == -1) goto error; } while (0)
|
||||
|
||||
|
||||
/* Given the gc module call gc.enable() and return 0 on success. */
|
||||
/* If gc was disabled, call gc.enable(). Return 0 on success. */
|
||||
static int
|
||||
_enable_gc(PyObject *gc_module)
|
||||
_enable_gc(int need_to_reenable_gc, PyObject *gc_module)
|
||||
{
|
||||
PyObject *result;
|
||||
_Py_IDENTIFIER(enable);
|
||||
PyObject *exctype, *val, *tb;
|
||||
|
||||
result = _PyObject_CallMethodId(gc_module, &PyId_enable, NULL);
|
||||
if (result == NULL)
|
||||
return 1;
|
||||
Py_DECREF(result);
|
||||
if (need_to_reenable_gc) {
|
||||
PyErr_Fetch(&exctype, &val, &tb);
|
||||
result = _PyObject_CallMethodId(gc_module, &PyId_enable, NULL);
|
||||
if (exctype != NULL) {
|
||||
PyErr_Restore(exctype, val, tb);
|
||||
}
|
||||
if (result == NULL) {
|
||||
return 1;
|
||||
}
|
||||
Py_DECREF(result);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -691,6 +699,7 @@ subprocess_fork_exec(PyObject* self, PyObject *args)
|
|||
_PyImport_ReleaseLock() < 0 && !PyErr_Occurred()) {
|
||||
PyErr_SetString(PyExc_RuntimeError,
|
||||
"not holding the import lock");
|
||||
pid = -1;
|
||||
}
|
||||
import_lock_held = 0;
|
||||
|
||||
|
@ -702,9 +711,8 @@ subprocess_fork_exec(PyObject* self, PyObject *args)
|
|||
_Py_FreeCharPArray(exec_array);
|
||||
|
||||
/* Reenable gc in the parent process (or if fork failed). */
|
||||
if (need_to_reenable_gc && _enable_gc(gc_module)) {
|
||||
Py_XDECREF(gc_module);
|
||||
return NULL;
|
||||
if (_enable_gc(need_to_reenable_gc, gc_module)) {
|
||||
pid = -1;
|
||||
}
|
||||
Py_XDECREF(preexec_fn_args_tuple);
|
||||
Py_XDECREF(gc_module);
|
||||
|
@ -726,14 +734,7 @@ cleanup:
|
|||
Py_XDECREF(converted_args);
|
||||
Py_XDECREF(fast_args);
|
||||
Py_XDECREF(preexec_fn_args_tuple);
|
||||
|
||||
/* Reenable gc if it was disabled. */
|
||||
if (need_to_reenable_gc) {
|
||||
PyObject *exctype, *val, *tb;
|
||||
PyErr_Fetch(&exctype, &val, &tb);
|
||||
_enable_gc(gc_module);
|
||||
PyErr_Restore(exctype, val, tb);
|
||||
}
|
||||
_enable_gc(need_to_reenable_gc, gc_module);
|
||||
Py_XDECREF(gc_module);
|
||||
return NULL;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue