@@ -443,12 +443,38 @@ fn decode_bytes_ref<'de, R: Read<'de>>(num: TypeNum, reader: &mut R)
443443
444444#[ inline]
445445#[ cfg( feature = "use_alloc" ) ]
446- fn decode_bytes < ' a , R : Read < ' a > > ( num : TypeNum , reader : & mut R , buf : & mut Vec < u8 > )
447- -> Result < Option < & ' a [ u8 ] > , Error < R :: Error > >
446+ fn decode_bytes_buf < ' a , R : Read < ' a > > ( num : TypeNum , reader : & mut R , len : usize , buf : & mut Vec < u8 > )
447+ -> Result < ( ) , Error < R :: Error > >
448448{
449449 const CAP_LIMIT : usize = 16 * 1024 ;
450450
451- if let Some ( mut len) = decode_len ( num, reader) ? {
451+ let mut len = len;
452+ buf. reserve ( core:: cmp:: min ( len, CAP_LIMIT ) ) ; // TODO try_reserve ?
453+
454+ while len != 0 {
455+ let readbuf = reader. fill ( len) ?;
456+ let readbuf = readbuf. as_ref ( ) ;
457+
458+ if readbuf. is_empty ( ) {
459+ return Err ( Error :: eof ( num. name , len) ) ;
460+ }
461+
462+ let readlen = core:: cmp:: min ( readbuf. len ( ) , len) ;
463+
464+ buf. extend_from_slice ( & readbuf[ ..readlen] ) ;
465+ reader. advance ( readlen) ;
466+ len -= readlen;
467+ }
468+
469+ Ok ( ( ) )
470+ }
471+
472+ #[ inline]
473+ #[ cfg( feature = "use_alloc" ) ]
474+ fn decode_bytes < ' a , R : Read < ' a > > ( num : TypeNum , reader : & mut R , buf : & mut Vec < u8 > )
475+ -> Result < Option < & ' a [ u8 ] > , Error < R :: Error > >
476+ {
477+ if let Some ( len) = decode_len ( num, reader) ? {
452478 // try long lifetime buffer
453479 if let Reference :: Long ( buf) = reader. fill ( len) ? {
454480 if buf. len ( ) >= len {
@@ -457,22 +483,7 @@ fn decode_bytes<'a, R: Read<'a>>(num: TypeNum, reader: &mut R, buf: &mut Vec<u8>
457483 }
458484 }
459485
460- buf. reserve ( core:: cmp:: min ( len, CAP_LIMIT ) ) ; // TODO try_reserve ?
461-
462- while len != 0 {
463- let readbuf = reader. fill ( len) ?;
464- let readbuf = readbuf. as_ref ( ) ;
465-
466- if readbuf. is_empty ( ) {
467- return Err ( Error :: eof ( num. name , len) ) ;
468- }
469-
470- let readlen = core:: cmp:: min ( readbuf. len ( ) , len) ;
471-
472- buf. extend_from_slice ( & readbuf[ ..readlen] ) ;
473- reader. advance ( readlen) ;
474- len -= readlen;
475- }
486+ decode_bytes_buf ( num, reader, len, buf) ?;
476487
477488 Ok ( None )
478489 } else {
@@ -486,8 +497,9 @@ fn decode_bytes<'a, R: Read<'a>>(num: TypeNum, reader: &mut R, buf: &mut Vec<u8>
486497
487498 // followed by a series of zero or more strings of
488499 // the specified type ("chunks") that have **definite lengths**
489- let longbuf = decode_bytes_ref ( num, reader) ?;
490- buf. extend_from_slice ( longbuf) ;
500+ let len = decode_len ( num, reader) ?
501+ . ok_or_else ( || Error :: require_length ( num. name , None ) ) ?;
502+ decode_bytes_buf ( num, reader, len, buf) ?;
491503 }
492504
493505 Ok ( None )
0 commit comments