summaryrefslogtreecommitdiffstats
path: root/dive.c
diff options
context:
space:
mode:
authorGravatar Linus Torvalds <torvalds@linux-foundation.org>2012-11-23 19:58:00 -1000
committerGravatar Dirk Hohndel <dirk@hohndel.org>2012-11-25 13:04:47 -0800
commit8d62f20aa0fccfe4ae6f0de6f5ccd1bcb0920075 (patch)
tree372eaf004e22d25f01e54d2d684a5d7fd8cc96ce /dive.c
parent27f7e58493ca16266f32363f55fbe3d979348af0 (diff)
downloadsubsurface-8d62f20aa0fccfe4ae6f0de6f5ccd1bcb0920075.tar.gz
Fix "prefer downloaded" dive sample merging case
When we have a preferred dive computer that overrides old information when merging two dives, we just copy the dive computer data over. However, we need to clear the source of the dive computer data so that we then don't free the sample data when that old source of the newly merged dive gets free'd. This fixes a memory scribble (and likely SIGSEGV) for the "prefer downloaded" case. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'dive.c')
-rw-r--r--dive.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/dive.c b/dive.c
index 698bd00e9..d69aee355 100644
--- a/dive.c
+++ b/dive.c
@@ -1103,6 +1103,13 @@ struct dive *merge_dives(struct dive *a, struct dive *b, int offset, gboolean pr
merge_equipment(res, a, b);
if (dl) {
res->dc = dl->dc;
+ /*
+ * Since we copied the events and samples,
+ * we can't free them from the source when
+ * we free it - so make sure the source
+ * dive computer data is cleared out.
+ */
+ memset(&dl->dc, 0, sizeof(dl->dc));
} else {
merge_events(&res->dc, &a->dc, &b->dc, offset);
merge_samples(&res->dc, &a->dc, &b->dc, offset);