Skip to content

Commit f8fce9e

Browse files
committed
server: kill children on stop or sigterm
Don't let children run away -- kill them on `stop` command and `sigterm` signal. Signed-off-by: Pavel Boldin <pboldin@cloudlinux.com>
1 parent cd6ddf2 commit f8fce9e

2 files changed

Lines changed: 44 additions & 4 deletions

File tree

src/kpatch_user.c

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1741,11 +1741,27 @@ cmd_execve_startup(int fd, int argc, char *argv[], int is_just_started)
17411741
return 0;
17421742
}
17431743

1744+
static void
1745+
kill_and_wait(int pid)
1746+
{
1747+
int status;
1748+
1749+
(void) kill(pid, SIGTERM);
1750+
(void) waitpid(pid, &status, 0);
1751+
}
1752+
1753+
static int childpid;
1754+
17441755
static int
17451756
cmd_run(int argc, char *argv[])
17461757
{
17471758
int pid;
17481759

1760+
if (childpid) {
1761+
kill_and_wait(childpid);
1762+
childpid = 0;
1763+
}
1764+
17491765
pid = fork();
17501766
if (pid == -1) {
17511767
kplogerror("can't fork()\n");
@@ -1756,23 +1772,23 @@ cmd_run(int argc, char *argv[])
17561772
return execl("/bin/sh", "sh", "-c", argv[1], (char *)NULL);
17571773
}
17581774

1775+
childpid = pid;
17591776
printf("%d\n", pid);
17601777
return 0;
17611778
}
17621779

17631780
static int
17641781
cmd_kill(int argc, char *argv[])
17651782
{
1766-
int status, pid;
1783+
int pid;
17671784

17681785
if (sscanf(argv[1], "%d", &pid) != 1) {
17691786
kperr("can't parse pid from %s\n", argv[1]);
17701787
return -1;
17711788
}
17721789

17731790
kpdebug("killing %d\n", pid);
1774-
(void) kill(pid, SIGTERM);
1775-
(void) waitpid(pid, &status, 0);
1791+
kill_and_wait(pid);
17761792

17771793
return 0;
17781794
}
@@ -1946,14 +1962,34 @@ server_bind_socket(const char *path)
19461962
return rv;
19471963
}
19481964

1965+
static void
1966+
kill_child(int signum)
1967+
{
1968+
/* Hello Bulba my old friend... */
1969+
(void) signum;
1970+
if (childpid)
1971+
kill_and_wait(childpid);
1972+
exit(0x80 | signum);
1973+
}
1974+
19491975
static int
19501976
cmd_server(int argc, char *argv[])
19511977
{
19521978
int sfd = -1, cfd, rv;
1979+
struct sigaction act;
19531980

19541981
if (argc < 2)
19551982
return usage_server("UNIX socket argument is missing");
19561983

1984+
memset(&act, 0, sizeof(act));
1985+
act.sa_handler = kill_child;
1986+
act.sa_flags = SA_RESTART;
1987+
rv = sigaction(SIGTERM, &act, NULL);
1988+
if (rv < 0) {
1989+
kplogerror("can't install signal handler\n");
1990+
return -1;
1991+
}
1992+
19571993
sfd = server_bind_socket(argv[1]);
19581994
if (sfd < 0)
19591995
return sfd;
@@ -1973,6 +2009,9 @@ cmd_server(int argc, char *argv[])
19732009
break;
19742010
}
19752011

2012+
if (childpid)
2013+
kill_and_wait(childpid);
2014+
19762015
close(sfd);
19772016
return 0;
19782017
}

tests/run_tests.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -564,7 +564,8 @@ main() {
564564
trap 'tmpfile=$(mktemp);
565565
jobs -p > $tmpfile;
566566
while IFS= read -r pid; do kill $pid 2>/dev/null || :; done < $tmpfile;
567-
rm -f $tmpfile' 0
567+
rm -f $tmpfile;
568+
exit' EXIT TERM INT
568569

569570
nskipped=0
570571
nfailed=0

0 commit comments

Comments
 (0)