@@ -387,28 +387,31 @@ impl Readable for BigSize {
387
387
/// primarily targets that, we must as well. However, because we may serialize objects that have
388
388
/// more than 65K entries, we need to be able to store larger values. Thus, we define a variable
389
389
/// length integer here which is backwards-compatible but treats 0xffff as "read eight more bytes".
390
- struct U16Or64 ( pub u64 ) ;
391
- impl Writeable for U16Or64 {
390
+ ///
391
+ /// To ensure we only have one valid encoding per value, we add 0xffff to values written as eight
392
+ /// bytes, representing 0xffff as zero-eight-bytes, which 0xfffe is 0xfffe-two-bytes.
393
+ struct U16OrU64 ( pub u64 ) ;
394
+ impl Writeable for U16OrU64 {
392
395
#[ inline]
393
396
fn write < W : Writer > ( & self , writer : & mut W ) -> Result < ( ) , io:: Error > {
394
397
if self . 0 < 0xffff {
395
398
( self . 0 as u16 ) . write ( writer)
396
399
} else {
397
400
0xffffu16 . write ( writer) ?;
398
- ( self . 0 - 0xfffe ) . write ( writer)
401
+ ( self . 0 - 0xffff ) . write ( writer)
399
402
}
400
403
}
401
404
}
402
405
403
- impl Readable for U16Or64 {
406
+ impl Readable for U16OrU64 {
404
407
#[ inline]
405
408
fn read < R : Read > ( r : & mut R ) -> Result < Self , DecodeError > {
406
409
let mut val: u64 = <u16 as Readable >:: read ( r) ? as u64 ;
407
410
if val == 0xffff {
408
411
val = <u64 as Readable >:: read ( r) ?
409
- . checked_add ( 0xfffe ) . ok_or ( DecodeError :: InvalidValue ) ?;
412
+ . checked_add ( 0xffff ) . ok_or ( DecodeError :: InvalidValue ) ?;
410
413
}
411
- Ok ( U16Or64 ( val) )
414
+ Ok ( U16OrU64 ( val) )
412
415
}
413
416
}
414
417
@@ -626,7 +629,7 @@ macro_rules! impl_for_map {
626
629
{
627
630
#[ inline]
628
631
fn write<W : Writer >( & self , w: & mut W ) -> Result <( ) , io:: Error > {
629
- U16Or64 ( self . len( ) as u64 ) . write( w) ?;
632
+ U16OrU64 ( self . len( ) as u64 ) . write( w) ?;
630
633
for ( key, value) in self . iter( ) {
631
634
key. write( w) ?;
632
635
value. write( w) ?;
@@ -640,7 +643,7 @@ macro_rules! impl_for_map {
640
643
{
641
644
#[ inline]
642
645
fn read<R : Read >( r: & mut R ) -> Result <Self , DecodeError > {
643
- let len: U16Or64 = Readable :: read( r) ?;
646
+ let len: U16OrU64 = Readable :: read( r) ?;
644
647
let mut ret = $constr( len. 0 as usize ) ;
645
648
for _ in 0 ..len. 0 {
646
649
let k = K :: read( r) ?;
@@ -666,7 +669,7 @@ where T: Writeable + Eq + Hash
666
669
{
667
670
#[ inline]
668
671
fn write < W : Writer > ( & self , w : & mut W ) -> Result < ( ) , io:: Error > {
669
- U16Or64 ( self . len ( ) as u64 ) . write ( w) ?;
672
+ U16OrU64 ( self . len ( ) as u64 ) . write ( w) ?;
670
673
for item in self . iter ( ) {
671
674
item. write ( w) ?;
672
675
}
@@ -679,7 +682,7 @@ where T: Readable + Eq + Hash
679
682
{
680
683
#[ inline]
681
684
fn read < R : Read > ( r : & mut R ) -> Result < Self , DecodeError > {
682
- let len: U16Or64 = Readable :: read ( r) ?;
685
+ let len: U16OrU64 = Readable :: read ( r) ?;
683
686
let mut ret = HashSet :: with_capacity ( cmp:: min ( len. 0 as usize , MAX_BUF_SIZE / core:: mem:: size_of :: < T > ( ) ) ) ;
684
687
for _ in 0 ..len. 0 {
685
688
if !ret. insert ( T :: read ( r) ?) {
@@ -696,7 +699,7 @@ macro_rules! impl_for_vec {
696
699
impl <$( $name : Writeable ) ,* > Writeable for Vec <$ty> {
697
700
#[ inline]
698
701
fn write<W : Writer >( & self , w: & mut W ) -> Result <( ) , io:: Error > {
699
- U16Or64 ( self . len( ) as u64 ) . write( w) ?;
702
+ U16OrU64 ( self . len( ) as u64 ) . write( w) ?;
700
703
for elem in self . iter( ) {
701
704
elem. write( w) ?;
702
705
}
@@ -707,7 +710,7 @@ macro_rules! impl_for_vec {
707
710
impl <$( $name : Readable ) ,* > Readable for Vec <$ty> {
708
711
#[ inline]
709
712
fn read<R : Read >( r: & mut R ) -> Result <Self , DecodeError > {
710
- let len: U16Or64 = Readable :: read( r) ?;
713
+ let len: U16OrU64 = Readable :: read( r) ?;
711
714
let mut ret = Vec :: with_capacity( cmp:: min( len. 0 as usize , MAX_BUF_SIZE / core:: mem:: size_of:: <$ty>( ) ) ) ;
712
715
for _ in 0 ..len. 0 {
713
716
if let Some ( val) = MaybeReadable :: read( r) ? {
@@ -723,15 +726,15 @@ macro_rules! impl_for_vec {
723
726
impl Writeable for Vec < u8 > {
724
727
#[ inline]
725
728
fn write < W : Writer > ( & self , w : & mut W ) -> Result < ( ) , io:: Error > {
726
- U16Or64 ( self . len ( ) as u64 ) . write ( w) ?;
729
+ U16OrU64 ( self . len ( ) as u64 ) . write ( w) ?;
727
730
w. write_all ( & self )
728
731
}
729
732
}
730
733
731
734
impl Readable for Vec < u8 > {
732
735
#[ inline]
733
736
fn read < R : Read > ( r : & mut R ) -> Result < Self , DecodeError > {
734
- let mut len: U16Or64 = Readable :: read ( r) ?;
737
+ let mut len: U16OrU64 = Readable :: read ( r) ?;
735
738
let mut ret = Vec :: new ( ) ;
736
739
while len. 0 > 0 {
737
740
let readamt = cmp:: min ( len. 0 as usize , MAX_BUF_SIZE ) ;
@@ -1074,7 +1077,7 @@ impl Readable for () {
1074
1077
impl Writeable for String {
1075
1078
#[ inline]
1076
1079
fn write < W : Writer > ( & self , w : & mut W ) -> Result < ( ) , io:: Error > {
1077
- U16Or64 ( self . len ( ) as u64 ) . write ( w) ?;
1080
+ U16OrU64 ( self . len ( ) as u64 ) . write ( w) ?;
1078
1081
w. write_all ( self . as_bytes ( ) )
1079
1082
}
1080
1083
}
0 commit comments