diff options
author | Joel Galenson <jgalenson@google.com> | 2021-04-01 17:18:00 -0700 |
---|---|---|
committer | Joel Galenson <jgalenson@google.com> | 2021-04-01 17:18:00 -0700 |
commit | aa25fe6ab1b96f8c13eb63ccf920810290cd4aab (patch) | |
tree | 9d90156cdc95cd4ef05a842b91127753b251d0a0 /src/sys/unix | |
parent | 4cc559481572019a1f765daa27c7bf8dd31ced35 (diff) | |
download | mio-aa25fe6ab1b96f8c13eb63ccf920810290cd4aab.tar.gz |
Upgrade rust/crates/mio to 0.7.11
Test: make
Change-Id: Id1268d37e0b2f83e62d44c708049fb74fd3652bc
Diffstat (limited to 'src/sys/unix')
-rw-r--r-- | src/sys/unix/tcp.rs | 27 | ||||
-rw-r--r-- | src/sys/unix/uds/listener.rs | 22 |
2 files changed, 43 insertions, 6 deletions
diff --git a/src/sys/unix/tcp.rs b/src/sys/unix/tcp.rs index 70986fa..59642c6 100644 --- a/src/sys/unix/tcp.rs +++ b/src/sys/unix/tcp.rs @@ -429,7 +429,12 @@ pub fn accept(listener: &net::TcpListener) -> io::Result<(net::TcpStream, Socket // On platforms that support it we can use `accept4(2)` to set `NONBLOCK` // and `CLOEXEC` in the call to accept the connection. #[cfg(any( - target_os = "android", + // Android x86's seccomp profile forbids calls to `accept4(2)` + // See https://github.com/tokio-rs/mio/issues/1445 for details + all( + not(target_arch="x86"), + target_os = "android" + ), target_os = "dragonfly", target_os = "freebsd", target_os = "illumos", @@ -450,7 +455,15 @@ pub fn accept(listener: &net::TcpListener) -> io::Result<(net::TcpStream, Socket // But not all platforms have the `accept4(2)` call. Luckily BSD (derived) // OSes inherit the non-blocking flag from the listener, so we just have to // set `CLOEXEC`. - #[cfg(any(target_os = "ios", target_os = "macos", target_os = "solaris"))] + #[cfg(any( + all( + target_arch = "x86", + target_os = "android" + ), + target_os = "ios", + target_os = "macos", + target_os = "solaris" + ))] let stream = { syscall!(accept( listener.as_raw_fd(), @@ -458,7 +471,15 @@ pub fn accept(listener: &net::TcpListener) -> io::Result<(net::TcpStream, Socket &mut length )) .map(|socket| unsafe { net::TcpStream::from_raw_fd(socket) }) - .and_then(|s| syscall!(fcntl(s.as_raw_fd(), libc::F_SETFD, libc::FD_CLOEXEC)).map(|_| s)) + .and_then(|s| { + syscall!(fcntl(s.as_raw_fd(), libc::F_SETFD, libc::FD_CLOEXEC))?; + + // See https://github.com/tokio-rs/mio/issues/1450 + #[cfg(all(target_arch = "x86",target_os = "android"))] + syscall!(fcntl(s.as_raw_fd(), libc::F_SETFL, libc::O_NONBLOCK))?; + + Ok(s) + }) }?; // This is safe because `accept` calls above ensures the address diff --git a/src/sys/unix/uds/listener.rs b/src/sys/unix/uds/listener.rs index b8fb5a9..547ff57 100644 --- a/src/sys/unix/uds/listener.rs +++ b/src/sys/unix/uds/listener.rs @@ -42,7 +42,13 @@ pub(crate) fn accept(listener: &net::UnixListener) -> io::Result<(UnixStream, So target_os = "ios", target_os = "macos", target_os = "netbsd", - target_os = "solaris" + target_os = "solaris", + // Android x86's seccomp profile forbids calls to `accept4(2)` + // See https://github.com/tokio-rs/mio/issues/1445 for details + all( + target_arch = "x86", + target_os = "android" + ) )))] let socket = { let flags = libc::SOCK_NONBLOCK | libc::SOCK_CLOEXEC; @@ -59,7 +65,11 @@ pub(crate) fn accept(listener: &net::UnixListener) -> io::Result<(UnixStream, So target_os = "ios", target_os = "macos", target_os = "netbsd", - target_os = "solaris" + target_os = "solaris", + all( + target_arch = "x86", + target_os = "android" + ) ))] let socket = syscall!(accept( listener.as_raw_fd(), @@ -70,7 +80,13 @@ pub(crate) fn accept(listener: &net::UnixListener) -> io::Result<(UnixStream, So // Ensure the socket is closed if either of the `fcntl` calls // error below. let s = unsafe { net::UnixStream::from_raw_fd(socket) }; - syscall!(fcntl(socket, libc::F_SETFD, libc::FD_CLOEXEC)).map(|_| s) + syscall!(fcntl(socket, libc::F_SETFD, libc::FD_CLOEXEC))?; + + // See https://github.com/tokio-rs/mio/issues/1450 + #[cfg(all(target_arch = "x86",target_os = "android"))] + syscall!(fcntl(socket, libc::F_SETFL, libc::O_NONBLOCK))?; + + Ok(s) }); socket |