summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMark Wielaard <mark@klomp.org>2019-08-29 17:46:52 +0200
committerMark Wielaard <mark@klomp.org>2019-08-29 17:46:52 +0200
commitdf33285b60290fadefd140ee2fe616f750105d2f (patch)
tree43ce2d68e113f7a1398f0031fad8533f5e5903ff /src
parentbb106065dc6962fabf1c163f18c932650dac6580 (diff)
nm: Fix latent memory leak in show_symbols.
If there are just a handful of symbols then memory for them is allocated on the stack, otherwise the memory is malloced. So before freeing the memory we need to check the number of entries to know if the memory was heap allocated or not. But since not all entries might be used we might have decreased the number of entries to the number we will actually show. Remember the original symbol entries to not have a memory leak. Signed-off-by: Mark Wielaard <mark@klomp.org>
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog5
-rw-r--r--src/nm.c3
2 files changed, 7 insertions, 1 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index aeb62328..cb64f7d9 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,8 @@
+2019-08-26 Mark Wielaard <mark@klomp.org>
+
+ * nm.c (show_symbols): Remember nentries_orig and check before
+ freeing sym_mem.
+
2019-07-05 Omar Sandoval <osandov@fb.com>
* Makefile.am: Remove -ldl.
diff --git a/src/nm.c b/src/nm.c
index da1350b4..7f6cf2a2 100644
--- a/src/nm.c
+++ b/src/nm.c
@@ -1438,6 +1438,7 @@ show_symbols (int fd, Ebl *ebl, GElf_Ehdr *ehdr,
free (demangle_buffer);
#endif
/* Now we know the exact number. */
+ size_t nentries_orig = nentries;
nentries = nentries_used;
/* Sort the entries according to the users wishes. */
@@ -1472,7 +1473,7 @@ show_symbols (int fd, Ebl *ebl, GElf_Ehdr *ehdr,
}
/* Free all memory. */
- if (nentries * sizeof (sym_mem[0]) >= MAX_STACK_ALLOC)
+ if (nentries_orig * sizeof (sym_mem[0]) >= MAX_STACK_ALLOC)
free (sym_mem);
obstack_free (&whereob, NULL);