diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2014-01-05 22:16:16 -0800 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2014-01-06 00:08:18 -0800 |
| commit | 11e568c886ce1ced558dc638065f938ea3dee973 (patch) | |
| tree | ccb43f4a53a8a4eddd2db174def928e483829727 /src/libstd | |
| parent | a6d3e57dca68fde4effdda3e4ae2887aa535fcd6 (diff) | |
| download | rust-11e568c886ce1ced558dc638065f938ea3dee973.tar.gz rust-11e568c886ce1ced558dc638065f938ea3dee973.zip | |
Don't wait for a full buffer when reading TCP
libnative erroneously would attempt to fill the entire buffer in a call to `read` before returning, when rather it should return immediately because there's not guaranteed to be any data that will ever be received again. Close #11328
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/io/net/tcp.rs | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/libstd/io/net/tcp.rs b/src/libstd/io/net/tcp.rs index 52cca7f622b..c2a70e0120d 100644 --- a/src/libstd/io/net/tcp.rs +++ b/src/libstd/io/net/tcp.rs @@ -589,4 +589,25 @@ mod test { //peer_name(next_test_ip6()); socket_name(next_test_ip6()); }) + + iotest!(fn partial_read() { + let addr = next_test_ip4(); + let (p, c) = Chan::new(); + do spawn { + let mut srv = TcpListener::bind(addr).listen(); + c.send(()); + let mut cl = srv.accept().unwrap(); + cl.write([10]); + let mut b = [0]; + cl.read(b); + c.send(()); + } + + p.recv(); + let mut c = TcpStream::connect(addr).unwrap(); + let mut b = [0, ..10]; + assert_eq!(c.read(b), Some(1)); + c.write([1]); + p.recv(); + }) } |
