Don't abuse vfork()

According to POSIX.1, "vfork() has the same effect as fork(2),
except that the behavior is undefined if the process created by vfork()
either modifies any data other than a variable of type pid_t
used to store the return value from vfork(), [...],
or calls any other function before successfully calling _exit(2)
or one of the exec(3) family of functions."

These do all three, and work by pure chance
(or maybe they don't, but we blisfully don't know).
Either way: bad idea to call vfork() from C,
unless you're the standard library, and POSIX.1-2008 removes it entirely

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz>
Closes #12015
This commit is contained in:
наб 2021-05-08 13:17:04 +02:00 committed by Brian Behlendorf
parent 5da6353987
commit 93ef500388
2 changed files with 2 additions and 2 deletions

View File

@ -891,7 +891,7 @@ libzfs_run_process_impl(const char *path, char *argv[], char *env[], int flags,
if (lines != NULL && pipe2(link, O_NONBLOCK | O_CLOEXEC) == -1)
return (-EPIPE);
pid = vfork();
pid = fork();
if (pid == 0) {
/* Child process */
devnull_fd = open("/dev/null", O_WRONLY | O_CLOEXEC);

View File

@ -262,7 +262,7 @@ run_process(const char *path, char *argv[])
pid_t pid;
int rc, devnull_fd;
pid = vfork();
pid = fork();
if (pid == 0) {
devnull_fd = open("/dev/null", O_WRONLY);