From 4d176b7b7c11aabc584bee45423f108ea47faefe Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Tue, 14 Dec 2021 23:27:04 +0100 Subject: fix(ext/net): make unix and tcp identical on close (#13075) std/http/server knows how to handle "Listener has been closed" exceptions but not "operation canceled" errors. Make "unix" listen sockets throw the same exception as "tcp" listen sockets when the socket is closed and has a pending accept operation. There is still a discrepancy when multiple accept requests are posted but that's probably a less visible issue and something for another day. Fixes #13033 --- ext/net/ops_unix.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'ext/net/ops_unix.rs') diff --git a/ext/net/ops_unix.rs b/ext/net/ops_unix.rs index 20d085a5d..58bfa0557 100644 --- a/ext/net/ops_unix.rs +++ b/ext/net/ops_unix.rs @@ -91,8 +91,11 @@ pub(crate) async fn accept_unix( .try_borrow_mut() .ok_or_else(|| custom_error("Busy", "Listener already in use"))?; let cancel = RcRef::map(resource, |r| &r.cancel); - let (unix_stream, _socket_addr) = - listener.accept().try_or_cancel(cancel).await?; + let (unix_stream, _socket_addr) = listener + .accept() + .try_or_cancel(cancel) + .await + .map_err(crate::ops::accept_err)?; let local_addr = unix_stream.local_addr()?; let remote_addr = unix_stream.peer_addr()?; -- cgit v1.2.3