From 8d62f20aa0fccfe4ae6f0de6f5ccd1bcb0920075 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Fri, 23 Nov 2012 19:58:00 -1000 Subject: 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 Signed-off-by: Dirk Hohndel --- dive.c | 7 +++++++ 1 file changed, 7 insertions(+) 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); -- cgit v1.2.3-70-g09d2