]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
process-util: refuse FORK_DETACH + FORK_DEATHSIG_*
authorMike Yuan <me@yhndnzj.com>
Mon, 11 Nov 2024 18:38:36 +0000 (19:38 +0100)
committerLuca Boccassi <luca.boccassi@gmail.com>
Thu, 14 Nov 2024 12:22:15 +0000 (12:22 +0000)
There's no synchoronization between the intermediate process
and the double-forked child, and the semantics are not useful.
Refuse such combination.

src/basic/process-util.c

index 9c159b46055b317b9b8fb62206f3001e45d61738..adc576a84f8cc906da38ff90a34377cd3ed89f3b 100644 (file)
@@ -1460,8 +1460,8 @@ int safe_fork_full(
         bool block_signals = false, block_all = false, intermediary = false;
         int prio, r;
 
-        assert(!FLAGS_SET(flags, FORK_DETACH) || !ret_pid);
-        assert(!FLAGS_SET(flags, FORK_DETACH|FORK_WAIT));
+        assert(!FLAGS_SET(flags, FORK_DETACH) ||
+               (!ret_pid && (flags & (FORK_WAIT|FORK_DEATHSIG_SIGTERM|FORK_DEATHSIG_SIGINT|FORK_DEATHSIG_SIGKILL)) == 0));
 
         /* A wrapper around fork(), that does a couple of important initializations in addition to mere forking. Always
          * returns the child's PID in *ret_pid. Returns == 0 in the child, and > 0 in the parent. */