From 832ed8170b75a613700b473883528d5d52d894d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jind=C5=99ich=20Moravec?= Date: Sun, 28 Jan 2024 21:56:02 +0100 Subject: [PATCH] fix: utf8 decoding and add test to prevent it --- proto/src/message/primitive/pgstring.rs | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/proto/src/message/primitive/pgstring.rs b/proto/src/message/primitive/pgstring.rs index 58fad78..c768528 100644 --- a/proto/src/message/primitive/pgstring.rs +++ b/proto/src/message/primitive/pgstring.rs @@ -41,15 +41,33 @@ impl Encode for PgString { impl Decode for PgString { fn decode(decoder: &mut D) -> Result { - let mut string = String::new(); + let mut bytes = Vec::new(); loop { let byte = u8::decode(decoder)?; if byte == 0 { break; } - string.push(byte as char); + bytes.push(byte); } + let string = String::from_utf8(bytes) + .map_err(|e| DecodeError::Utf8 { inner: e.utf8_error() })?; Ok(PgString(string)) } } + +#[cfg(test)] +mod tests { + use crate::message::primitive::data::MessageData; + use super::*; + + #[test] + fn test_encode_decode_utf8() { + let pg_string = PgString::from("áhój jěžkó"); + let encoded = pg_string.serialize().unwrap(); + let decoded: PgString = PgString::deserialize(&encoded).unwrap(); + + let actual = decoded.as_str(); + assert_eq!("áhój jěžkó", actual); + } +}