aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Eggert2019-04-21 09:59:13 -0700
committerPaul Eggert2019-04-21 09:59:33 -0700
commit2ea55c2774e726c7e393ee81b152aa9734c410cb (patch)
treea572007fe6175dbf40993fb5a8fa4c149e033afa /src
parentd9664f0d9e03ecfbcd7115a27200c5259bc19162 (diff)
downloademacs-2ea55c2774e726c7e393ee81b152aa9734c410cb.tar.gz
emacs-2ea55c2774e726c7e393ee81b152aa9734c410cb.zip
Fix double-free in pdumper
Revert the double-free bug that I introduced in 2019-03-11T15:20:54Z!eggert@cs.ucla.edu. * src/pdumper.c (dump_mmap_reset): Do not free the private member; that’s the release function’s job. (dump_mm_heap_cb_release): Free cb if its refcount goes to zero. (dump_mmap_contiguous_heap): Mention memory leak in comment.
Diffstat (limited to 'src')
-rw-r--r--src/pdumper.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/pdumper.c b/src/pdumper.c
index 5bc5bb47f4c..3facd523e4a 100644
--- a/src/pdumper.c
+++ b/src/pdumper.c
@@ -4623,9 +4623,7 @@ dump_mmap_reset (struct dump_memory_map *map)
4623{ 4623{
4624 map->mapping = NULL; 4624 map->mapping = NULL;
4625 map->release = NULL; 4625 map->release = NULL;
4626 void *private = map->private;
4627 map->private = NULL; 4626 map->private = NULL;
4628 free (private);
4629} 4627}
4630 4628
4631static void 4629static void
@@ -4648,7 +4646,10 @@ dump_mm_heap_cb_release (struct dump_memory_map_heap_control_block *cb)
4648{ 4646{
4649 eassert (cb->refcount > 0); 4647 eassert (cb->refcount > 0);
4650 if (--cb->refcount == 0) 4648 if (--cb->refcount == 0)
4651 free (cb->mem); 4649 {
4650 free (cb->mem);
4651 free (cb);
4652 }
4652} 4653}
4653 4654
4654static void 4655static void
@@ -4663,7 +4664,12 @@ dump_mmap_contiguous_heap (struct dump_memory_map *maps, int nr_maps,
4663 size_t total_size) 4664 size_t total_size)
4664{ 4665{
4665 bool ret = false; 4666 bool ret = false;
4667
4668 /* FIXME: This storage sometimes is never freed.
4669 Beware: the simple patch 2019-03-11T15:20:54Z!eggert@cs.ucla.edu
4670 is worse, as it sometimes frees this storage twice. */
4666 struct dump_memory_map_heap_control_block *cb = calloc (1, sizeof (*cb)); 4671 struct dump_memory_map_heap_control_block *cb = calloc (1, sizeof (*cb));
4672
4667 char *mem; 4673 char *mem;
4668 if (!cb) 4674 if (!cb)
4669 goto out; 4675 goto out;