summaryrefslogtreecommitdiffstats
path: root/src/fsade.c
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2023-04-07 14:57:15 -0400
committerTavian Barnes <tavianator@tavianator.com>2023-06-12 12:22:17 -0400
commit0a11b516c439c645d90583a661db0380d9696617 (patch)
tree664c28294f810008f04d76e95ac4c06b6f12151f /src/fsade.c
parenta7136999f9a4a04ed7ac6f83de37c34bac01ade1 (diff)
downloadbfs-0a11b516c439c645d90583a661db0380d9696617.tar.xz
fsade: Make syscall support checks thread-safe
Diffstat (limited to 'src/fsade.c')
-rw-r--r--src/fsade.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/src/fsade.c b/src/fsade.c
index ca3a99c..c401426 100644
--- a/src/fsade.c
+++ b/src/fsade.c
@@ -2,6 +2,7 @@
// SPDX-License-Identifier: 0BSD
#include "fsade.h"
+#include "atomic.h"
#include "config.h"
#include "bfstd.h"
#include "bftw.h"
@@ -34,11 +35,10 @@
* emulate something similar if /proc/self/fd is available.
*/
static const char *fake_at(const struct BFTW *ftwbuf) {
- static bool proc_works = true;
- static bool proc_checked = false;
+ static atomic int proc_works = -1;
char *path = NULL;
- if (!proc_works || ftwbuf->at_fd == AT_FDCWD) {
+ if (ftwbuf->at_fd == AT_FDCWD || load(&proc_works, relaxed) == 0) {
goto fail;
}
@@ -47,11 +47,12 @@ static const char *fake_at(const struct BFTW *ftwbuf) {
goto fail;
}
- if (!proc_checked) {
- proc_checked = true;
+ if (load(&proc_works, relaxed) < 0) {
if (xfaccessat(AT_FDCWD, path, F_OK) != 0) {
- proc_works = false;
+ store(&proc_works, 0, relaxed);
goto fail;
+ } else {
+ store(&proc_works, 1, relaxed);
}
}