diff options
author | Nick Mathewson <nickm@torproject.org> | 2012-05-04 13:17:20 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2012-05-04 13:18:14 -0400 |
commit | a1538d607d54065c2d74c8fa695d1c0b5e33c64f (patch) | |
tree | b4c6ab6790cbf17a6702244bb939f53839a3f935 | |
parent | c9afd6f9c5a3cf73340e528818570b4ba5cdf6b2 (diff) | |
download | tor-a1538d607d54065c2d74c8fa695d1c0b5e33c64f.tar.gz tor-a1538d607d54065c2d74c8fa695d1c0b5e33c64f.zip |
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.
-rw-r--r-- | changes/bug5762 | 4 | ||||
-rw-r--r-- | 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 0000000000..a91f4dfedf --- /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 fbb37ce031..1a03f5efc7 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 |