@@ -8,7 +8,7 @@ pub trait MySqlBufExt: Buf {
88 // NOTE: 0xfb or NULL is only returned for binary value encoding to indicate NULL.
99 // NOTE: 0xff is only returned during a result set to indicate ERR.
1010 // <https://dev.mysql.com/doc/internals/en/integer.html#packet-Protocol::LengthEncodedInteger>
11- fn get_uint_lenenc ( & mut self ) -> u64 ;
11+ fn get_uint_lenenc ( & mut self ) -> Result < u64 , Error > ;
1212
1313 // Read a length-encoded string.
1414 #[ allow( dead_code) ]
@@ -19,26 +19,54 @@ pub trait MySqlBufExt: Buf {
1919}
2020
2121impl MySqlBufExt for Bytes {
22- fn get_uint_lenenc ( & mut self ) -> u64 {
22+ fn get_uint_lenenc ( & mut self ) -> Result < u64 , Error > {
23+ if self . remaining ( ) < 1 {
24+ return Err ( err_protocol ! ( "lenenc int: no bytes remaining" ) ) ;
25+ }
26+
2327 match self . get_u8 ( ) {
24- 0xfc => u64:: from ( self . get_u16_le ( ) ) ,
25- 0xfd => self . get_uint_le ( 3 ) ,
26- 0xfe => self . get_u64_le ( ) ,
28+ 0xfc => {
29+ if self . remaining ( ) < 2 {
30+ return Err ( err_protocol ! (
31+ "lenenc int: need 2 more bytes, have {}" ,
32+ self . remaining( )
33+ ) ) ;
34+ }
35+ Ok ( u64:: from ( self . get_u16_le ( ) ) )
36+ }
37+ 0xfd => {
38+ if self . remaining ( ) < 3 {
39+ return Err ( err_protocol ! (
40+ "lenenc int: need 3 more bytes, have {}" ,
41+ self . remaining( )
42+ ) ) ;
43+ }
44+ Ok ( self . get_uint_le ( 3 ) )
45+ }
46+ 0xfe => {
47+ if self . remaining ( ) < 8 {
48+ return Err ( err_protocol ! (
49+ "lenenc int: need 8 more bytes, have {}" ,
50+ self . remaining( )
51+ ) ) ;
52+ }
53+ Ok ( self . get_u64_le ( ) )
54+ }
2755
28- v => u64:: from ( v) ,
56+ v => Ok ( u64:: from ( v) ) ,
2957 }
3058 }
3159
3260 fn get_str_lenenc ( & mut self ) -> Result < String , Error > {
33- let size = self . get_uint_lenenc ( ) ;
61+ let size = self . get_uint_lenenc ( ) ? ;
3462 let size = usize:: try_from ( size)
3563 . map_err ( |_| err_protocol ! ( "string length overflows usize: {size}" ) ) ?;
3664
3765 self . get_str ( size)
3866 }
3967
4068 fn get_bytes_lenenc ( & mut self ) -> Result < Bytes , Error > {
41- let size = self . get_uint_lenenc ( ) ;
69+ let size = self . get_uint_lenenc ( ) ? ;
4270 let size = usize:: try_from ( size)
4371 . map_err ( |_| err_protocol ! ( "string length overflows usize: {size}" ) ) ?;
4472
0 commit comments