]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
OS X poll(2) is broken; use compat replacement
authorDamien Miller <djm@mindrot.org>
Tue, 11 Jan 2022 21:57:49 +0000 (08:57 +1100)
committerDamien Miller <djm@mindrot.org>
Tue, 11 Jan 2022 22:02:36 +0000 (09:02 +1100)
Darwin's poll(2) implementation is broken. For character-special
devices like /dev/null, it returns POLLNVAL when polled with
POLLIN.

Apparently this is Apple bug 3710161, which is AFAIK not public,
but a websearch will find other OSS projects rediscovering it
periodically since it was first identified in 2005 (!!)

configure.ac
openbsd-compat/bsd-poll.c

index 1feb73ef9cfc9c6941cee990071f57d278e05516..eb265143ba705b40d22341768e5566a5a6f254c1 100644 (file)
@@ -731,6 +731,10 @@ main() { if (NSVersionOfRunTimeLibrary("System") >= (60 << 16))
        # proc_pidinfo()-based closefrom() replacement.
        AC_CHECK_HEADERS([libproc.h])
        AC_CHECK_FUNCS([proc_pidinfo])
+       # poll(2) is broken for character-special devices (at least).
+       # cf. Apple bug 3710161 (not public, but searchable)
+       AC_DEFINE([BROKEN_POLL], [1],
+           [System poll(2) implementation is broken])
        ;;
 *-*-dragonfly*)
        SSHDLIBS="$SSHDLIBS -lcrypt"
index 2d28eed5ba33b33b1a930454eeb39198be75163c..8084776ceb58622fa285d39f7982a33e539c847d 100644 (file)
@@ -15,7 +15,7 @@
  */
 
 #include "includes.h"
-#if !defined(HAVE_PPOLL) || !defined(HAVE_POLL)
+#if !defined(HAVE_PPOLL) || !defined(HAVE_POLL) || defined(BROKEN_POLL)
 
 #include <sys/types.h>
 #include <sys/time.h>
@@ -29,7 +29,7 @@
 #include <unistd.h>
 #include "bsd-poll.h"
 
-#ifndef HAVE_PPOLL
+#if !defined(HAVE_PPOLL) || defined(BROKEN_POLL)
 /*
  * A minimal implementation of ppoll(2), built on top of pselect(2).
  *
@@ -109,9 +109,9 @@ out:
                errno = saved_errno;
        return ret;
 }
-#endif /* HAVE_PPOLL */
+#endif /* !HAVE_PPOLL || BROKEN_POLL */
 
-#ifndef HAVE_POLL
+#if !defined(HAVE_POLL) || defined(BROKEN_POLL)
 int
 poll(struct pollfd *fds, nfds_t nfds, int timeout)
 {
@@ -126,6 +126,6 @@ poll(struct pollfd *fds, nfds_t nfds, int timeout)
 
        return ppoll(fds, nfds, tsp, NULL);
 }
-#endif /* HAVE_POLL */
+#endif /* !HAVE_POLL || BROKEN_POLL */
 
-#endif /* HAVE_PPOLL || HAVE_POLL */
+#endif /* !HAVE_PPOLL || !HAVE_POLL || BROKEN_POLL */