aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Linus Torvalds <torvalds@linux-foundation.org>2013-01-23 13:19:58 -0800
committerGravatar Dirk Hohndel <dirk@hohndel.org>2013-01-23 13:37:02 -0800
commit4982389ca762ef4831fc095f00e65e8c7b4bfc1a (patch)
treebf63050672beaadf79038d9a0701df885b636859
parent413b9026dd01e81cf804db27f8b0c06c48e833e2 (diff)
downloadsubsurface-4982389ca762ef4831fc095f00e65e8c7b4bfc1a.tar.gz
Fix setting of the dive_table.preexisting logic
The 'preexisting' value is used for downloading dives: we want to add new dives but, but then compare those new dives against the preexisting ones before we start sorting things and possibly merging them. However, the value was only updated sporadically, resulting in it having stale information in it. Which would cause problems particularly if you deleted dives, so that the preexisting value would point past the actual existing values! So just update it unconditionally in dive_list_update_dives(), which anything that changes the dive list is supposed to call in order to display the changes anyway. Also, just for safety, when removing a dive, put NULL in the last dive table location. Nobody should ever access past the end anyway (this is enforced by 'get_dive()') but there are places that access the dive list table directly, and the libdivecomputer download was one of those. No reason to leave stale dive pointers possibly around for uses like that. Reported-by: Henrik Brautaset Aronsen <subsurface@henrik.synth.no> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r--divelist.c3
-rw-r--r--gtk-gui.c1
-rw-r--r--main.c2
3 files changed, 3 insertions, 3 deletions
diff --git a/divelist.c b/divelist.c
index 8aa957d1e..f9ca3ef41 100644
--- a/divelist.c
+++ b/divelist.c
@@ -1457,6 +1457,7 @@ static void fill_dive_list(void)
void dive_list_update_dives(void)
{
+ dive_table.preexisting = dive_table.nr;
gtk_tree_store_clear(TREESTORE(dive_list));
gtk_tree_store_clear(LISTSTORE(dive_list));
fill_dive_list();
@@ -2207,7 +2208,7 @@ void delete_single_dive(int idx)
remove_dive_from_trip(dive);
for (i = idx; i < dive_table.nr - 1; i++)
dive_table.dives[i] = dive_table.dives[i+1];
- dive_table.nr--;
+ dive_table.dives[--dive_table.nr] = NULL;
if (dive->selected)
amount_selected--;
/* free all allocations */
diff --git a/gtk-gui.c b/gtk-gui.c
index e165012d5..3df6fbf70 100644
--- a/gtk-gui.c
+++ b/gtk-gui.c
@@ -242,7 +242,6 @@ static void file_close(GtkWidget *w, gpointer data)
/* free the dives and trips */
while (dive_table.nr)
delete_single_dive(0);
- dive_table.preexisting = 0;
mark_divelist_changed(FALSE);
/* clear the selection and the statistics */
diff --git a/main.c b/main.c
index 307dd13c1..0e98d9059 100644
--- a/main.c
+++ b/main.c
@@ -181,6 +181,7 @@ void report_dives(gboolean is_imported, gboolean prefer_imported)
add_single_dive(i, merged);
delete_single_dive(i+1);
delete_single_dive(i+1);
+ mark_divelist_changed(TRUE);
}
/* make sure no dives are still marked as downloaded */
for (i = 1; i < dive_table.nr; i++)
@@ -195,7 +196,6 @@ void report_dives(gboolean is_imported, gboolean prefer_imported)
if (preexisting != dive_table.nr)
mark_divelist_changed(TRUE);
}
- dive_table.preexisting = dive_table.nr;
dive_list_update_dives();
}