@@ -309,7 +309,9 @@ unsafe fn alloc_dynamic_table_elements<T>(len: usize) -> Result<Vec<Option<T>>>
309309
310310 let size = mem:: size_of :: < Option < T > > ( ) ;
311311 let size = size. next_multiple_of ( align) ;
312- let size = size. checked_mul ( len) . unwrap ( ) ;
312+ let size = size
313+ . checked_mul ( len)
314+ . ok_or_else ( || format_err ! ( "overflow calculating table allocation size" ) ) ?;
313315
314316 let layout = Layout :: from_size_align ( size, align) ?;
315317
@@ -728,12 +730,15 @@ impl Table {
728730 // that delta is non-zero and the new size doesn't exceed the
729731 // maximum mean we can't get here.
730732 Table :: Dynamic ( DynamicTable :: Func ( DynamicFuncTable { elements, .. } ) ) => {
733+ vec_reserve_resize ( elements, new_size) ?;
731734 elements. resize ( new_size, None ) ;
732735 }
733736 Table :: Dynamic ( DynamicTable :: GcRef ( DynamicGcRefTable { elements, .. } ) ) => {
737+ vec_reserve_resize ( elements, new_size) ?;
734738 elements. resize_with ( new_size, || None ) ;
735739 }
736740 Table :: Dynamic ( DynamicTable :: Cont ( DynamicContTable { elements, .. } ) ) => {
741+ vec_reserve_resize ( elements, new_size) ?;
737742 elements. resize ( new_size, None ) ;
738743 }
739744 }
@@ -1140,3 +1145,10 @@ impl Default for Table {
11401145 } )
11411146 }
11421147}
1148+
1149+ fn vec_reserve_resize < T > ( vec : & mut Vec < T > , new_size : usize ) -> Result < ( ) > {
1150+ if vec. len ( ) < new_size {
1151+ vec. try_reserve ( new_size - vec. len ( ) ) ?;
1152+ }
1153+ Ok ( ( ) )
1154+ }
0 commit comments