xz: Workaround broken O_SEARCH in musl

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.
This commit is contained in:
Lasse Collin 2025-01-08 19:08:08 +02:00
parent ea92eae122
commit 75d91d6b39
No known key found for this signature in database
GPG Key ID: 38EE757D69184620
1 changed files with 11 additions and 0 deletions

View File

@ -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