Skip to content

Commit

Permalink
xz: Workaround broken O_SEARCH in musl
Browse files Browse the repository at this point in the history
Testing with musl 1.2.5 and Linux 6.12, O_SEARCH doesn't result
in a file descriptor that works with fsync() although it should work.
See the added comment.

The same issue affected gzip --synchronous:

    https://bugs.gnu.org/75405

Thanks to Paul Eggert.
  • Loading branch information
Larhzu committed Jan 8, 2025
1 parent 9105fa0 commit a1997cd
Showing 1 changed file with 11 additions and 0 deletions.
11 changes: 11 additions & 0 deletions src/xz/file_io.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,17 @@ static bool warn_fchown;
# define O_NOCTTY 0
#endif

// In musl 1.2.5, O_SEARCH is defined to O_PATH. As of Linux 6.12,
// a file descriptor from open("dir", O_SEARCH | O_DIRECTORY) cannot be
// used with fsync() (fails with EBADF). musl 1.2.5 doesn't emulate it
// using /proc/self/fd. Even if it did, it might need to do it with
// fd = open("/proc/...", O_RDONLY); fsync(fd); which fails if the
// directory lacks read permission. Since we need a working fsync(),
// O_RDONLY imitates O_SEARCH better than O_PATH.
#if defined(O_SEARCH) && defined(O_PATH) && O_SEARCH == O_PATH
# undef O_SEARCH
#endif

#ifndef O_SEARCH
# define O_SEARCH O_RDONLY
#endif
Expand Down

0 comments on commit a1997cd

Please sign in to comment.