]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
basic/socket-util: put a limit on the loop to flush connections 12367/head
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 23 Apr 2019 13:24:56 +0000 (15:24 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 23 Apr 2019 13:24:56 +0000 (15:24 +0200)
Follow-up for #12346.

src/basic/socket-util.c

index cf2e08c2df83d7b78f52cbace309a6df4822dd96..32a0d9c5d060ec21b123e69dc13091ad1cb92bd8 100644 (file)
@@ -1219,6 +1219,10 @@ fallback:
         return (ssize_t) k;
 }
 
+/* Put a limit on how many times will attempt to call accept4(). We loop
+ * only on "transient" errors, but let's make sure we don't loop forever. */
+#define MAX_FLUSH_ITERATIONS 1024
+
 int flush_accept(int fd) {
 
         struct pollfd pollfd = {
@@ -1242,7 +1246,7 @@ int flush_accept(int fd) {
                  * we can loop safely on transient errors below. */
                 return -ENOTTY;
 
-        for (;;) {
+        for (unsigned iteration = 0;; iteration++) {
                 int cfd;
 
                 r = poll(&pollfd, 1, 0);
@@ -1255,6 +1259,10 @@ int flush_accept(int fd) {
                 if (r == 0)
                         return 0;
 
+                if (iteration >= MAX_FLUSH_ITERATIONS)
+                        return log_debug_errno(SYNTHETIC_ERRNO(EBUSY),
+                                               "Failed to flush connections within " STRINGIFY(MAX_FLUSH_ITERATIONS) " iterations.");
+
                 cfd = accept4(fd, NULL, NULL, SOCK_NONBLOCK|SOCK_CLOEXEC);
                 if (cfd < 0) {
                         if (errno == EAGAIN)