From a8d32103d1445a98dbd4541ea3f7f6b33be0d1ff Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 2 Dec 2019 23:00:56 -0800 Subject: [PATCH] Ensure IpEchoServerMessage is not fragmented (#7214) (#7215) automerge --- net-utils/src/ip_echo_server.rs | 13 +++++++++++++ net-utils/src/lib.rs | 13 +++++++------ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/net-utils/src/ip_echo_server.rs b/net-utils/src/ip_echo_server.rs index 2205586634..c096726f3f 100644 --- a/net-utils/src/ip_echo_server.rs +++ b/net-utils/src/ip_echo_server.rs @@ -70,6 +70,19 @@ pub fn ip_echo_server(tcp: std::net::TcpListener) -> IpEchoServer { )); } + let expected_len = + bincode::serialized_size(&IpEchoServerMessage::default()).unwrap() as usize; + let actual_len = data[4..].len(); + if actual_len < expected_len { + return Err(io::Error::new( + io::ErrorKind::Other, + format!( + "Request too short, actual {} < expected {}", + actual_len, expected_len + ), + )); + } + bincode::deserialize::(&data[4..]) .map(Some) .or_else(|err| { diff --git a/net-utils/src/lib.rs b/net-utils/src/lib.rs index b368aab8be..fa3923fd65 100644 --- a/net-utils/src/lib.rs +++ b/net-utils/src/lib.rs @@ -29,14 +29,15 @@ fn ip_echo_server_request( let timeout = Duration::new(5, 0); TcpStream::connect_timeout(ip_echo_server_addr, timeout) .and_then(|mut stream| { - let msg = bincode::serialize(&msg).expect("serialize IpEchoServerMessage"); - // Start with 4 null bytes to avoid looking like an HTTP GET/POST request - stream.write_all(&[0; 4])?; + let mut bytes = vec![0; 4]; // Start with 4 null bytes to avoid looking like an HTTP GET/POST request - stream.write_all(&msg)?; + bytes.append(&mut bincode::serialize(&msg).expect("serialize IpEchoServerMessage")); - // Send a '\n' to make this request look HTTP-ish and tickle an error response back from an HTTP server - stream.write_all(b"\n")?; + // End with '\n' to make this request look HTTP-ish and tickle an error response back + // from an HTTP server + bytes.push(b'\n'); + + stream.write_all(&bytes)?; stream.shutdown(std::net::Shutdown::Write)?; stream .set_read_timeout(Some(Duration::new(10, 0)))