[PATCH 2/2] tun: Kill the tunnel script's process group

Kevin Cernekee cernekee at gmail.com
Tue Nov 13 22:00:25 EST 2012


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 [1]; 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.

[1] http://www.gnu.org/software/bash/manual/html_node/Signals.html

Signed-off-by: Kevin Cernekee <cernekee at gmail.com>
---
 tun.c |    5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)


Note on portability:

I was able to find Linux, Solaris, FreeBSD, and OSX man pages for
setpgid() which is in POSIX.1.  I am "hoping" this means we don't need
a compat function, but I haven't verified anything other than Linux.


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__
-- 
1.7.10.4




More information about the openconnect-devel mailing list