diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-04-11 14:25:03 -0700 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2016-05-31 10:16:13 -0700 |
commit | 25829721211d8e9295cd3539b3ef05ee49a968e0 (patch) | |
tree | aa306c8894fd0652f1af0c9b221c0b632c338970 | |
parent | 8acbeed55584c21931238f9b4738e337919029b9 (diff) | |
download | subsurface-25829721211d8e9295cd3539b3ef05ee49a968e0.tar.gz |
Make 'clear_dive()' free the primary dive computer data properly
Our primary dive computer really is special, not just because it's the
first one: it's directly embedded in the "struct dive", and so if you
just walk the divecomputer list, you'll miss it, because it's not _on_
the list, it is the very head _of_ the list.
We had that bug in copy_dive(), and it turns out we have it in
clear_dive() too: clear_dive() would free all the dive computers on the
list, but not the actual primary one.
This is a minor memory leak, no more, so it's not exactly critial, but
let's just do it right.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r-- | core/dive.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/core/dive.c b/core/dive.c index 20ab2e5d6..29198afd6 100644 --- a/core/dive.c +++ b/core/dive.c @@ -364,6 +364,7 @@ struct dive *alloc_dive(void) } static void free_dc(struct divecomputer *dc); +static void free_dc_contents(struct divecomputer *dc); static void free_pic(struct picture *picture); /* this is very different from the copy_divecomputer later in this file; @@ -432,6 +433,7 @@ void clear_dive(struct dive *d) free(d->suit); /* free tags, additional dive computers, and pictures */ taglist_free(d->tag_list); + free_dc_contents(&d->dc); STRUCTURED_LIST_FREE(struct divecomputer, d->dc.next, free_dc); STRUCTURED_LIST_FREE(struct picture, d->picture_list, free_pic); for (int i = 0; i < MAX_CYLINDERS; i++) @@ -2479,11 +2481,16 @@ void free_events(struct event *ev) } } -static void free_dc(struct divecomputer *dc) +static void free_dc_contents(struct divecomputer *dc) { free(dc->sample); free((void *)dc->model); free_events(dc->events); +} + +static void free_dc(struct divecomputer *dc) +{ + free_dc_contents(dc); free(dc); } |