diff options
author | Tavian Barnes <tavianator@tavianator.com> | 2024-07-27 19:10:16 -0400 |
---|---|---|
committer | Tavian Barnes <tavianator@tavianator.com> | 2024-07-27 19:11:39 -0400 |
commit | 085bb402c7b2c2f96624fb0523ff3f9686fe26d9 (patch) | |
tree | 6c9c4240342fdad2f3d8a131265952659f044e46 | |
parent | c43d54826fd92017b9d7d49a5f660d98c0393e02 (diff) | |
download | bfs-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.mk | 1 | ||||
-rw-r--r-- | build/flags/bind-now.c | 8 | ||||
-rw-r--r-- | build/has/_Fork.c | 8 | ||||
-rw-r--r-- | build/header.mk | 1 | ||||
-rw-r--r-- | src/xspawn.c | 4 |
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); |