@@ -408,7 +408,9 @@ unsafe fn alloc_dynamic_table_elements<T>(len: usize) -> Result<Vec<Option<T>>>
408408
409409 let size = mem:: size_of :: < Option < T > > ( ) ;
410410 let size = size. next_multiple_of ( align) ;
411- let size = size. checked_mul ( len) . unwrap ( ) ;
411+ let size = size
412+ . checked_mul ( len)
413+ . ok_or_else ( || format_err ! ( "overflow calculating table allocation size" ) ) ?;
412414
413415 let layout = Layout :: from_size_align ( size, align) ?;
414416
@@ -826,12 +828,15 @@ impl Table {
826828 // that delta is non-zero and the new size doesn't exceed the
827829 // maximum mean we can't get here.
828830 Table :: Dynamic ( DynamicTable :: Func ( DynamicFuncTable { elements, .. } ) ) => {
831+ vec_reserve_resize ( elements, new_size) ?;
829832 elements. resize ( new_size, None ) ;
830833 }
831834 Table :: Dynamic ( DynamicTable :: GcRef ( DynamicGcRefTable { elements, .. } ) ) => {
835+ vec_reserve_resize ( elements, new_size) ?;
832836 elements. resize_with ( new_size, || None ) ;
833837 }
834838 Table :: Dynamic ( DynamicTable :: Cont ( DynamicContTable { elements, .. } ) ) => {
839+ vec_reserve_resize ( elements, new_size) ?;
835840 elements. resize ( new_size, None ) ;
836841 }
837842 }
@@ -1230,3 +1235,10 @@ impl Default for Table {
12301235 } )
12311236 }
12321237}
1238+
1239+ fn vec_reserve_resize < T > ( vec : & mut Vec < T > , new_size : usize ) -> Result < ( ) > {
1240+ if vec. len ( ) < new_size {
1241+ vec. try_reserve ( new_size - vec. len ( ) ) ?;
1242+ }
1243+ Ok ( ( ) )
1244+ }
0 commit comments