basic/socket-util: put a limit on the loop to flush connections

Follow-up for #12346.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2019-04-23 15:24:56 +02:00
parent 644cb4cc7a
commit 67962036f6

View 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)