From 7fe8989fbb38f9c62fe5205b862055914e6b45a9 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Thu, 7 Aug 2025 19:43:39 +0100 Subject: [PATCH] MINOR: sock: update broken accept4 detection for older hardwares. Some older ARM embedded settings set errno to EPERM instead of ENOSYS for missing implementations (e.g. Freescale ARM 2.6.35) --- src/sock.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/sock.c b/src/sock.c index 83db74595..3644a1a91 100644 --- a/src/sock.c +++ b/src/sock.c @@ -88,9 +88,13 @@ struct connection *sock_accept_conn(struct listener *l, int *status) * the legacy accept() + fcntl(). */ if (unlikely(accept4_broken) || + /* Albeit it appears it does not make sense to carry on with accept + * if we encounter EPERM, some old embedded ARM Linux 2.6.x sets as + * such instead of ENOSYS. + */ (((cfd = accept4(l->rx.fd, (struct sockaddr*)addr, &laddr, SOCK_NONBLOCK | (master ? SOCK_CLOEXEC : 0))) == -1) && - (errno == ENOSYS || errno == EINVAL || errno == EBADF) && + (errno == ENOSYS || errno == EINVAL || errno == EBADF || errno == EPERM) && ((accept4_broken = 1)))) #endif {