summaryrefslogtreecommitdiff
path: root/libdw/libdw_alloc.c
diff options
context:
space:
mode:
authorMark Wielaard <mark@klomp.org>2019-11-11 00:15:55 +0100
committerMark Wielaard <mark@klomp.org>2019-11-12 22:33:56 +0100
commit287e502815bf133f64afbf47211b11364a0a322f (patch)
tree37b5cc5d828ac08ff0e90a8db2078a708573f005 /libdw/libdw_alloc.c
parent32cd9c4ad5b888da9c4f94a702a02d380b2a745b (diff)
downloadelfutils-287e502815bf133f64afbf47211b11364a0a322f.tar.gz
libdw: Introduce libdw_unalloc to stop Dwarf_Abbrev leaks.
In the case of reading an invalid abbrev or when reading an abbrev concurrently the Dwarf_Abbrev just created might leak because it isn't needed after all. Introduce libdw_unalloc and libdw_typed_unalloc to unallocate such Dwarf_Abbrevs so they don't leak. Signed-off-by: Mark Wielaard <mark@klomp.org>
Diffstat (limited to 'libdw/libdw_alloc.c')
-rw-r--r--libdw/libdw_alloc.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/libdw/libdw_alloc.c b/libdw/libdw_alloc.c
index 0eb02c34..e0281a3d 100644
--- a/libdw/libdw_alloc.c
+++ b/libdw/libdw_alloc.c
@@ -97,6 +97,18 @@ __libdw_alloc_tail (Dwarf *dbg)
return result;
}
+/* Can only be called after a allocation for this thread has already
+ been done, to possibly undo it. */
+struct libdw_memblock *
+__libdw_thread_tail (Dwarf *dbg)
+{
+ struct libdw_memblock *result;
+ pthread_rwlock_rdlock (&dbg->mem_rwl);
+ result = dbg->mem_tails[thread_id];
+ pthread_rwlock_unlock (&dbg->mem_rwl);
+ return result;
+}
+
void *
__libdw_allocate (Dwarf *dbg, size_t minsize, size_t align)
{