about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2014-01-06 10:31:46 -0800
committerbors <bors@rust-lang.org>2014-01-06 10:31:46 -0800
commit0da105a8b7b6b1e0568e8ff20f6ff4b13cc7ecc2 (patch)
treea38543052b4f21492467265630caf5f89e396de6 /src/libstd
parent8b71b6415dd16dc694bc7d3b1a99d0116b6a0cee (diff)
parent11e568c886ce1ced558dc638065f938ea3dee973 (diff)
downloadrust-0da105a8b7b6b1e0568e8ff20f6ff4b13cc7ecc2.tar.gz
rust-0da105a8b7b6b1e0568e8ff20f6ff4b13cc7ecc2.zip
auto merge of #11334 : alexcrichton/rust/fix-native-tcp, r=pcwalton
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.rs21
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();
+    })
 }