From 2f9fa7cc11e1d643067c6c53487ddb8087d96239 Mon Sep 17 00:00:00 2001 From: Kevin Cernekee Date: Tue, 13 Nov 2012 19:00:25 -0800 Subject: tun: Kill the tunnel script's process group MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When invoked with --script-tun, openconnect starts the tunnel script via "/bin/sh -c 'SCRIPT'", then sends SIGHUP to the shell's PID when shutting down. However, non-interactive shells are not guaranteed to send SIGHUP to any running jobs¹; indeed, the observed behavior on Linux is that only the shell process receives SIGHUP, and the tunnel script continues running after openconnect exits. A quick fix is to set the child's pgid == pid, then send SIGHUP to the entire process group when we want to shut down. ¹ http://www.gnu.org/software/bash/manual/html_node/Signals.html Signed-off-by: Kevin Cernekee Signed-off-by: David Woodhouse --- tun.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tun.c b/tun.c index 831c11e..5c04177 100644 --- a/tun.c +++ b/tun.c @@ -652,6 +652,8 @@ int setup_tun(struct openconnect_info *vpninfo) perror(_("fork")); exit(1); } else if (!child) { + if (setpgid(0, getpid()) < 0) + perror(_("setpgid")); close(tun_fd); setenv_int("VPNFD", fds[1]); execl("/bin/sh", "/bin/sh", "-c", vpninfo->vpnc_script, NULL); @@ -786,7 +788,8 @@ int tun_mainloop(struct openconnect_info *vpninfo, int *timeout) void shutdown_tun(struct openconnect_info *vpninfo) { if (vpninfo->script_tun) { - kill(vpninfo->script_tun, SIGHUP); + /* nuke the whole process group */ + kill(-vpninfo->script_tun, SIGHUP); } else { script_config_tun(vpninfo, "disconnect"); #ifdef __sun__ -- cgit v1.2.3