|
|
9a3fa7 |
From fbcd6c97015324480f843c08da338c9d580b2b31 Mon Sep 17 00:00:00 2001
|
|
|
9a3fa7 |
From: Phil Sutter <psutter@redhat.com>
|
|
|
9a3fa7 |
Date: Fri, 15 Mar 2019 17:51:28 +0100
|
|
|
9a3fa7 |
Subject: [PATCH] libxtables: Use posix_spawn() instead of vfork()
|
|
|
9a3fa7 |
|
|
|
9a3fa7 |
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1525980
|
|
|
9a3fa7 |
Upstream Status: iptables commit d95c1e8b65c4e
|
|
|
9a3fa7 |
|
|
|
9a3fa7 |
commit d95c1e8b65c4ec66b8fcd2f7ede257853a888750
|
|
|
9a3fa7 |
Author: Phil Sutter <phil@nwl.cc>
|
|
|
9a3fa7 |
Date: Wed Sep 19 15:17:05 2018 +0200
|
|
|
9a3fa7 |
|
|
|
9a3fa7 |
libxtables: Use posix_spawn() instead of vfork()
|
|
|
9a3fa7 |
|
|
|
9a3fa7 |
According to covscan, vfork() may lead to a deadlock in the parent
|
|
|
9a3fa7 |
process. It suggests to use posix_spawn() instead. Since the latter
|
|
|
9a3fa7 |
combines vfork() and exec() calls, use it for xtables_insmod().
|
|
|
9a3fa7 |
|
|
|
9a3fa7 |
Signed-off-by: Phil Sutter <phil@nwl.cc>
|
|
|
9a3fa7 |
Signed-off-by: Florian Westphal <fw@strlen.de>
|
|
|
9a3fa7 |
|
|
|
9a3fa7 |
Signed-off-by: Phil Sutter <psutter@redhat.com>
|
|
|
9a3fa7 |
---
|
|
|
9a3fa7 |
libxtables/xtables.c | 15 +++++----------
|
|
|
9a3fa7 |
1 file changed, 5 insertions(+), 10 deletions(-)
|
|
|
9a3fa7 |
|
|
|
9a3fa7 |
diff --git a/libxtables/xtables.c b/libxtables/xtables.c
|
|
|
9a3fa7 |
index bca9863acc566..7210d3706bf26 100644
|
|
|
9a3fa7 |
--- a/libxtables/xtables.c
|
|
|
9a3fa7 |
+++ b/libxtables/xtables.c
|
|
|
9a3fa7 |
@@ -21,6 +21,7 @@
|
|
|
9a3fa7 |
#include <fcntl.h>
|
|
|
9a3fa7 |
#include <inttypes.h>
|
|
|
9a3fa7 |
#include <netdb.h>
|
|
|
9a3fa7 |
+#include <spawn.h>
|
|
|
9a3fa7 |
#include <stdarg.h>
|
|
|
9a3fa7 |
#include <stdbool.h>
|
|
|
9a3fa7 |
#include <stdio.h>
|
|
|
9a3fa7 |
@@ -343,6 +344,7 @@ int xtables_insmod(const char *modname, const char *modprobe, bool quiet)
|
|
|
9a3fa7 |
char *buf = NULL;
|
|
|
9a3fa7 |
char *argv[4];
|
|
|
9a3fa7 |
int status;
|
|
|
9a3fa7 |
+ pid_t pid;
|
|
|
9a3fa7 |
|
|
|
9a3fa7 |
/* If they don't explicitly set it, read out of kernel */
|
|
|
9a3fa7 |
if (!modprobe) {
|
|
|
9a3fa7 |
@@ -363,18 +365,11 @@ int xtables_insmod(const char *modname, const char *modprobe, bool quiet)
|
|
|
9a3fa7 |
*/
|
|
|
9a3fa7 |
fflush(stdout);
|
|
|
9a3fa7 |
|
|
|
9a3fa7 |
- switch (vfork()) {
|
|
|
9a3fa7 |
- case 0:
|
|
|
9a3fa7 |
- execv(argv[0], argv);
|
|
|
9a3fa7 |
-
|
|
|
9a3fa7 |
- /* not usually reached */
|
|
|
9a3fa7 |
- _exit(1);
|
|
|
9a3fa7 |
- case -1:
|
|
|
9a3fa7 |
+ if (posix_spawn(&pid, argv[0], NULL, NULL, argv, NULL)) {
|
|
|
9a3fa7 |
free(buf);
|
|
|
9a3fa7 |
return -1;
|
|
|
9a3fa7 |
-
|
|
|
9a3fa7 |
- default: /* parent */
|
|
|
9a3fa7 |
- wait(&status);
|
|
|
9a3fa7 |
+ } else {
|
|
|
9a3fa7 |
+ waitpid(pid, &status, 0);
|
|
|
9a3fa7 |
}
|
|
|
9a3fa7 |
|
|
|
9a3fa7 |
free(buf);
|
|
|
9a3fa7 |
--
|
|
|
9a3fa7 |
2.21.0
|
|
|
9a3fa7 |
|