diff options
| author | Mark Wielaard <[email protected]> | 2016-08-07 22:13:46 +0200 |
|---|---|---|
| committer | Mark Wielaard <[email protected]> | 2016-08-15 09:58:12 +0200 |
| commit | e93f2d801fccbe5a4ffd71f07baed66453b8a56c (patch) | |
| tree | faf2178368ee667d7d94846f0ad58a5ffd8749f6 /libelf/elf_end.c | |
| parent | 6ff6c215bfa4153874751cdc0bae26acfbba4a81 (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.c | 5 |
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. |
