From 18d5fa7ca297202bb9f92288a0b538f6bf1a5ebe Mon Sep 17 00:00:00 2001 From: Daniel Akhterov Date: Mon, 29 Jul 2019 18:52:55 -0700 Subject: [PATCH] FIX: int encoding keyword bytes --- src/mariadb/protocol/encode.rs | 51 +++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/src/mariadb/protocol/encode.rs b/src/mariadb/protocol/encode.rs index 6c550b4c..a96346d6 100644 --- a/src/mariadb/protocol/encode.rs +++ b/src/mariadb/protocol/encode.rs @@ -98,8 +98,17 @@ impl Encoder { self.encode_int_2(*value as u16); } else if *value <= std::u8::MAX as usize { - self.encode_int_1(*value as u8); + match *value { + // If the value is of size u8 and one of the key bytes used in length encoding + // we must encode that single byte as a u16 + 0xFB | 0xFC | 0xFD | 0xFE | 0xFF => { + self.buf.put_u8(0xFC); + self.buf.put_u8(*value as u8); + self.buf.put_u8(0); + } + v => self.buf.put_u8(v as u8), + } } else { panic!("Value is too long"); } @@ -240,6 +249,46 @@ mod tests { assert_eq!(&encoder.buf[..], b"\xFE\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"); } + #[test] + fn it_encodes_int_lenenc_fb() { + let mut encoder = Encoder::new(128); + encoder.encode_int_lenenc(Some(&(0xFB as usize))); + + assert_eq!(&encoder.buf[..], b"\xFC\xFB\x00"); + } + + #[test] + fn it_encodes_int_lenenc_fc() { + let mut encoder = Encoder::new(128); + encoder.encode_int_lenenc(Some(&(0xFC as usize))); + + assert_eq!(&encoder.buf[..], b"\xFC\xFC\x00"); + } + + #[test] + fn it_encodes_int_lenenc_fd() { + let mut encoder = Encoder::new(128); + encoder.encode_int_lenenc(Some(&(0xFD as usize))); + + assert_eq!(&encoder.buf[..], b"\xFC\xFD\x00"); + } + + + #[test] + fn it_encodes_int_lenenc_fe() { + let mut encoder = Encoder::new(128); + encoder.encode_int_lenenc(Some(&(0xFE as usize))); + + assert_eq!(&encoder.buf[..], b"\xFC\xFE\x00"); + } + + fn it_encodes_int_lenenc_ff() { + let mut encoder = Encoder::new(128); + encoder.encode_int_lenenc(Some(&(0xFF as usize))); + + assert_eq!(&encoder.buf[..], b"\xFC\xFF\x00"); + } + #[test] fn it_encodes_int_u64() { let mut encoder = Encoder::new(128);