core: initialize dive selection after resetting the data

The dive selection was initialized during data-reset. However,
this emitted a signal before all data-reset routines were run.
Ultimately, this led to access-after-free in the statistics code.

Instead, move the select_newest_visible_dive() signal from the
divelist-model to the process_loaded_dives() function. There
is no point in initializing the selection if the dive data
is cleared after all.

This change broke closing of the log, because the UI-selection
was not reset. Therefore, when clearing the data, clear the
selection before proceeding with clearing.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2021-03-31 13:54:23 +02:00
parent f299fa37f9
commit a988e3c135
2 changed files with 4 additions and 2 deletions

View file

@ -824,6 +824,9 @@ void process_loaded_dives()
/* Inform frontend of reset data. This should reset all the models. */
emit_reset_signal();
/* Now that everything is settled, select the newest dive. */
select_newest_visible_dive();
}
/*
@ -1373,7 +1376,7 @@ int get_dive_id_closest_to(timestamp_t when)
void clear_dive_file_data()
{
fulltext_unregister_all();
clear_selection();
select_single_dive(NULL); // This is propagate up to the UI and clears all the information.
while (dive_table.nr)
delete_single_dive(0);

View file

@ -499,7 +499,6 @@ void DiveTripModelBase::reset()
uiNotification(tr("finish populating data store"));
endResetModel();
uiNotification(tr("setting up internal data structures"));
initSelection();
emit diveListNotifier.numShownChanged();
uiNotification(tr("done setting up internal data structures"));
}