diff options
author | Mark Wielaard <mark@klomp.org> | 2019-11-11 00:15:55 +0100 |
---|---|---|
committer | Mark Wielaard <mark@klomp.org> | 2019-11-12 22:33:56 +0100 |
commit | 287e502815bf133f64afbf47211b11364a0a322f (patch) | |
tree | 37b5cc5d828ac08ff0e90a8db2078a708573f005 /libdw/libdw_alloc.c | |
parent | 32cd9c4ad5b888da9c4f94a702a02d380b2a745b (diff) | |
download | elfutils-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.c | 12 |
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) { |