@@ -56,6 +56,15 @@ typedef struct {
5656 int type ;
5757} write_table_col_t ;
5858
59+ /* Returns true if adding the specifiec number of rows would result in overflow.
60+ * Tables can support indexes from 0 to INT32_MAX, and therefore have at most
61+ * INT32_MAX + 1 rows */
62+ static bool
63+ check_overflow (tsk_size_t current_size , tsk_size_t additional_rows )
64+ {
65+ size_t new_size = (size_t ) current_size + (size_t ) additional_rows ;
66+ return new_size > ((size_t ) INT32_MAX ) + 1 ;
67+ }
5968
6069static int
6170read_table_cols (kastore_t * store , read_table_col_t * read_cols , size_t num_cols )
@@ -167,6 +176,10 @@ tsk_individual_table_expand_main_columns(tsk_individual_table_t *self,
167176 tsk_size_t increment = TSK_MAX (additional_rows , self -> max_rows_increment );
168177 tsk_size_t new_size = self -> max_rows + increment ;
169178
179+ if (check_overflow (self -> max_rows , increment )) {
180+ ret = TSK_ERR_TABLE_OVERFLOW ;
181+ goto out ;
182+ }
170183 if ((self -> num_rows + additional_rows ) > self -> max_rows ) {
171184 ret = expand_column ((void * * ) & self -> flags , new_size , sizeof (tsk_flags_t ));
172185 if (ret != 0 ) {
@@ -192,10 +205,13 @@ static int
192205tsk_individual_table_expand_location (tsk_individual_table_t * self , tsk_size_t additional_length )
193206{
194207 int ret = 0 ;
195- tsk_size_t increment = TSK_MAX (additional_length ,
196- self -> max_location_length_increment );
208+ tsk_size_t increment = TSK_MAX (additional_length , self -> max_location_length_increment );
197209 tsk_size_t new_size = self -> max_location_length + increment ;
198210
211+ if (check_overflow (self -> location_length , increment )) {
212+ ret = TSK_ERR_COLUMN_OVERFLOW ;
213+ goto out ;
214+ }
199215 if ((self -> location_length + additional_length ) > self -> max_location_length ) {
200216 ret = expand_column ((void * * ) & self -> location , new_size , sizeof (double ));
201217 if (ret != 0 ) {
@@ -215,6 +231,10 @@ tsk_individual_table_expand_metadata(tsk_individual_table_t *self, tsk_size_t ad
215231 self -> max_metadata_length_increment );
216232 tsk_size_t new_size = self -> max_metadata_length + increment ;
217233
234+ if (check_overflow (self -> metadata_length , increment )) {
235+ ret = TSK_ERR_COLUMN_OVERFLOW ;
236+ goto out ;
237+ }
218238 if ((self -> metadata_length + additional_length ) > self -> max_metadata_length ) {
219239 ret = expand_column ((void * * ) & self -> metadata , new_size , sizeof (char ));
220240 if (ret != 0 ) {
@@ -646,6 +666,10 @@ tsk_node_table_expand_main_columns(tsk_node_table_t *self, tsk_size_t additional
646666 tsk_size_t increment = TSK_MAX (additional_rows , self -> max_rows_increment );
647667 tsk_size_t new_size = self -> max_rows + increment ;
648668
669+ if (check_overflow (self -> max_rows , increment )) {
670+ ret = TSK_ERR_TABLE_OVERFLOW ;
671+ goto out ;
672+ }
649673 if ((self -> num_rows + additional_rows ) > self -> max_rows ) {
650674 ret = expand_column ((void * * ) & self -> flags , new_size , sizeof (tsk_flags_t ));
651675 if (ret != 0 ) {
@@ -682,6 +706,10 @@ tsk_node_table_expand_metadata(tsk_node_table_t *self, tsk_size_t additional_len
682706 self -> max_metadata_length_increment );
683707 tsk_size_t new_size = self -> max_metadata_length + increment ;
684708
709+ if (check_overflow (self -> metadata_length , increment )) {
710+ ret = TSK_ERR_COLUMN_OVERFLOW ;
711+ goto out ;
712+ }
685713 if ((self -> metadata_length + additional_length ) > self -> max_metadata_length ) {
686714 ret = expand_column ((void * * ) & self -> metadata , new_size , sizeof (char ));
687715 if (ret != 0 ) {
@@ -1056,6 +1084,10 @@ tsk_edge_table_expand_columns(tsk_edge_table_t *self, size_t additional_rows)
10561084 (tsk_size_t ) additional_rows , self -> max_rows_increment );
10571085 tsk_size_t new_size = self -> max_rows + increment ;
10581086
1087+ if (check_overflow (self -> max_rows , increment )) {
1088+ ret = TSK_ERR_TABLE_OVERFLOW ;
1089+ goto out ;
1090+ }
10591091 if ((self -> num_rows + additional_rows ) > self -> max_rows ) {
10601092 ret = expand_column ((void * * ) & self -> left , new_size , sizeof (double ));
10611093 if (ret != 0 ) {
@@ -1321,6 +1353,10 @@ tsk_site_table_expand_main_columns(tsk_site_table_t *self, tsk_size_t additional
13211353 tsk_size_t increment = TSK_MAX (additional_rows , self -> max_rows_increment );
13221354 tsk_size_t new_size = self -> max_rows + increment ;
13231355
1356+ if (check_overflow (self -> max_rows , increment )) {
1357+ ret = TSK_ERR_TABLE_OVERFLOW ;
1358+ goto out ;
1359+ }
13241360 if ((self -> num_rows + additional_rows ) > self -> max_rows ) {
13251361 ret = expand_column ((void * * ) & self -> position , new_size , sizeof (double ));
13261362 if (ret != 0 ) {
@@ -1350,6 +1386,10 @@ tsk_site_table_expand_ancestral_state(tsk_site_table_t *self, size_t additional_
13501386 self -> max_ancestral_state_length_increment );
13511387 tsk_size_t new_size = self -> max_ancestral_state_length + increment ;
13521388
1389+ if (check_overflow (self -> ancestral_state_length , increment )) {
1390+ ret = TSK_ERR_COLUMN_OVERFLOW ;
1391+ goto out ;
1392+ }
13531393 if ((self -> ancestral_state_length + additional_length )
13541394 > self -> max_ancestral_state_length ) {
13551395 ret = expand_column ((void * * ) & self -> ancestral_state , new_size , sizeof (char ));
@@ -1370,6 +1410,10 @@ tsk_site_table_expand_metadata(tsk_site_table_t *self, size_t additional_length)
13701410 self -> max_metadata_length_increment );
13711411 tsk_size_t new_size = self -> max_metadata_length + increment ;
13721412
1413+ if (check_overflow (self -> metadata_length , increment )) {
1414+ ret = TSK_ERR_COLUMN_OVERFLOW ;
1415+ goto out ;
1416+ }
13731417 if ((self -> metadata_length + additional_length )
13741418 > self -> max_metadata_length ) {
13751419 ret = expand_column ((void * * ) & self -> metadata , new_size , sizeof (char ));
@@ -1776,6 +1820,11 @@ tsk_mutation_table_expand_main_columns(tsk_mutation_table_t *self, size_t additi
17761820 tsk_size_t increment = (tsk_size_t ) TSK_MAX (additional_rows , self -> max_rows_increment );
17771821 tsk_size_t new_size = self -> max_rows + increment ;
17781822
1823+
1824+ if (check_overflow (self -> max_rows , increment )) {
1825+ ret = TSK_ERR_TABLE_OVERFLOW ;
1826+ goto out ;
1827+ }
17791828 if ((self -> num_rows + additional_rows ) > self -> max_rows ) {
17801829 ret = expand_column ((void * * ) & self -> site , new_size , sizeof (tsk_id_t ));
17811830 if (ret != 0 ) {
@@ -1813,6 +1862,10 @@ tsk_mutation_table_expand_derived_state(tsk_mutation_table_t *self, size_t addit
18131862 self -> max_derived_state_length_increment );
18141863 tsk_size_t new_size = self -> max_derived_state_length + increment ;
18151864
1865+ if (check_overflow (self -> derived_state_length , increment )) {
1866+ ret = TSK_ERR_COLUMN_OVERFLOW ;
1867+ goto out ;
1868+ }
18161869 if ((self -> derived_state_length + additional_length )
18171870 > self -> max_derived_state_length ) {
18181871 ret = expand_column ((void * * ) & self -> derived_state , new_size , sizeof (char ));
@@ -1833,6 +1886,10 @@ tsk_mutation_table_expand_metadata(tsk_mutation_table_t *self, size_t additional
18331886 self -> max_metadata_length_increment );
18341887 tsk_size_t new_size = self -> max_metadata_length + increment ;
18351888
1889+ if (check_overflow (self -> metadata_length , increment )) {
1890+ ret = TSK_ERR_COLUMN_OVERFLOW ;
1891+ goto out ;
1892+ }
18361893 if ((self -> metadata_length + additional_length )
18371894 > self -> max_metadata_length ) {
18381895 ret = expand_column ((void * * ) & self -> metadata , new_size , sizeof (char ));
@@ -2262,6 +2319,10 @@ tsk_migration_table_expand(tsk_migration_table_t *self, size_t additional_rows)
22622319 (tsk_size_t ) additional_rows , self -> max_rows_increment );
22632320 tsk_size_t new_size = self -> max_rows + increment ;
22642321
2322+ if (check_overflow (self -> max_rows , increment )) {
2323+ ret = TSK_ERR_TABLE_OVERFLOW ;
2324+ goto out ;
2325+ }
22652326 if ((self -> num_rows + additional_rows ) > self -> max_rows ) {
22662327 ret = expand_column ((void * * ) & self -> left , new_size , sizeof (double ));
22672328 if (ret != 0 ) {
@@ -2558,6 +2619,10 @@ tsk_population_table_expand_main_columns(tsk_population_table_t *self, tsk_size_
25582619 tsk_size_t increment = TSK_MAX (additional_rows , self -> max_rows_increment );
25592620 tsk_size_t new_size = self -> max_rows + increment ;
25602621
2622+ if (check_overflow (self -> max_rows , increment )) {
2623+ ret = TSK_ERR_TABLE_OVERFLOW ;
2624+ goto out ;
2625+ }
25612626 if ((self -> num_rows + additional_rows ) > self -> max_rows ) {
25622627 ret = expand_column ((void * * ) & self -> metadata_offset , new_size + 1 ,
25632628 sizeof (tsk_size_t ));
@@ -2578,6 +2643,10 @@ tsk_population_table_expand_metadata(tsk_population_table_t *self, tsk_size_t ad
25782643 self -> max_metadata_length_increment );
25792644 tsk_size_t new_size = self -> max_metadata_length + increment ;
25802645
2646+ if (check_overflow (self -> metadata_length , increment )) {
2647+ ret = TSK_ERR_COLUMN_OVERFLOW ;
2648+ goto out ;
2649+ }
25812650 if ((self -> metadata_length + additional_length ) > self -> max_metadata_length ) {
25822651 ret = expand_column ((void * * ) & self -> metadata , new_size , sizeof (char ));
25832652 if (ret != 0 ) {
@@ -2890,6 +2959,10 @@ tsk_provenance_table_expand_main_columns(tsk_provenance_table_t *self, tsk_size_
28902959 tsk_size_t increment = TSK_MAX (additional_rows , self -> max_rows_increment );
28912960 tsk_size_t new_size = self -> max_rows + increment ;
28922961
2962+ if (check_overflow (self -> max_rows , increment )) {
2963+ ret = TSK_ERR_TABLE_OVERFLOW ;
2964+ goto out ;
2965+ }
28932966 if ((self -> num_rows + additional_rows ) > self -> max_rows ) {
28942967 ret = expand_column ((void * * ) & self -> timestamp_offset , new_size + 1 ,
28952968 sizeof (tsk_size_t ));
@@ -2915,6 +2988,10 @@ tsk_provenance_table_expand_timestamp(tsk_provenance_table_t *self, tsk_size_t a
29152988 self -> max_timestamp_length_increment );
29162989 tsk_size_t new_size = self -> max_timestamp_length + increment ;
29172990
2991+ if (check_overflow (self -> timestamp_length , increment )) {
2992+ ret = TSK_ERR_COLUMN_OVERFLOW ;
2993+ goto out ;
2994+ }
29182995 if ((self -> timestamp_length + additional_length ) > self -> max_timestamp_length ) {
29192996 ret = expand_column ((void * * ) & self -> timestamp , new_size , sizeof (char ));
29202997 if (ret != 0 ) {
@@ -2934,6 +3011,10 @@ tsk_provenance_table_expand_provenance(tsk_provenance_table_t *self, tsk_size_t
29343011 self -> max_record_length_increment );
29353012 tsk_size_t new_size = self -> max_record_length + increment ;
29363013
3014+ if (check_overflow (self -> record_length , increment )) {
3015+ ret = TSK_ERR_COLUMN_OVERFLOW ;
3016+ goto out ;
3017+ }
29373018 if ((self -> record_length + additional_length ) > self -> max_record_length ) {
29383019 ret = expand_column ((void * * ) & self -> record , new_size , sizeof (char ));
29393020 if (ret != 0 ) {
0 commit comments