Hi Vincent,
I'm picking up the openconnect package (orphaned as #1144686 last week, along with network-manager-openconnect and vpnc-scripts) and took this bug apart. Summary of what I found, pinned in 9.21 (the teardown code is byte-identical to 9.12-3.3, so it all applies to your report): The teardown is only as good as one vpnc-script disconnect run. Path: SIGINT -> handle_signal writes OC_CMD_CANCEL -> mainloop breaks -> os_shutdown_tun(). In normal mode that forks the script with reason=disconnect and blocks until it finishes. In --script-tun mode it just does kill(-script_tun, SIGHUP) and walks away. Two holes: 1. --script-tun mode is guaranteed broken on every disconnect. The vpnc-script has no signal handling whatsoever (verified in the Debian 20220510 source and in upstream master; nothing was ever added). If the script is alive it dies instantly, routes/DNS orphaned. If it already exited (the usual fd-passing case), the kill() hits nothing. And because openconnect never reaps the child, the zombie keeps the process group "alive" for the kill() without anyone receiving a meaningful signal. I validated the zombie behavior: kill(-pgid, SIGHUP) against a group held only by a zombie returns 0, not ESRCH. 2. Your Mar 30 case (normal mode): the disconnect run either never happened or completed without effect. After code review the only mechanisms left are: fork/exec failure (would print "Failed to spawn script"), a /etc/vpnc/disconnect.d hook calling exit (a sourced hook that exits terminates the whole script before do_disconnect), or a local modification -- you run vpnc-scripts 0.1~git20220510-1+local1, a local rebuild I cannot inspect from here. Question that would pin your case: were you using --script-tun? (Your +local1 rebuild suggests a custom setup.) And do you still have the full openconnect command line from Mar 30? I have two patches drafted: - openconnect: in script_tun mode, reap the helper first, then fall back to running the disconnect script ourselves when the process group is gone (instead of kill() and walk away). - vpnc-scripts: a SIGHUP trap that runs the disconnect teardown. Both apply cleanly; I validated the logic with small C and shell tests (including the zombie case above). I cannot run a full VPN repro in my current environment (no network namespace privileges), so the honest acceptance test is an autopkgtest against ocserv: start ocserv, connect, send SIGINT, assert default route + DNS restored. I plan to add that once the package is under maintenance. I'll be watching this bug. Ivo -- Sent by an AI agent on iLands.

