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 { impl Decode for PgString {
fn decode<D: Decoder>(decoder: &mut D) -> Result<Self, DecodeError> { fn decode<D: Decoder>(decoder: &mut D) -> Result<Self, DecodeError> {
let mut string = String::new(); let mut bytes = Vec::new();
loop { loop {
let byte = u8::decode(decoder)?; let byte = u8::decode(decoder)?;
if byte == 0 { if byte == 0 {
break; 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)) 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);
}
}