From ffc0ad7c86408193b213c46cbca5c0d8b60f8632 Mon Sep 17 00:00:00 2001 From: Mroik Date: Sat, 11 Apr 2026 04:02:53 +0200 Subject: Do not propagate TcpListener.accept() errors Errors produced by the socket may not be necessarily fatal, meaning that while a connection might be dropped the process should be able to resume execution as if nothing happened and accept the next connection. Error handling for accept() has been copied from NGINX's [1]. [1] https://stackoverflow.com/questions/76955978/which-socket-accept-errors-are-fatal Signed-off-by: Mroik --- src/smtp_server.rs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/smtp_server.rs b/src/smtp_server.rs index bacf8eb..e6c0efc 100644 --- a/src/smtp_server.rs +++ b/src/smtp_server.rs @@ -27,7 +27,21 @@ impl SmtpServer { pub async fn run(&mut self, tx_processor: Sender) -> Result<()> { self.running = true; while self.running { - let (stream, addr) = self.listener.accept()?; + let (stream, addr) = match self.listener.accept() { + Ok(v) => v, + Err(e) => match e.raw_os_error() { + Some(libc::EMFILE | libc::ENFILE) => return Err(anyhow::Error::from(e)), + Some(libc::ECONNABORTED) => { + log::error!("{}", e); + continue; + } + Some(libc::EAGAIN) => continue, + _ => { + log::warn!("{}", e); + continue; + } + }, + }; let session = SessionHandler { addr, tx_processor: tx_processor.clone(), -- cgit v1.3