summaryrefslogtreecommitdiff
path: root/system/binutils/CVE-2019-17450.patch
diff options
context:
space:
mode:
authorMax Rees <maxcrees@me.com>2019-10-16 16:29:42 -0500
committerMax Rees <maxcrees@me.com>2019-10-16 16:30:19 -0500
commit8c4d830f564c6c9a7448556d157d54247618292c (patch)
treef99983f7e5d74f2707afb30c87a95f0305ae1aa3 /system/binutils/CVE-2019-17450.patch
parent2c0bf1b6c7c02036484a225cb2c4ea0d85205ad5 (diff)
downloadpackages-8c4d830f564c6c9a7448556d157d54247618292c.tar.gz
packages-8c4d830f564c6c9a7448556d157d54247618292c.tar.bz2
packages-8c4d830f564c6c9a7448556d157d54247618292c.tar.xz
packages-8c4d830f564c6c9a7448556d157d54247618292c.zip
system/binutils: patch CVE-2019-17450 and CVE-2019-17451 (#212)
Diffstat (limited to 'system/binutils/CVE-2019-17450.patch')
-rw-r--r--system/binutils/CVE-2019-17450.patch87
1 files changed, 87 insertions, 0 deletions
diff --git a/system/binutils/CVE-2019-17450.patch b/system/binutils/CVE-2019-17450.patch
new file mode 100644
index 000000000..edc0e94df
--- /dev/null
+++ b/system/binutils/CVE-2019-17450.patch
@@ -0,0 +1,87 @@
+From 063c511bd79281f33fd33f0964541a73511b9e2b Mon Sep 17 00:00:00 2001
+From: Alan Modra <amodra@gmail.com>
+Date: Wed, 9 Oct 2019 00:07:29 +1030
+Subject: [PATCH] PR25078, stack overflow in function find_abstract_instance
+
+ PR 25078
+ * dwarf2.c (find_abstract_instance): Delete orig_info_ptr, add
+ recur_count. Error on recur_count reaching 100 rather than
+ info_ptr matching orig_info_ptr. Adjust calls.
+
+diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c
+index 575b082..d39f4fd 100644
+--- a/bfd/dwarf2.c
++++ b/bfd/dwarf2.c
+@@ -2812,13 +2812,13 @@ static bfd_boolean comp_unit_maybe_decode_line_info (struct comp_unit *,
+ struct dwarf2_debug *);
+
+ static bfd_boolean
+-find_abstract_instance (struct comp_unit * unit,
+- bfd_byte * orig_info_ptr,
+- struct attribute * attr_ptr,
+- const char ** pname,
+- bfd_boolean * is_linkage,
+- char ** filename_ptr,
+- int * linenumber_ptr)
++find_abstract_instance (struct comp_unit *unit,
++ struct attribute *attr_ptr,
++ unsigned int recur_count,
++ const char **pname,
++ bfd_boolean *is_linkage,
++ char **filename_ptr,
++ int *linenumber_ptr)
+ {
+ bfd *abfd = unit->abfd;
+ bfd_byte *info_ptr;
+@@ -2829,6 +2829,14 @@ find_abstract_instance (struct comp_unit * unit,
+ struct attribute attr;
+ const char *name = NULL;
+
++ if (recur_count == 100)
++ {
++ _bfd_error_handler
++ (_("DWARF error: abstract instance recursion detected"));
++ bfd_set_error (bfd_error_bad_value);
++ return FALSE;
++ }
++
+ /* DW_FORM_ref_addr can reference an entry in a different CU. It
+ is an offset from the .debug_info section, not the current CU. */
+ if (attr_ptr->form == DW_FORM_ref_addr)
+@@ -2962,15 +2970,6 @@ find_abstract_instance (struct comp_unit * unit,
+ info_ptr, info_ptr_end);
+ if (info_ptr == NULL)
+ break;
+- /* It doesn't ever make sense for DW_AT_specification to
+- refer to the same DIE. Stop simple recursion. */
+- if (info_ptr == orig_info_ptr)
+- {
+- _bfd_error_handler
+- (_("DWARF error: abstract instance recursion detected"));
+- bfd_set_error (bfd_error_bad_value);
+- return FALSE;
+- }
+ switch (attr.name)
+ {
+ case DW_AT_name:
+@@ -2984,7 +2983,7 @@ find_abstract_instance (struct comp_unit * unit,
+ }
+ break;
+ case DW_AT_specification:
+- if (!find_abstract_instance (unit, info_ptr, &attr,
++ if (!find_abstract_instance (unit, &attr, recur_count + 1,
+ &name, is_linkage,
+ filename_ptr, linenumber_ptr))
+ return FALSE;
+@@ -3200,7 +3199,7 @@ scan_unit_for_symbols (struct comp_unit *unit)
+
+ case DW_AT_abstract_origin:
+ case DW_AT_specification:
+- if (!find_abstract_instance (unit, info_ptr, &attr,
++ if (!find_abstract_instance (unit, &attr, 0,
+ &func->name,
+ &func->is_linkage,
+ &func->file,
+--
+2.9.3
+