From a517934abaa18fe5609c63ba334f8f217ff632ea Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Sun, 5 Jun 2022 19:30:16 +0200 Subject: [PATCH] subproc: Allow killing subprocesses with different signal `subproc::killAndReapAll()` is always killing the child process with the SIGKILL signal. We're about to make this configurable though so that we may optionally forward signals received by nsjail to the child process. Add a new parameter to `killAndReapAll()` to prepare for this change. --- nsjail.cc | 4 ++-- subproc.cc | 4 ++-- subproc.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/nsjail.cc b/nsjail.cc index be8b604..c3ae10b 100644 --- a/nsjail.cc +++ b/nsjail.cc @@ -222,7 +222,7 @@ static int listenMode(nsjconf_t* nsjconf) { } for (;;) { if (sigFatal > 0) { - subproc::killAndReapAll(nsjconf); + subproc::killAndReapAll(nsjconf, SIGKILL); logs::logStop(sigFatal); close(listenfd); return EXIT_SUCCESS; @@ -285,7 +285,7 @@ static int standaloneMode(nsjconf_t* nsjconf) { subproc::displayProc(nsjconf); } if (sigFatal > 0) { - subproc::killAndReapAll(nsjconf); + subproc::killAndReapAll(nsjconf, SIGKILL); logs::logStop(sigFatal); return (128 + sigFatal); } diff --git a/subproc.cc b/subproc.cc index 4d20975..bb886b6 100644 --- a/subproc.cc +++ b/subproc.cc @@ -389,10 +389,10 @@ int reapProc(nsjconf_t* nsjconf) { return rv; } -void killAndReapAll(nsjconf_t* nsjconf) { +void killAndReapAll(nsjconf_t* nsjconf, int signal) { while (!nsjconf->pids.empty()) { pid_t pid = nsjconf->pids.begin()->first; - if (kill(pid, SIGKILL) == 0) { + if (kill(pid, signal) == 0) { reapProc(nsjconf, pid, true); } else { removeProc(nsjconf, pid); diff --git a/subproc.h b/subproc.h index d3e1696..269b9d0 100644 --- a/subproc.h +++ b/subproc.h @@ -37,7 +37,7 @@ namespace subproc { pid_t runChild(nsjconf_t* nsjconf, int listen_fd, int fd_in, int fd_out, int fd_err); int countProc(nsjconf_t* nsjconf); void displayProc(nsjconf_t* nsjconf); -void killAndReapAll(nsjconf_t* nsjconf); +void killAndReapAll(nsjconf_t* nsjconf, int signal); /* Returns the exit code of the first failing subprocess, or 0 if none fail */ int reapProc(nsjconf_t* nsjconf); int systemExe(const std::vector& args, char** env);