Skip to content

Commit f2085e3

Browse files
committed
Rollup merge of rust-lang#48330 - frewsxcv:frewsxcv-tests-zero-duration, r=sfackler
Add tests ensuring zero-Duration timeouts result in errors; fix Redox issues. Part of rust-lang#48311
2 parents 52bd669 + 0755825 commit f2085e3

File tree

5 files changed

+93
-1
lines changed

5 files changed

+93
-1
lines changed

src/libstd/net/tcp.rs

+20
Original file line numberDiff line numberDiff line change
@@ -1545,6 +1545,26 @@ mod tests {
15451545
drop(listener);
15461546
}
15471547

1548+
// Ensure the `set_read_timeout` and `set_write_timeout` calls return errors
1549+
// when passed zero Durations
1550+
#[test]
1551+
fn test_timeout_zero_duration() {
1552+
let addr = next_test_ip4();
1553+
1554+
let listener = t!(TcpListener::bind(&addr));
1555+
let stream = t!(TcpStream::connect(&addr));
1556+
1557+
let result = stream.set_write_timeout(Some(Duration::new(0, 0)));
1558+
let err = result.unwrap_err();
1559+
assert_eq!(err.kind(), ErrorKind::InvalidInput);
1560+
1561+
let result = stream.set_read_timeout(Some(Duration::new(0, 0)));
1562+
let err = result.unwrap_err();
1563+
assert_eq!(err.kind(), ErrorKind::InvalidInput);
1564+
1565+
drop(listener);
1566+
}
1567+
15481568
#[test]
15491569
fn nodelay() {
15501570
let addr = next_test_ip4();

src/libstd/net/udp.rs

+17
Original file line numberDiff line numberDiff line change
@@ -1024,6 +1024,23 @@ mod tests {
10241024
assert!(start.elapsed() > Duration::from_millis(400));
10251025
}
10261026

1027+
// Ensure the `set_read_timeout` and `set_write_timeout` calls return errors
1028+
// when passed zero Durations
1029+
#[test]
1030+
fn test_timeout_zero_duration() {
1031+
let addr = next_test_ip4();
1032+
1033+
let socket = t!(UdpSocket::bind(&addr));
1034+
1035+
let result = socket.set_write_timeout(Some(Duration::new(0, 0)));
1036+
let err = result.unwrap_err();
1037+
assert_eq!(err.kind(), ErrorKind::InvalidInput);
1038+
1039+
let result = socket.set_read_timeout(Some(Duration::new(0, 0)));
1040+
let err = result.unwrap_err();
1041+
assert_eq!(err.kind(), ErrorKind::InvalidInput);
1042+
}
1043+
10271044
#[test]
10281045
fn connect_send_recv() {
10291046
let addr = next_test_ip4();

src/libstd/sys/redox/net/tcp.rs

+8
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,10 @@ impl TcpStream {
130130
pub fn set_read_timeout(&self, duration_option: Option<Duration>) -> Result<()> {
131131
let file = self.0.dup(b"read_timeout")?;
132132
if let Some(duration) = duration_option {
133+
if dur.as_secs() == 0 && dur.subsec_nanos() == 0 {
134+
return Err(io::Error::new(io::ErrorKind::InvalidInput,
135+
"cannot set a 0 duration timeout"));
136+
}
133137
file.write(&TimeSpec {
134138
tv_sec: duration.as_secs() as i64,
135139
tv_nsec: duration.subsec_nanos() as i32
@@ -143,6 +147,10 @@ impl TcpStream {
143147
pub fn set_write_timeout(&self, duration_option: Option<Duration>) -> Result<()> {
144148
let file = self.0.dup(b"write_timeout")?;
145149
if let Some(duration) = duration_option {
150+
if dur.as_secs() == 0 && dur.subsec_nanos() == 0 {
151+
return Err(io::Error::new(io::ErrorKind::InvalidInput,
152+
"cannot set a 0 duration timeout"));
153+
}
146154
file.write(&TimeSpec {
147155
tv_sec: duration.as_secs() as i64,
148156
tv_nsec: duration.subsec_nanos() as i32

src/libstd/sys/redox/net/udp.rs

+8
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,10 @@ impl UdpSocket {
179179
pub fn set_read_timeout(&self, duration_option: Option<Duration>) -> Result<()> {
180180
let file = self.0.dup(b"read_timeout")?;
181181
if let Some(duration) = duration_option {
182+
if dur.as_secs() == 0 && dur.subsec_nanos() == 0 {
183+
return Err(io::Error::new(io::ErrorKind::InvalidInput,
184+
"cannot set a 0 duration timeout"));
185+
}
182186
file.write(&TimeSpec {
183187
tv_sec: duration.as_secs() as i64,
184188
tv_nsec: duration.subsec_nanos() as i32
@@ -192,6 +196,10 @@ impl UdpSocket {
192196
pub fn set_write_timeout(&self, duration_option: Option<Duration>) -> Result<()> {
193197
let file = self.0.dup(b"write_timeout")?;
194198
if let Some(duration) = duration_option {
199+
if dur.as_secs() == 0 && dur.subsec_nanos() == 0 {
200+
return Err(io::Error::new(io::ErrorKind::InvalidInput,
201+
"cannot set a 0 duration timeout"));
202+
}
195203
file.write(&TimeSpec {
196204
tv_sec: duration.as_secs() as i64,
197205
tv_nsec: duration.subsec_nanos() as i32

src/libstd/sys/unix/ext/net.rs

+40-1
Original file line numberDiff line numberDiff line change
@@ -1410,7 +1410,7 @@ impl IntoRawFd for UnixDatagram {
14101410
#[cfg(all(test, not(target_os = "emscripten")))]
14111411
mod test {
14121412
use thread;
1413-
use io;
1413+
use io::{self, ErrorKind};
14141414
use io::prelude::*;
14151415
use time::Duration;
14161416
use sys_common::io::test::tmpdir;
@@ -1613,6 +1613,27 @@ mod test {
16131613
assert!(kind == io::ErrorKind::WouldBlock || kind == io::ErrorKind::TimedOut);
16141614
}
16151615

1616+
// Ensure the `set_read_timeout` and `set_write_timeout` calls return errors
1617+
// when passed zero Durations
1618+
#[test]
1619+
fn test_unix_stream_timeout_zero_duration() {
1620+
let dir = tmpdir();
1621+
let socket_path = dir.path().join("sock");
1622+
1623+
let listener = or_panic!(UnixListener::bind(&socket_path));
1624+
let stream = or_panic!(UnixStream::connect(&socket_path));
1625+
1626+
let result = stream.set_write_timeout(Some(Duration::new(0, 0)));
1627+
let err = result.unwrap_err();
1628+
assert_eq!(err.kind(), ErrorKind::InvalidInput);
1629+
1630+
let result = stream.set_read_timeout(Some(Duration::new(0, 0)));
1631+
let err = result.unwrap_err();
1632+
assert_eq!(err.kind(), ErrorKind::InvalidInput);
1633+
1634+
drop(listener);
1635+
}
1636+
16161637
#[test]
16171638
fn test_unix_datagram() {
16181639
let dir = tmpdir();
@@ -1712,6 +1733,24 @@ mod test {
17121733
thread.join().unwrap();
17131734
}
17141735

1736+
// Ensure the `set_read_timeout` and `set_write_timeout` calls return errors
1737+
// when passed zero Durations
1738+
#[test]
1739+
fn test_unix_datagram_timeout_zero_duration() {
1740+
let dir = tmpdir();
1741+
let path = dir.path().join("sock");
1742+
1743+
let datagram = or_panic!(UnixDatagram::bind(&path));
1744+
1745+
let result = datagram.set_write_timeout(Some(Duration::new(0, 0)));
1746+
let err = result.unwrap_err();
1747+
assert_eq!(err.kind(), ErrorKind::InvalidInput);
1748+
1749+
let result = datagram.set_read_timeout(Some(Duration::new(0, 0)));
1750+
let err = result.unwrap_err();
1751+
assert_eq!(err.kind(), ErrorKind::InvalidInput);
1752+
}
1753+
17151754
#[test]
17161755
fn abstract_namespace_not_allowed() {
17171756
assert!(UnixStream::connect("\0asdf").is_err());

0 commit comments

Comments
 (0)