summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2014-07-06 11:02:28 -0700
committerGravatar Dirk Hohndel <dirk@hohndel.org>2014-07-06 11:23:25 -0700
commitd97c49ba39833275cf15a2753cb084efdfd5c923 (patch)
tree1862ab43d620c1584d6852adfe369cc0fbea533e
parent0c24d7d6bd457907765a569b0de5cc0e73ecb6e8 (diff)
downloadsubsurface-d97c49ba39833275cf15a2753cb084efdfd5c923.tar.gz
When copying dives, make copies of samples/events in first DC
We carefully copied the dive computers and their samples and events, but only for the second and later DCs. For the first DC we simply copied the pointers but not what they were pointing at. So when the copied dive was freed, those pointers in the original went to freed memory. Not good. Fixes #599 Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r--dive.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/dive.c b/dive.c
index 6bbb72e1e..e4ad78cb9 100644
--- a/dive.c
+++ b/dive.c
@@ -341,9 +341,13 @@ void copy_dive(struct dive *s, struct dive *d)
d->location = copy_string(s->location);
d->notes = copy_string(s->notes);
d->suit = copy_string(s->suit);
- STRUCTURED_LIST_COPY(struct divecomputer, s->dc.next, d->dc.next, copy_dc);
STRUCTURED_LIST_COPY(struct picture, s->picture_list, d->picture_list, copy_pl);
STRUCTURED_LIST_COPY(struct tag_entry, s->tag_list, d->tag_list, copy_tl);
+ STRUCTURED_LIST_COPY(struct divecomputer, s->dc.next, d->dc.next, copy_dc);
+ /* this only copied dive computers 2 and up. The first dive computer is part
+ * of the struct dive, so let's make copies of its samples and events */
+ copy_samples(&s->dc, &d->dc);
+ copy_events(&s->dc, &d->dc);
}
/* make a clone of the source dive and clean out the source dive;