Subject: bug#75405: gzip --synchronous doesn't work with musl

From: Paul Eggert <[email-masked]>
Date: Mon, 6 Jan 2025 10:02:41 -0800

On 2025-01-06 05:29, Lasse Collin wrote:

> In musl, O_SEARCH maps to Linux-specific O_PATH

That is a bug in musl. musl should not define O_SEARCH to O_PATH on 
Linux, because O_PATH is not a valid implementation of O_SEARCH. Or if 
musl wants to do some sort of approximate-but-invalid implementation to 
POSIX, a better approximation is "#define O_SEARCH O_RDONLY", which is 
what Gnulib does in lib/fcntl.in.h. The approximation "#define O_SEARCH 
O_PATH" is more likely to break real-world applications than the 
approximation "#define O_SEARCH O_RDONLY" is.

> As far as I understand this, O_SEARCH in POSIX is only meant for openat
> and such APIs.

No, O_SEARCH is well defined in POSIX to work in plain 'open'. See 
<https://pubs.opengroup.org/onlinepubs/9799919799/functions/open.html>.

Would the following Gnulib patch work around the musl bug?

diff --git a/lib/fcntl.in.h b/lib/fcntl.in.h
index 5f06c4fe10..44d02fb9fd 100644
--- a/lib/fcntl.in.h
+++ b/lib/fcntl.in.h
@@ -369,6 +369,11 @@ _GL_WARN_ON_USE (openat, "openat is not portable - "
  # define O_RSYNC 0
  #endif

+/* musl on GNU/Linux mistakenly has "#define O_SEARCH 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 /* This is often close enough in older 
systems.  */
  #endif