1- use core:: { cmp, fmt, hash, isize, mem, slice, usize} ;
1+ use core:: { cmp, fmt, hash, isize, slice, usize} ;
2+ use core:: mem:: { self , ManuallyDrop } ;
23use core:: ops:: { Deref , DerefMut } ;
34use core:: ptr:: { self , NonNull } ;
45use core:: iter:: { FromIterator , Iterator } ;
@@ -559,17 +560,15 @@ impl BytesMut {
559560 self . cap += off;
560561 } else {
561562 // No space - allocate more
562- let mut v = rebuild_vec ( self . ptr . as_ptr ( ) , self . len , self . cap , off) ;
563+ let mut v = ManuallyDrop :: new ( rebuild_vec ( self . ptr . as_ptr ( ) , self . len , self . cap , off) ) ;
563564 v. reserve ( additional) ;
564565
565566 // Update the info
566567 self . ptr = vptr ( v. as_mut_ptr ( ) . offset ( off as isize ) ) ;
567568 self . len = v. len ( ) - off;
568569 self . cap = v. capacity ( ) - off;
569-
570- // Drop the vec reference
571- mem:: forget ( v) ;
572570 }
571+
573572 return ;
574573 }
575574 }
@@ -582,7 +581,8 @@ impl BytesMut {
582581 // allocating a new vector with the requested capacity.
583582 //
584583 // Compute the new capacity
585- let mut new_cap = len + additional;
584+ let mut new_cap = len. checked_add ( additional) . expect ( "overflow" ) ;
585+
586586 let original_capacity;
587587 let original_capacity_repr;
588588
@@ -618,16 +618,18 @@ impl BytesMut {
618618 // There are some situations, using `reserve_exact` that the
619619 // buffer capacity could be below `original_capacity`, so do a
620620 // check.
621+ let double = v. capacity ( ) . checked_shl ( 1 ) . unwrap_or ( new_cap) ;
622+
621623 new_cap = cmp:: max (
622- cmp:: max ( v . capacity ( ) << 1 , new_cap) ,
624+ cmp:: max ( double , new_cap) ,
623625 original_capacity) ;
624626 } else {
625627 new_cap = cmp:: max ( new_cap, original_capacity) ;
626628 }
627629 }
628630
629631 // Create a new vector to store the data
630- let mut v = Vec :: with_capacity ( new_cap) ;
632+ let mut v = ManuallyDrop :: new ( Vec :: with_capacity ( new_cap) ) ;
631633
632634 // Copy the bytes
633635 v. extend_from_slice ( self . as_ref ( ) ) ;
@@ -642,10 +644,6 @@ impl BytesMut {
642644 self . ptr = vptr ( v. as_mut_ptr ( ) ) ;
643645 self . len = v. len ( ) ;
644646 self . cap = v. capacity ( ) ;
645-
646- // Forget the vector handle
647- mem:: forget ( v) ;
648-
649647 }
650648 /// Appends given bytes to this object.
651649 ///
@@ -924,20 +922,27 @@ impl Buf for BytesMut {
924922impl BufMut for BytesMut {
925923 #[ inline]
926924 fn remaining_mut ( & self ) -> usize {
927- self . capacity ( ) - self . len ( )
925+ usize :: MAX - self . len ( )
928926 }
929927
930928 #[ inline]
931929 unsafe fn advance_mut ( & mut self , cnt : usize ) {
932930 let new_len = self . len ( ) + cnt;
933- assert ! ( new_len <= self . cap) ;
931+ assert ! ( new_len <= self . cap, "new_len = {}; capacity = {}" , new_len , self . cap ) ;
934932 self . len = new_len;
935933 }
936934
937935 #[ inline]
938936 fn bytes_mut ( & mut self ) -> & mut [ mem:: MaybeUninit < u8 > ] {
937+ if self . capacity ( ) == self . len ( ) {
938+ self . reserve ( 64 ) ;
939+ }
940+
939941 unsafe {
940- slice:: from_raw_parts_mut ( self . ptr . as_ptr ( ) . offset ( self . len as isize ) as * mut mem:: MaybeUninit < u8 > , self . cap )
942+ let ptr = self . ptr . as_ptr ( ) . offset ( self . len as isize ) ;
943+ let len = self . cap - self . len ;
944+
945+ slice:: from_raw_parts_mut ( ptr as * mut mem:: MaybeUninit < u8 > , len)
941946 }
942947 }
943948}
0 commit comments