Commit 18c742b5 by Tom de Vries Committed by Tom de Vries

[libbacktrace] Fix segfault upon allocation failure

If the allocation of abbrevs->abbrevs in read_abbrevs fails, then
abbrevs->num_abbrevs remains nonzero, and consequently free_abbrevs will
segfault when accessing abbrevs->abbrevs.

Fix this by setting abbrevs->num_abbrevs only after abbrevs->abbrevs
allocation has succeeded.

Bootstrapped and reg-tested on x86_64.

2018-11-28  Tom de Vries  <tdevries@suse.de>

	* dwarf.c (read_abbrevs): Fix handling of abbrevs->abbrevs allocation
	failure.

From-SVN: r266562
parent 2bf8ae1b
2018-11-28 Tom de Vries <tdevries@suse.de>
* dwarf.c (read_abbrevs): Fix handling of abbrevs->abbrevs allocation
failure.
2018-11-27 Tom de Vries <tdevries@suse.de> 2018-11-27 Tom de Vries <tdevries@suse.de>
* mmap.c (backtrace_vector_release): Same. * mmap.c (backtrace_vector_release): Same.
......
...@@ -1105,13 +1105,13 @@ read_abbrevs (struct backtrace_state *state, uint64_t abbrev_offset, ...@@ -1105,13 +1105,13 @@ read_abbrevs (struct backtrace_state *state, uint64_t abbrev_offset,
if (num_abbrevs == 0) if (num_abbrevs == 0)
return 1; return 1;
abbrevs->num_abbrevs = num_abbrevs;
abbrevs->abbrevs = ((struct abbrev *) abbrevs->abbrevs = ((struct abbrev *)
backtrace_alloc (state, backtrace_alloc (state,
num_abbrevs * sizeof (struct abbrev), num_abbrevs * sizeof (struct abbrev),
error_callback, data)); error_callback, data));
if (abbrevs->abbrevs == NULL) if (abbrevs->abbrevs == NULL)
return 0; return 0;
abbrevs->num_abbrevs = num_abbrevs;
memset (abbrevs->abbrevs, 0, num_abbrevs * sizeof (struct abbrev)); memset (abbrevs->abbrevs, 0, num_abbrevs * sizeof (struct abbrev));
num_abbrevs = 0; num_abbrevs = 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment