diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-04-22-19-00-03.gh-issue-131591.CdEqBr.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-04-22-19-00-03.gh-issue-131591.CdEqBr.rst new file mode 100644 index 00000000000000..e237649e59207e --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-04-22-19-00-03.gh-issue-131591.CdEqBr.rst @@ -0,0 +1 @@ +Reset any :pep:`768` remote debugging pending call in children after :func:`os.fork` calls. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index b7300def8dc75f..8d7131b2eacf95 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -677,6 +677,14 @@ PyOS_AfterFork_Parent(void) run_at_forkers(interp->after_forkers_parent, 0); } +static void +reset_remotedebug_data(PyThreadState *tstate) +{ + tstate->remote_debugger_support.debugger_pending_call = 0; + memset(tstate->remote_debugger_support.debugger_script_path, 0, MAX_SCRIPT_PATH_SIZE); +} + + void PyOS_AfterFork_Child(void) { @@ -710,6 +718,8 @@ PyOS_AfterFork_Child(void) goto fatal_error; } + reset_remotedebug_data(tstate); + // Remove the dead thread states. We "start the world" once we are the only // thread state left to undo the stop the world call in `PyOS_BeforeFork`. // That needs to happen before `_PyThreadState_DeleteList`, because that