summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Cernekee <cernekee@gmail.com>2012-11-13 19:00:25 -0800
committerDavid Woodhouse <David.Woodhouse@intel.com>2012-11-14 10:09:33 +0000
commit2f9fa7cc11e1d643067c6c53487ddb8087d96239 (patch)
treef776ab63e565d0eb2a091b042b43040ee2f34e01
parent4bde16100ba05b162cf24311b4a77b34860c577b (diff)
downloadopenconnect-2f9fa7cc11e1d643067c6c53487ddb8087d96239.tar.gz
openconnect-2f9fa7cc11e1d643067c6c53487ddb8087d96239.tar.bz2
openconnect-2f9fa7cc11e1d643067c6c53487ddb8087d96239.zip
tun: Kill the tunnel script's process group
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 <cernekee@gmail.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
-rw-r--r--tun.c5
1 files changed, 4 insertions, 1 deletions
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__