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)
This commit is contained in:
David Carlier 2025-08-07 19:43:39 +01:00 committed by Willy Tarreau
parent 21d5f43aa6
commit 7fe8989fbb

View File

@ -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
{