@@ -446,19 +446,26 @@ impl<'de> Decoder<'de> {
446446 }
447447 }
448448
449- /// Reads a string directly, following pointers if needed.
450- pub ( crate ) fn read_string ( & mut self ) -> DecodeResult < & ' de str > {
449+ /// Reads a string's bytes directly, following pointers if needed.
450+ /// Does NOT validate UTF-8.
451+ pub ( crate ) fn read_str_as_bytes ( & mut self ) -> DecodeResult < & ' de [ u8 ] > {
451452 let ( size, type_num) = self . size_and_type ( ) ;
452453 if type_num == TYPE_POINTER {
453454 // Pointer
454455 let new_ptr = self . decode_pointer ( size) ;
455456 let saved_ptr = self . current_ptr ;
456457 self . current_ptr = new_ptr;
457- let result = self . read_string ( ) ;
458+ let result = self . read_str_as_bytes ( ) ;
458459 self . current_ptr = saved_ptr;
459460 result
460461 } else if type_num == TYPE_STRING {
461- self . decode_string ( size)
462+ let new_offset = self . current_ptr + size;
463+ if new_offset > self . buf . len ( ) {
464+ return Err ( self . invalid_db_error ( "string length exceeds buffer" ) ) ;
465+ }
466+ let bytes = & self . buf [ self . current_ptr ..new_offset] ;
467+ self . current_ptr = new_offset;
468+ Ok ( bytes)
462469 } else {
463470 Err ( self . invalid_db_error ( & format ! ( "expected string, got type {type_num}" ) ) )
464471 }
@@ -595,10 +602,23 @@ impl<'de: 'a, 'a> de::Deserializer<'de> for &'a mut Decoder<'de> {
595602 visitor. visit_enum ( EnumAccessor { de : self } )
596603 }
597604
605+ fn deserialize_identifier < V > ( self , visitor : V ) -> DecodeResult < V :: Value >
606+ where
607+ V : Visitor < ' de > ,
608+ {
609+ let ( _, type_num) = self . peek_type ( ) ?;
610+ if type_num == TYPE_STRING {
611+ let bytes = self . read_str_as_bytes ( ) ?;
612+ visitor. visit_borrowed_bytes ( bytes)
613+ } else {
614+ self . decode_any ( visitor)
615+ }
616+ }
617+
598618 forward_to_deserialize_any ! {
599619 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
600620 bytes byte_buf unit unit_struct newtype_struct seq tuple
601- tuple_struct map struct identifier
621+ tuple_struct map struct
602622 }
603623}
604624
0 commit comments