@@ -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,57 @@ 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 ! (
25+ "lenenc int: no bytes remaining" ,
26+ self . remaining( )
27+ ) ) ;
28+ }
29+
2330 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 ( ) ,
31+ 0xfc => {
32+ if self . remaining ( ) < 2 {
33+ return Err ( err_protocol ! (
34+ "lenenc int: need 2 more bytes, have {}" ,
35+ self . remaining( )
36+ ) ) ;
37+ }
38+ Ok ( u64:: from ( self . get_u16_le ( ) ) )
39+ }
40+ 0xfd => {
41+ if self . remaining ( ) < 3 {
42+ return Err ( err_protocol ! (
43+ "lenenc int: need 3 more bytes, have {}" ,
44+ self . remaining( )
45+ ) ) ;
46+ }
47+ Ok ( self . get_uint_le ( 3 ) )
48+ }
49+ 0xfe => {
50+ if self . remaining ( ) < 8 {
51+ return Err ( err_protocol ! (
52+ "lenenc int: need 8 more bytes, have {}" ,
53+ self . remaining( )
54+ ) ) ;
55+ }
56+ Ok ( self . get_u64_le ( ) )
57+ }
2758
28- v => u64:: from ( v) ,
59+ v => Ok ( u64:: from ( v) ) ,
2960 }
3061 }
3162
3263 fn get_str_lenenc ( & mut self ) -> Result < String , Error > {
33- let size = self . get_uint_lenenc ( ) ;
64+ let size = self . get_uint_lenenc ( ) ? ;
3465 let size = usize:: try_from ( size)
3566 . map_err ( |_| err_protocol ! ( "string length overflows usize: {size}" ) ) ?;
3667
3768 self . get_str ( size)
3869 }
3970
4071 fn get_bytes_lenenc ( & mut self ) -> Result < Bytes , Error > {
41- let size = self . get_uint_lenenc ( ) ;
72+ let size = self . get_uint_lenenc ( ) ? ;
4273 let size = usize:: try_from ( size)
4374 . map_err ( |_| err_protocol ! ( "string length overflows usize: {size}" ) ) ?;
4475
0 commit comments