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.
This commit is contained in:
Nick Mathewson 2012-05-04 13:17:20 -04:00
parent c9afd6f9c5
commit a1538d607d
2 changed files with 8 additions and 3 deletions

4
changes/bug5762 Normal file
View file

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

View file

@ -1013,10 +1013,11 @@ tor_accept_socket(tor_socket_t sockfd, struct sockaddr *addr, socklen_t *len)
s = accept4(sockfd, addr, len, SOCK_CLOEXEC); s = accept4(sockfd, addr, len, SOCK_CLOEXEC);
if (SOCKET_OK(s)) if (SOCKET_OK(s))
goto socket_ok; 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 * event though we were built on a system with accept4 support, we
* are running on one without. */ * are running on one without. Also, check for EINVAL, which indicates that
if (errno != EINVAL) * we are missing SOCK_CLOEXEC support. */
if (errno != EINVAL && errno != ENOSYS)
return s; return s;
#endif #endif