commit a1538d607d54065c2d74c8fa695d1c0b5e33c64f Author: Nick Mathewson nickm@torproject.org Date: Fri May 4 13:17:20 2012 -0400
Fix bug 5762: detect missing accept4 that gives ENOSYS
We had been checking for EINVAL, but that means that SOCK_* isn't supported, not that the syscall itself is missing.
Bugfix on 0.2.3.1-alpha, which started to use accept4. --- changes/bug5762 | 4 ++++ src/common/compat.c | 7 ++++--- 2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/changes/bug5762 b/changes/bug5762 new file mode 100644 index 0000000..a91f4df --- /dev/null +++ b/changes/bug5762 @@ -0,0 +1,4 @@ + o Minor bugfixes: + - Work correctly on Linux systems with accept4 support advertised in + their headers, but without accept4 support in the kernel. Fix + by murb. Fixes bug 5762; bugfix on 0.2.3.1-alpha. diff --git a/src/common/compat.c b/src/common/compat.c index fbb37ce..1a03f5e 100644 --- a/src/common/compat.c +++ b/src/common/compat.c @@ -1013,10 +1013,11 @@ tor_accept_socket(tor_socket_t sockfd, struct sockaddr *addr, socklen_t *len) s = accept4(sockfd, addr, len, SOCK_CLOEXEC); if (SOCKET_OK(s)) goto socket_ok; - /* If we got an error, see if it is EINVAL. EINVAL might indicate that, + /* If we got an error, see if it is ENOSYS. ENOSYS indicates that, * event though we were built on a system with accept4 support, we - * are running on one without. */ - if (errno != EINVAL) + * are running on one without. Also, check for EINVAL, which indicates that + * we are missing SOCK_CLOEXEC support. */ + if (errno != EINVAL && errno != ENOSYS) return s; #endif
tor-commits@lists.torproject.org