aboutsummaryrefslogtreecommitdiff
path: root/libbacktrace
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2018-11-28 14:06:23 +0000
committerTom de Vries <tdevries@suse.de>2018-11-28 14:06:23 +0000
commitcdfeb968e2ee8a7f01b92993a322c71804f0fc78 (patch)
treea0960c8ba093ba354d05ece895d0c38da1f36e6f /libbacktrace
parentb4b74818ddaa99175dae8bc238b1c1b257c18456 (diff)
[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. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@266562 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libbacktrace')
-rw-r--r--libbacktrace/ChangeLog5
-rw-r--r--libbacktrace/dwarf.c2
2 files changed, 6 insertions, 1 deletions
diff --git a/libbacktrace/ChangeLog b/libbacktrace/ChangeLog
index e7fdfd8e940..8894446a75b 100644
--- a/libbacktrace/ChangeLog
+++ b/libbacktrace/ChangeLog
@@ -1,3 +1,8 @@
+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>
* mmap.c (backtrace_vector_release): Same.
diff --git a/libbacktrace/dwarf.c b/libbacktrace/dwarf.c
index 4e93f120820..34543747c8f 100644
--- a/libbacktrace/dwarf.c
+++ b/libbacktrace/dwarf.c
@@ -1105,13 +1105,13 @@ read_abbrevs (struct backtrace_state *state, uint64_t abbrev_offset,
if (num_abbrevs == 0)
return 1;
- abbrevs->num_abbrevs = num_abbrevs;
abbrevs->abbrevs = ((struct abbrev *)
backtrace_alloc (state,
num_abbrevs * sizeof (struct abbrev),
error_callback, data));
if (abbrevs->abbrevs == NULL)
return 0;
+ abbrevs->num_abbrevs = num_abbrevs;
memset (abbrevs->abbrevs, 0, num_abbrevs * sizeof (struct abbrev));
num_abbrevs = 0;