]> git.ipfire.org Git - thirdparty/git.git/commitdiff
daemon: correctly handle soft accept() errors in service_loop
authorCarlo Marcelo Arenas Belón <carenas@gmail.com>
Fri, 27 Jun 2025 23:14:04 +0000 (16:14 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 30 Jun 2025 15:31:06 +0000 (08:31 -0700)
Since df076bdbcc ([PATCH] GIT: Listen on IPv6 as well, if available.,
2005-07-23), the original error checking was included in an inner loop
unchanged, where its effect was different.

Instead of retrying, after a EINTR during accept() in the listening
socket, it will advance to the next one and try with that instead,
leaving the client waiting for another round.

Make sure to retry with the same listener socket that failed originally.

To avoid an unlikely busy loop, fallback to the old behaviour after a
couple of attempts.

Signed-off-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
Acked-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
daemon.c

index d1be61fd578949385c94e590ca3b7ba7c09048d2..9ac9efa17cd1e84f9eb251e48ae181f576d5cd23 100644 (file)
--- a/daemon.c
+++ b/daemon.c
@@ -1153,11 +1153,19 @@ static int service_loop(struct socketlist *socklist)
 #endif
                                } ss;
                                socklen_t sslen = sizeof(ss);
-                               int incoming = accept(pfd[i].fd, &ss.sa, &sslen);
+                               int incoming;
+                               int retry = 3;
+
+                       redo:
+                               incoming = accept(pfd[i].fd, &ss.sa, &sslen);
                                if (incoming < 0) {
                                        switch (errno) {
-                                       case EAGAIN:
                                        case EINTR:
+                                               if (--retry)
+                                                       goto redo;
+
+                                               /* fallthrough */
+                                       case EAGAIN:
                                        case ECONNABORTED:
                                                continue;
                                        default: