commit:     eb1d80e6a30d09f9f139877c5b754c8a8e918d7a
Author:     Mike Gilbert <floppym <AT> gentoo <DOT> org>
AuthorDate: Thu May  9 13:41:30 2019 +0000
Commit:     Mike Gilbert <floppym <AT> gentoo <DOT> org>
CommitDate: Thu May  9 13:41:30 2019 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=eb1d80e6

sys-apps/systemd: backport patch to fix dracut boot

Closes: https://bugs.gentoo.org/685002
Package-Manager: Portage-2.3.66_p2, Repoman-2.3.12_p111
Signed-off-by: Mike Gilbert <floppym <AT> gentoo.org>

 .../files/242-socket-util-flush-accept.patch       | 46 ++++++++++++++++++++++
 .../{systemd-242.ebuild => systemd-242-r1.ebuild}  |  1 +
 2 files changed, 47 insertions(+)

diff --git a/sys-apps/systemd/files/242-socket-util-flush-accept.patch 
b/sys-apps/systemd/files/242-socket-util-flush-accept.patch
new file mode 100644
index 00000000000..4849c4c0789
--- /dev/null
+++ b/sys-apps/systemd/files/242-socket-util-flush-accept.patch
@@ -0,0 +1,46 @@
+From f3d75364fbebf2ddb6393e54db5e10b6f6234e14 Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lenn...@poettering.net>
+Date: Thu, 18 Apr 2019 15:13:54 +0200
+Subject: [PATCH] socket-util: make sure flush_accept() doesn't hang on
+ unexpected EOPNOTSUPP
+
+So apparently there are two reasons why accept() can return EOPNOTSUPP:
+because the socket is not a listening stream socket (or similar), or
+because the incoming TCP connection for some reason wasn't acceptable to
+the host. THe latter should be a transient error, as suggested on
+accept(2). The former however should be considered fatal for
+flush_accept(). Let's fix this by explicitly checking whether the socket
+is a listening socket beforehand.
+---
+ src/basic/socket-util.c | 17 +++++++++++++++--
+ 1 file changed, 15 insertions(+), 2 deletions(-)
+
+diff --git a/src/basic/socket-util.c b/src/basic/socket-util.c
+index 904bafb76f9..e787d53d8f4 100644
+--- a/src/basic/socket-util.c
++++ b/src/basic/socket-util.c
+@@ -1225,9 +1225,22 @@ int flush_accept(int fd) {
+                 .fd = fd,
+                 .events = POLLIN,
+         };
+-        int r;
++        int r, b;
++        socklen_t l = sizeof(b);
++
++        /* Similar to flush_fd() but flushes all incoming connection by 
accepting them and immediately
++         * closing them.  */
++
++        if (getsockopt(fd, SOL_SOCKET, SO_ACCEPTCONN, &b, &l) < 0)
++                return -errno;
+ 
+-        /* Similar to flush_fd() but flushes all incoming connection by 
accepting them and immediately closing them. */
++        assert(l == sizeof(b));
++        if (!b) /* Let's check if this is a socket accepting connections 
before calling accept(). That's
++                 * because accept4() can return EOPNOTSUPP in the fd we are 
called on is not a listening
++                 * socket, or in case the incoming TCP connection transiently 
triggered that (see accept(2)
++                 * man page for details). The latter case is a transient 
error we should continue looping
++                 * on. The former case however is fatal. */
++                return -ENOTTY;
+ 
+         for (;;) {
+                 int cfd;

diff --git a/sys-apps/systemd/systemd-242.ebuild 
b/sys-apps/systemd/systemd-242-r1.ebuild
similarity index 99%
rename from sys-apps/systemd/systemd-242.ebuild
rename to sys-apps/systemd/systemd-242-r1.ebuild
index d09494587fc..a2626727385 100644
--- a/sys-apps/systemd/systemd-242.ebuild
+++ b/sys-apps/systemd/systemd-242-r1.ebuild
@@ -171,6 +171,7 @@ src_prepare() {
        # Add local patches here
        PATCHES+=(
                "${FILESDIR}"/242-gcc-9.patch
+               "${FILESDIR}"/242-socket-util-flush-accept.patch
        )
 
        if ! use vanilla; then

Reply via email to