From a07669704798cb0262485f69c5547033c64ade58 Mon Sep 17 00:00:00 2001
From: Felix Fietkau <nbd@nbd.name>
Date: Fri, 2 Dec 2016 13:52:57 +0100
Subject: [PATCH] ujail: send SIGKILL to jail process if SIGTERM fails

Signed-off-by: Felix Fietkau <nbd@nbd.name>
---
 jail/jail.c | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/jail/jail.c b/jail/jail.c
index c442847..834d677 100644
--- a/jail/jail.c
+++ b/jail/jail.c
@@ -269,8 +269,14 @@ static int exec_jail(void *_notused)
 static int jail_running = 1;
 static int jail_return_code = 0;
 
+static void jail_process_timeout_cb(struct uloop_timeout *t);
+static struct uloop_timeout jail_process_timeout = {
+	.cb = jail_process_timeout_cb,
+};
+
 static void jail_process_handler(struct uloop_process *c, int ret)
 {
+	uloop_timeout_cancel(&jail_process_timeout);
 	if (WIFEXITED(ret)) {
 		jail_return_code = WEXITSTATUS(ret);
 		INFO("jail (%d) exited with exit: %d\n", c->pid, jail_return_code);
@@ -286,6 +292,12 @@ static struct uloop_process jail_process = {
 	.cb = jail_process_handler,
 };
 
+static void jail_process_timeout_cb(struct uloop_timeout *t)
+{
+	DEBUG("jail process failed to stop, sending SIGKILL\n");
+	kill(jail_process.pid, SIGKILL);
+}
+
 int main(int argc, char **argv)
 {
 	uid_t uid = getuid();
@@ -398,12 +410,13 @@ int main(int argc, char **argv)
 		/* parent process */
 		uloop_process_add(&jail_process);
 		uloop_run();
-		uloop_done();
 		if (jail_running) {
 			DEBUG("uloop interrupted, killing jail process\n");
 			kill(jail_process.pid, SIGTERM);
-			waitpid(jail_process.pid, NULL, 0);
+			uloop_timeout_set(&jail_process_timeout, 1000);
+			uloop_run();
 		}
+		uloop_done();
 		return jail_return_code;
 	} else if (jail_process.pid == 0) {
 		/* fork child process */
-- 
2.25.1