diff options
author | Tavian Barnes <tavianator@tavianator.com> | 2023-10-12 15:50:59 -0400 |
---|---|---|
committer | Tavian Barnes <tavianator@tavianator.com> | 2023-10-12 15:50:59 -0400 |
commit | d64a32e03b4d9a1336ebfa66d7d08d96e9847a6a (patch) | |
tree | 9ff9c5a4831e2cdb37cb9771dc9fb254216b7042 /src/bftw.c | |
parent | 773f4a446f03da62d88e6d17be49fdc0a3e38465 (diff) | |
download | bfs-d64a32e03b4d9a1336ebfa66d7d08d96e9847a6a.tar.xz |
bftw: Make sure we don't close a directory while we unwrap it
bftw_cache_reserve() can lead to bftw_cache_pop(), which could close the
directory we're trying to unwrap! If that happened, we would try
dup_cloexec(-1), which would fail with EBADF, so there was no observable
bug. But it's better to avoid the whole situation.
Diffstat (limited to 'src/bftw.c')
-rw-r--r-- | src/bftw.c | 8 |
1 files changed, 6 insertions, 2 deletions
@@ -811,8 +811,12 @@ static int bftw_unwrapdir(struct bftw_state *state, struct bftw_file *file) { return bftw_close(state, file); } - if (bftw_cache_reserve(state) != 0) { - return -1; + // Make room for dup() + bftw_cache_pin(cache, file); + int ret = bftw_cache_reserve(state); + bftw_cache_unpin(cache, file); + if (ret != 0) { + return ret; } int fd = dup_cloexec(file->fd); |