fix: utf8 decoding and add test to prevent it

This commit is contained in:
Jindřich Moravec 2024-01-28 21:56:02 +01:00
parent e53650d02e
commit 832ed8170b

View file

@ -41,15 +41,33 @@ impl Encode for PgString {
impl Decode for PgString {
fn decode<D: Decoder>(decoder: &mut D) -> Result<Self, DecodeError> {
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);
}
}