summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2024-07-27 19:10:16 -0400
committerTavian Barnes <tavianator@tavianator.com>2024-07-27 19:11:39 -0400
commit085bb402c7b2c2f96624fb0523ff3f9686fe26d9 (patch)
tree6c9c4240342fdad2f3d8a131265952659f044e46
parentc43d54826fd92017b9d7d49a5f660d98c0393e02 (diff)
downloadbfs-085bb402c7b2c2f96624fb0523ff3f9686fe26d9.tar.xz
xspawn: Use _Fork() if available
This completes the workaround for bfs_spawn() hanging on FreeBSD with ASan enabled. Link: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=280318
-rw-r--r--build/flags.mk1
-rw-r--r--build/flags/bind-now.c8
-rw-r--r--build/has/_Fork.c8
-rw-r--r--build/header.mk1
-rw-r--r--src/xspawn.c4
5 files changed, 22 insertions, 0 deletions
diff --git a/build/flags.mk b/build/flags.mk
index 5c28c3f..0a62f32 100644
--- a/build/flags.mk
+++ b/build/flags.mk
@@ -105,6 +105,7 @@ include build/exports.mk
# Conditionally-supported flags
AUTO_FLAGS := \
+ gen/flags/bind-now.mk \
gen/flags/deps.mk \
gen/flags/missing-var-decls.mk
diff --git a/build/flags/bind-now.c b/build/flags/bind-now.c
new file mode 100644
index 0000000..08bb4f2
--- /dev/null
+++ b/build/flags/bind-now.c
@@ -0,0 +1,8 @@
+// Copyright © Tavian Barnes <tavianator@tavianator.com>
+// SPDX-License-Identifier: 0BSD
+
+/// _LDFLAGS += -Wl,-z,now
+
+int main(void) {
+ return 0;
+}
diff --git a/build/has/_Fork.c b/build/has/_Fork.c
new file mode 100644
index 0000000..4d7fbd3
--- /dev/null
+++ b/build/has/_Fork.c
@@ -0,0 +1,8 @@
+// Copyright © Tavian Barnes <tavianator@tavianator.com>
+// SPDX-License-Identifier: 0BSD
+
+#include <unistd.h>
+
+int main(void) {
+ return _Fork();
+}
diff --git a/build/header.mk b/build/header.mk
index afd04d0..a4f392e 100644
--- a/build/header.mk
+++ b/build/header.mk
@@ -13,6 +13,7 @@ include build/exports.mk
# All header fragments we generate
HEADERS := \
gen/has/--st-birthtim.h \
+ gen/has/_Fork.h \
gen/has/acl-get-entry.h \
gen/has/acl-get-file.h \
gen/has/acl-get-tag-type.h \
diff --git a/src/xspawn.c b/src/xspawn.c
index 68973ad..789f370 100644
--- a/src/xspawn.c
+++ b/src/xspawn.c
@@ -612,7 +612,11 @@ static pid_t bfs_fork_spawn(struct bfs_resolver *res, const struct bfs_spawn *ct
goto fail;
}
+#if BFS_HAS__FORK
+ pid_t pid = _Fork();
+#else
pid_t pid = fork();
+#endif
if (pid == 0) {
// Child
bfs_spawn_exec(res, ctx, argv, envp, pipefd);