diff --git a/postgres-replication/src/protocol.rs b/postgres-replication/src/protocol.rs index 2344f3721..3f3899121 100644 --- a/postgres-replication/src/protocol.rs +++ b/postgres-replication/src/protocol.rs @@ -442,9 +442,8 @@ impl TupleData { TUPLE_DATA_TOAST_TAG => TupleData::UnchangedToast, TUPLE_DATA_TEXT_TAG => { let len = buf.read_i32::()?; - let mut data = vec![0; len as usize]; - buf.read_exact(&mut data)?; - TupleData::Text(data.into()) + let data = buf.read_buf(len as usize)?; + TupleData::Text(data) } TUPLE_DATA_BINARY_TAG => { let len = buf.read_i32::()?; @@ -778,6 +777,20 @@ impl Buffer { self.idx = self.bytes.len(); buf } + + #[inline] + fn read_buf(&mut self, len: usize) -> io::Result { + if self.idx + len <= self.bytes.len() { + let buf = self.bytes.slice(self.idx..(self.idx + len)); + self.idx += len; + Ok(buf) + } else { + Err(io::Error::new( + io::ErrorKind::UnexpectedEof, + "unexpected EOF", + )) + } + } } impl Read for Buffer {