Skip to content

Commit d10e1a5

Browse files
authored
Merge pull request #1511 from benjeffery/fix_check_offsets
Fix check offsets
2 parents 2c897a3 + 73f1a67 commit d10e1a5

File tree

3 files changed

+177
-249
lines changed

3 files changed

+177
-249
lines changed

c/CHANGELOG.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88

99
**Fixes**
1010

11+
- Fix segfault when very large columns overflow
12+
(:user:`bhaller`, :user:`benjeffery`, :issue:`1509`, :pr:`1511`).
13+
1114
----------------------
1215
[0.99.12] - 2021-05-14
1316
----------------------

c/tests/test_tables.c

Lines changed: 93 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5441,60 +5441,147 @@ test_column_overflow(void)
54415441
ret = tsk_table_collection_init(&tables, 0);
54425442
CU_ASSERT_EQUAL_FATAL(ret, 0);
54435443

5444+
// location
54445445
/* We can't trigger a column overflow with one element because the parameter
54455446
* value is 32 bit */
54465447
ret_id = tsk_individual_table_add_row(
54475448
&tables.individuals, 0, &zero, 1, NULL, 0, NULL, 0);
54485449
CU_ASSERT_EQUAL_FATAL(ret_id, 0);
5450+
// Check normal overflow from additional length
54495451
ret_id = tsk_individual_table_add_row(
54505452
&tables.individuals, 0, NULL, too_big, NULL, 0, NULL, 0);
54515453
CU_ASSERT_EQUAL_FATAL(ret_id, TSK_ERR_COLUMN_OVERFLOW);
5454+
// Check overflow from minimum increment
5455+
ret = tsk_individual_table_set_max_location_length_increment(
5456+
&tables.individuals, too_big);
5457+
CU_ASSERT_EQUAL_FATAL(ret, 0);
54525458
ret_id = tsk_individual_table_add_row(
5453-
&tables.individuals, 0, NULL, 0, NULL, 0, zeros, 1);
5459+
&tables.individuals, 0, NULL, 1, NULL, 0, NULL, 0);
5460+
CU_ASSERT_EQUAL_FATAL(ret_id, TSK_ERR_COLUMN_OVERFLOW);
5461+
// parents
5462+
ret_id = tsk_individual_table_add_row(
5463+
&tables.individuals, 0, NULL, 0, id_zeros, 1, NULL, 0);
54545464
CU_ASSERT_EQUAL_FATAL(ret_id, 1);
54555465
ret_id = tsk_individual_table_add_row(
5456-
&tables.individuals, 0, NULL, 0, NULL, 0, NULL, too_big);
5466+
&tables.individuals, 0, NULL, 0, NULL, too_big, NULL, 0);
54575467
CU_ASSERT_EQUAL_FATAL(ret_id, TSK_ERR_COLUMN_OVERFLOW);
5468+
ret = tsk_individual_table_set_max_parents_length_increment(
5469+
&tables.individuals, too_big);
5470+
CU_ASSERT_EQUAL_FATAL(ret, 0);
54585471
ret_id = tsk_individual_table_add_row(
5459-
&tables.individuals, 0, NULL, 0, id_zeros, 1, NULL, 0);
5472+
&tables.individuals, 0, NULL, 0, NULL, 1, NULL, 0);
5473+
CU_ASSERT_EQUAL_FATAL(ret_id, TSK_ERR_COLUMN_OVERFLOW);
5474+
// metadata
5475+
ret_id = tsk_individual_table_add_row(
5476+
&tables.individuals, 0, NULL, 0, NULL, 0, zeros, 1);
54605477
CU_ASSERT_EQUAL_FATAL(ret_id, 2);
54615478
ret_id = tsk_individual_table_add_row(
5462-
&tables.individuals, 0, NULL, 0, NULL, too_big, NULL, 0);
5479+
&tables.individuals, 0, NULL, 0, NULL, 0, NULL, too_big);
5480+
CU_ASSERT_EQUAL_FATAL(ret_id, TSK_ERR_COLUMN_OVERFLOW);
5481+
ret = tsk_individual_table_set_max_metadata_length_increment(
5482+
&tables.individuals, too_big);
5483+
CU_ASSERT_EQUAL_FATAL(ret, 0);
5484+
ret_id = tsk_individual_table_add_row(
5485+
&tables.individuals, 0, NULL, 0, NULL, 0, NULL, 1);
54635486
CU_ASSERT_EQUAL_FATAL(ret_id, TSK_ERR_COLUMN_OVERFLOW);
54645487

54655488
ret_id = tsk_node_table_add_row(&tables.nodes, 0, 0, 0, 0, zeros, 1);
54665489
CU_ASSERT_EQUAL_FATAL(ret_id, 0);
54675490
ret_id = tsk_node_table_add_row(&tables.nodes, 0, 0, 0, 0, NULL, too_big);
54685491
CU_ASSERT_EQUAL_FATAL(ret_id, TSK_ERR_COLUMN_OVERFLOW);
5492+
ret = tsk_node_table_set_max_metadata_length_increment(&tables.nodes, too_big);
5493+
CU_ASSERT_EQUAL_FATAL(ret, 0);
5494+
ret_id = tsk_node_table_add_row(&tables.nodes, 0, 0, 0, 0, NULL, 1);
5495+
CU_ASSERT_EQUAL_FATAL(ret_id, TSK_ERR_COLUMN_OVERFLOW);
5496+
5497+
ret_id = tsk_edge_table_add_row(&tables.edges, 0, 0, 0, 0, zeros, 1);
5498+
CU_ASSERT_EQUAL_FATAL(ret_id, 0);
5499+
ret_id = tsk_edge_table_add_row(&tables.edges, 0, 0, 0, 0, NULL, too_big);
5500+
CU_ASSERT_EQUAL_FATAL(ret_id, TSK_ERR_COLUMN_OVERFLOW);
5501+
ret = tsk_edge_table_set_max_metadata_length_increment(&tables.edges, too_big);
5502+
CU_ASSERT_EQUAL_FATAL(ret, 0);
5503+
ret_id = tsk_edge_table_add_row(&tables.edges, 0, 0, 0, 0, NULL, 1);
5504+
CU_ASSERT_EQUAL_FATAL(ret_id, TSK_ERR_COLUMN_OVERFLOW);
54695505

54705506
ret_id = tsk_site_table_add_row(&tables.sites, 0, zeros, 1, zeros, 1);
54715507
CU_ASSERT_EQUAL_FATAL(ret_id, 0);
5508+
// ancestral state
54725509
ret_id = tsk_site_table_add_row(&tables.sites, 0, NULL, too_big, NULL, 0);
54735510
CU_ASSERT_EQUAL_FATAL(ret_id, TSK_ERR_COLUMN_OVERFLOW);
5511+
ret = tsk_site_table_set_max_ancestral_state_length_increment(
5512+
&tables.sites, too_big);
5513+
CU_ASSERT_EQUAL_FATAL(ret, 0);
5514+
ret_id = tsk_site_table_add_row(&tables.sites, 0, NULL, 1, NULL, 0);
5515+
CU_ASSERT_EQUAL_FATAL(ret_id, TSK_ERR_COLUMN_OVERFLOW);
5516+
// metadata
54745517
ret_id = tsk_site_table_add_row(&tables.sites, 0, NULL, 0, NULL, too_big);
54755518
CU_ASSERT_EQUAL_FATAL(ret_id, TSK_ERR_COLUMN_OVERFLOW);
5519+
ret = tsk_site_table_set_max_metadata_length_increment(&tables.sites, too_big);
5520+
CU_ASSERT_EQUAL_FATAL(ret, 0);
5521+
ret_id = tsk_site_table_add_row(&tables.sites, 0, NULL, 0, NULL, 1);
5522+
CU_ASSERT_EQUAL_FATAL(ret_id, TSK_ERR_COLUMN_OVERFLOW);
54765523

54775524
ret_id
54785525
= tsk_mutation_table_add_row(&tables.mutations, 0, 0, 0, 0, zeros, 1, zeros, 1);
54795526
CU_ASSERT_EQUAL_FATAL(ret_id, 0);
5527+
// derived state
54805528
ret_id = tsk_mutation_table_add_row(
5481-
&tables.mutations, 0, 0, 0, 0, NULL, 0, NULL, too_big);
5529+
&tables.mutations, 0, 0, 0, 0, NULL, too_big, NULL, 0);
5530+
CU_ASSERT_EQUAL_FATAL(ret_id, TSK_ERR_COLUMN_OVERFLOW);
5531+
ret = tsk_mutation_table_set_max_derived_state_length_increment(
5532+
&tables.mutations, too_big);
5533+
CU_ASSERT_EQUAL_FATAL(ret, 0);
5534+
ret_id = tsk_mutation_table_add_row(&tables.mutations, 0, 0, 0, 0, NULL, 1, NULL, 0);
54825535
CU_ASSERT_EQUAL_FATAL(ret_id, TSK_ERR_COLUMN_OVERFLOW);
5536+
// metadata
54835537
ret_id = tsk_mutation_table_add_row(
5484-
&tables.mutations, 0, 0, 0, 0, NULL, too_big, NULL, 0);
5538+
&tables.mutations, 0, 0, 0, 0, NULL, 0, NULL, too_big);
5539+
CU_ASSERT_EQUAL_FATAL(ret_id, TSK_ERR_COLUMN_OVERFLOW);
5540+
ret = tsk_mutation_table_set_max_metadata_length_increment(
5541+
&tables.mutations, too_big);
5542+
CU_ASSERT_EQUAL_FATAL(ret, 0);
5543+
ret_id = tsk_mutation_table_add_row(&tables.mutations, 0, 0, 0, 0, NULL, 0, NULL, 1);
54855544
CU_ASSERT_EQUAL_FATAL(ret_id, TSK_ERR_COLUMN_OVERFLOW);
54865545

54875546
ret_id = tsk_provenance_table_add_row(&tables.provenances, zeros, 1, zeros, 1);
54885547
CU_ASSERT_EQUAL_FATAL(ret_id, 0)
5548+
// timestamp
54895549
ret_id = tsk_provenance_table_add_row(&tables.provenances, NULL, too_big, NULL, 0);
54905550
CU_ASSERT_EQUAL_FATAL(ret_id, TSK_ERR_COLUMN_OVERFLOW);
5551+
ret = tsk_provenance_table_set_max_timestamp_length_increment(
5552+
&tables.provenances, too_big);
5553+
CU_ASSERT_EQUAL_FATAL(ret, 0);
5554+
ret_id = tsk_provenance_table_add_row(&tables.provenances, NULL, 1, NULL, 0);
5555+
CU_ASSERT_EQUAL_FATAL(ret_id, TSK_ERR_COLUMN_OVERFLOW);
5556+
// record
54915557
ret_id = tsk_provenance_table_add_row(&tables.provenances, NULL, 0, NULL, too_big);
54925558
CU_ASSERT_EQUAL_FATAL(ret_id, TSK_ERR_COLUMN_OVERFLOW);
5559+
ret = tsk_provenance_table_set_max_record_length_increment(
5560+
&tables.provenances, too_big);
5561+
CU_ASSERT_EQUAL_FATAL(ret, 0);
5562+
ret_id = tsk_provenance_table_add_row(&tables.provenances, NULL, 0, NULL, 1);
5563+
CU_ASSERT_EQUAL_FATAL(ret_id, TSK_ERR_COLUMN_OVERFLOW);
54935564

54945565
ret_id = tsk_population_table_add_row(&tables.populations, zeros, 1);
54955566
CU_ASSERT_EQUAL_FATAL(ret_id, 0);
54965567
ret_id = tsk_population_table_add_row(&tables.populations, NULL, too_big);
54975568
CU_ASSERT_EQUAL_FATAL(ret_id, TSK_ERR_COLUMN_OVERFLOW);
5569+
ret = tsk_population_table_set_max_metadata_length_increment(
5570+
&tables.populations, too_big);
5571+
CU_ASSERT_EQUAL_FATAL(ret, 0);
5572+
ret_id = tsk_population_table_add_row(&tables.populations, NULL, 1);
5573+
CU_ASSERT_EQUAL_FATAL(ret_id, TSK_ERR_COLUMN_OVERFLOW);
5574+
5575+
ret_id = tsk_migration_table_add_row(&tables.migrations, 0, 0, 0, 0, 0, 0, zeros, 1);
5576+
CU_ASSERT_EQUAL_FATAL(ret_id, 0);
5577+
ret_id = tsk_migration_table_add_row(
5578+
&tables.migrations, 0, 0, 0, 0, 0, 0, NULL, too_big);
5579+
CU_ASSERT_EQUAL_FATAL(ret_id, TSK_ERR_COLUMN_OVERFLOW);
5580+
ret = tsk_migration_table_set_max_metadata_length_increment(
5581+
&tables.migrations, too_big);
5582+
CU_ASSERT_EQUAL_FATAL(ret, 0);
5583+
ret_id = tsk_migration_table_add_row(&tables.migrations, 0, 0, 0, 0, 0, 0, NULL, 1);
5584+
CU_ASSERT_EQUAL_FATAL(ret_id, TSK_ERR_COLUMN_OVERFLOW);
54985585

54995586
tsk_table_collection_free(&tables);
55005587
}

0 commit comments

Comments
 (0)