From 88c545bfdda8bae8a1ad463730a8ce99b0fc7c37 Mon Sep 17 00:00:00 2001 From: Alexis Sellier Date: Thu, 16 Mar 2023 15:24:27 +0100 Subject: [PATCH] node: Make sure to only read packet-line header If there is an unexpected error, eg. `BrokenPipe` in the upload process process of the worker, we may have more than four bytes to read from the remote socket. This change ensures that we don't attempt to read more into a buffer of size `4`. --- radicle-node/src/worker.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/radicle-node/src/worker.rs b/radicle-node/src/worker.rs index df34db7c..eacc96c9 100644 --- a/radicle-node/src/worker.rs +++ b/radicle-node/src/worker.rs @@ -174,7 +174,7 @@ impl Worker { log::debug!(target: "worker", "Waiting for `done` packet from remote.."); let mut header = [0; pktline::HEADER_LEN]; - if let Ok(pktline::Packetline::Done) = pktline_r.read_pktline(&mut header) { + if let Ok(()) = pktline_r.read_done_pktline(&mut header) { (WireSession::from_split_io(stream_r, stream_w), Err(err)) } else { log::error!( @@ -460,6 +460,16 @@ pub mod pktline { Ok((cmd, Vec::from(&pktline[..length]))) } + /// Parse a `done` packet-line. + pub fn read_done_pktline(&mut self, buf: &mut [u8]) -> io::Result<()> { + self.read_exact(&mut buf[..HEADER_LEN])?; + + if &buf[..HEADER_LEN] == DONE_PKT { + return Ok(()); + } + Err(io::ErrorKind::InvalidInput.into()) + } + /// Parse a Git packet-line. pub fn read_pktline(&mut self, buf: &mut [u8]) -> io::Result { self.read_exact(&mut buf[..HEADER_LEN])?;