diff --git a/library/std/src/sys/unix/mod.rs b/library/std/src/sys/unix/mod.rs index 3edafde71e937..ec6f15c85ba7a 100644 --- a/library/std/src/sys/unix/mod.rs +++ b/library/std/src/sys/unix/mod.rs @@ -323,10 +323,18 @@ where F: FnMut() -> T, { loop { - match cvt(f()) { - Err(ref e) if e.is_interrupted() => {} - other => return other, + let t = f(); + if t.is_minus_one() { + let e = crate::io::Error::last_os_error(); + if e.is_interrupted() { + continue; + } + if e.raw_os_error() == Some(libc::EISCONN) { + return Ok(t); + } + return Err(e); } + return Ok(t); } } diff --git a/library/std/src/sys_common/net.rs b/library/std/src/sys_common/net.rs index 4f5b17deaa2da..6dbad9ad0f110 100644 --- a/library/std/src/sys_common/net.rs +++ b/library/std/src/sys_common/net.rs @@ -229,6 +229,7 @@ impl TcpStream { let (addr, len) = addr.into_inner(); cvt_r(|| unsafe { c::connect(sock.as_raw(), addr.as_ptr(), len) })?; + sock.take_error()?; Ok(TcpStream { inner: sock }) }