summaryrefslogtreecommitdiffstats
path: root/libelf/elf_end.c
diff options
context:
space:
mode:
authorMark Wielaard <[email protected]>2016-08-07 22:13:46 +0200
committerMark Wielaard <[email protected]>2016-08-15 09:58:12 +0200
commite93f2d801fccbe5a4ffd71f07baed66453b8a56c (patch)
treefaf2178368ee667d7d94846f0ad58a5ffd8749f6 /libelf/elf_end.c
parent6ff6c215bfa4153874751cdc0bae26acfbba4a81 (diff)
libelf: Fix memory leak in elf_compress for mmapped ELF files.
The testcase added to run-strip-reloc.sh for strip-compressed.o showed a memory leak when ran under valgrind (configure --enable-valgrind). For a mmapped ELF file when existing section data was compressed elf_end would fail to release the new compressed data buffer assigned to rawdata_base. For non-mapped files rawdata_base is always freed. For decompressed data rawdata_base is released together with zdata_base. Use the Elf_Scn flag ELF_T_MALLOCED to track whether rawdata_base points to malloced memory and free it in elf_end even for mmapped ELF files. Signed-off-by: Mark Wielaard <[email protected]>
Diffstat (limited to 'libelf/elf_end.c')
-rw-r--r--libelf/elf_end.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/libelf/elf_end.c b/libelf/elf_end.c
index fde17b50..160f0b88 100644
--- a/libelf/elf_end.c
+++ b/libelf/elf_end.c
@@ -1,5 +1,5 @@
/* Free resources associated with Elf descriptor.
- Copyright (C) 1998,1999,2000,2001,2002,2004,2005,2007,2015 Red Hat, Inc.
+ Copyright (C) 1998,1999,2000,2001,2002,2004,2005,2007,2015,2016 Red Hat, Inc.
This file is part of elfutils.
Written by Ulrich Drepper <[email protected]>, 1998.
@@ -166,7 +166,8 @@ elf_end (Elf *elf)
/* The section data is allocated if we couldn't mmap
the file. Or if we had to decompress. */
if (elf->map_address == NULL
- || scn->rawdata_base == scn->zdata_base)
+ || scn->rawdata_base == scn->zdata_base
+ || (scn->flags & ELF_F_MALLOCED) != 0)
free (scn->rawdata_base);
/* Free the list of data buffers for the section.