diff options
| author | Anuj Mittal <anuj.mittal@intel.com> | 2019-07-10 10:37:22 +0800 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2019-07-11 09:32:50 +0100 |
| commit | 6beec1687f850b80cd3f1e8b0c498b0b2a435827 (patch) | |
| tree | 24219be6fc4588a0af29facbcdd68f6fe342f0bd /meta/recipes-devtools/binutils | |
| parent | 157dc99982a73e4245b29c1189f2b9d858dcd628 (diff) | |
| download | poky-6beec1687f850b80cd3f1e8b0c498b0b2a435827.tar.gz | |
binutils: fix CVE-2019-12972 CVE-2019-9071
(From OE-Core rev: 093f0914f261a27d58ecba9c1e9d3b78a35af012)
Signed-off-by: Anuj Mittal <anuj.mittal@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/recipes-devtools/binutils')
3 files changed, 217 insertions, 0 deletions
diff --git a/meta/recipes-devtools/binutils/binutils-2.32.inc b/meta/recipes-devtools/binutils/binutils-2.32.inc index 49e6827c1f..31c24a37f5 100644 --- a/meta/recipes-devtools/binutils/binutils-2.32.inc +++ b/meta/recipes-devtools/binutils/binutils-2.32.inc | |||
| @@ -48,6 +48,8 @@ SRC_URI = "\ | |||
| 48 | file://CVE-2019-9075.patch \ | 48 | file://CVE-2019-9075.patch \ |
| 49 | file://CVE-2019-9076.patch \ | 49 | file://CVE-2019-9076.patch \ |
| 50 | file://CVE-2019-9077.patch \ | 50 | file://CVE-2019-9077.patch \ |
| 51 | file://CVE-2019-9071.patch \ | ||
| 52 | file://CVE-2019-12972.patch \ | ||
| 51 | " | 53 | " |
| 52 | S = "${WORKDIR}/git" | 54 | S = "${WORKDIR}/git" |
| 53 | 55 | ||
diff --git a/meta/recipes-devtools/binutils/binutils/CVE-2019-12972.patch b/meta/recipes-devtools/binutils/binutils/CVE-2019-12972.patch new file mode 100644 index 0000000000..07d1d65467 --- /dev/null +++ b/meta/recipes-devtools/binutils/binutils/CVE-2019-12972.patch | |||
| @@ -0,0 +1,51 @@ | |||
| 1 | From 30bcc01478433a1cb05b36dc5c4beef7d2c89b5b Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Alan Modra <amodra@gmail.com> | ||
| 3 | Date: Fri, 21 Jun 2019 11:51:38 +0930 | ||
| 4 | Subject: [PATCH] PR24689, string table corruption | ||
| 5 | |||
| 6 | The testcase in the PR had a e_shstrndx section of type SHT_GROUP. | ||
| 7 | hdr->contents were initialized by setup_group rather than being read | ||
| 8 | from the file, thus last byte was not zero and string dereference ran | ||
| 9 | off the end of the buffer. | ||
| 10 | |||
| 11 | PR 24689 | ||
| 12 | * elfcode.h (elf_object_p): Check type of e_shstrndx section. | ||
| 13 | |||
| 14 | Upstream-Status: Backport | ||
| 15 | CVE: CVE-2019-12972 | ||
| 16 | Signed-off-by: Anuj Mittal <anuj.mittal@intel.com> | ||
| 17 | --- | ||
| 18 | bfd/ChangeLog | 5 +++++ | ||
| 19 | bfd/elfcode.h | 3 ++- | ||
| 20 | 2 files changed, 7 insertions(+), 1 deletion(-) | ||
| 21 | |||
| 22 | diff --git a/bfd/ChangeLog b/bfd/ChangeLog | ||
| 23 | index 91f09e6346..e66fb40a2c 100644 | ||
| 24 | --- a/bfd/ChangeLog | ||
| 25 | +++ b/bfd/ChangeLog | ||
| 26 | @@ -1,3 +1,8 @@ | ||
| 27 | +2019-06-21 Alan Modra <amodra@gmail.com> | ||
| 28 | + | ||
| 29 | + PR 24689 | ||
| 30 | + * elfcode.h (elf_object_p): Check type of e_shstrndx section. | ||
| 31 | + | ||
| 32 | 2019-02-20 Alan Modra <amodra@gmail.com> | ||
| 33 | |||
| 34 | PR 24236 | ||
| 35 | diff --git a/bfd/elfcode.h b/bfd/elfcode.h | ||
| 36 | index ec5ea766de..a35a629087 100644 | ||
| 37 | --- a/bfd/elfcode.h | ||
| 38 | +++ b/bfd/elfcode.h | ||
| 39 | @@ -755,7 +755,8 @@ elf_object_p (bfd *abfd) | ||
| 40 | /* A further sanity check. */ | ||
| 41 | if (i_ehdrp->e_shnum != 0) | ||
| 42 | { | ||
| 43 | - if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)) | ||
| 44 | + if (i_ehdrp->e_shstrndx >= elf_numsections (abfd) | ||
| 45 | + || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB) | ||
| 46 | { | ||
| 47 | /* PR 2257: | ||
| 48 | We used to just goto got_wrong_format_error here | ||
| 49 | -- | ||
| 50 | 2.20.1 | ||
| 51 | |||
diff --git a/meta/recipes-devtools/binutils/binutils/CVE-2019-9071.patch b/meta/recipes-devtools/binutils/binutils/CVE-2019-9071.patch new file mode 100644 index 0000000000..26f4809cf0 --- /dev/null +++ b/meta/recipes-devtools/binutils/binutils/CVE-2019-9071.patch | |||
| @@ -0,0 +1,164 @@ | |||
| 1 | From c1202057eb9161a86af27d867703235fee7b7555 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Nick Clifton <nickc@redhat.com> | ||
| 3 | Date: Wed, 10 Apr 2019 15:49:36 +0100 | ||
| 4 | Subject: [PATCH] Pull in patch for libiberty that fixes a stack exhaustion bug | ||
| 5 | when demangling a pathalogically constructed mangled name. | ||
| 6 | |||
| 7 | PR 89394 | ||
| 8 | * cp-demangle.c (cplus_demangle_fill_name): Reject negative | ||
| 9 | lengths. | ||
| 10 | (d_count_templates_scopes): Replace num_templates and num_scopes | ||
| 11 | parameters with a struct d_print_info pointer parameter. Adjust | ||
| 12 | body of the function accordingly. Add recursion counter and check | ||
| 13 | that the recursion limit is not reached. | ||
| 14 | (d_print_init): Pass dpi parameter to d_count_templates_scopes. | ||
| 15 | Reset recursion counter afterwards, unless the recursion limit was | ||
| 16 | reached. | ||
| 17 | |||
| 18 | CVE: CVE-2019-9071 | ||
| 19 | Upstream-Status: Backport | ||
| 20 | Signed-off-by: Anuj Mittal <anuj.mittal@intel.com> | ||
| 21 | --- | ||
| 22 | ChangeLog | 16 ++++++++++++++ | ||
| 23 | libiberty/cp-demangle.c | 48 ++++++++++++++++++++++------------------- | ||
| 24 | 2 files changed, 42 insertions(+), 22 deletions(-) | ||
| 25 | |||
| 26 | diff --git a/ChangeLog b/ChangeLog | ||
| 27 | index cd631a15b6..4df3aaa62c 100644 | ||
| 28 | --- a/ChangeLog | ||
| 29 | +++ b/ChangeLog | ||
| 30 | @@ -1,3 +1,19 @@ | ||
| 31 | +2019-04-10 Nick Clifton <nickc@redhat.com> | ||
| 32 | + | ||
| 33 | + * libiberty: Sync with gcc. Bring in: | ||
| 34 | + 2019-04-10 Nick Clifton <nickc@redhat.com> | ||
| 35 | + | ||
| 36 | + PR 89394 | ||
| 37 | + * cp-demangle.c (cplus_demangle_fill_name): Reject negative | ||
| 38 | + lengths. | ||
| 39 | + (d_count_templates_scopes): Replace num_templates and num_scopes | ||
| 40 | + parameters with a struct d_print_info pointer parameter. Adjust | ||
| 41 | + body of the function accordingly. Add recursion counter and check | ||
| 42 | + that the recursion limit is not reached. | ||
| 43 | + (d_print_init): Pass dpi parameter to d_count_templates_scopes. | ||
| 44 | + Reset recursion counter afterwards, unless the recursion limit was | ||
| 45 | + reached. | ||
| 46 | + | ||
| 47 | 2018-06-24 Nick Clifton <nickc@redhat.com> | ||
| 48 | |||
| 49 | 2.32 branch created. | ||
| 50 | diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c | ||
| 51 | index b34b485692..779b4e763a 100644 | ||
| 52 | --- a/libiberty/cp-demangle.c | ||
| 53 | +++ b/libiberty/cp-demangle.c | ||
| 54 | @@ -861,7 +861,7 @@ CP_STATIC_IF_GLIBCPP_V3 | ||
| 55 | int | ||
| 56 | cplus_demangle_fill_name (struct demangle_component *p, const char *s, int len) | ||
| 57 | { | ||
| 58 | - if (p == NULL || s == NULL || len == 0) | ||
| 59 | + if (p == NULL || s == NULL || len <= 0) | ||
| 60 | return 0; | ||
| 61 | p->d_printing = 0; | ||
| 62 | p->type = DEMANGLE_COMPONENT_NAME; | ||
| 63 | @@ -4061,7 +4061,7 @@ d_growable_string_callback_adapter (const char *s, size_t l, void *opaque) | ||
| 64 | are larger than the actual numbers encountered. */ | ||
| 65 | |||
| 66 | static void | ||
| 67 | -d_count_templates_scopes (int *num_templates, int *num_scopes, | ||
| 68 | +d_count_templates_scopes (struct d_print_info *dpi, | ||
| 69 | const struct demangle_component *dc) | ||
| 70 | { | ||
| 71 | if (dc == NULL) | ||
| 72 | @@ -4081,13 +4081,13 @@ d_count_templates_scopes (int *num_templates, int *num_scopes, | ||
| 73 | break; | ||
| 74 | |||
| 75 | case DEMANGLE_COMPONENT_TEMPLATE: | ||
| 76 | - (*num_templates)++; | ||
| 77 | + dpi->num_copy_templates++; | ||
| 78 | goto recurse_left_right; | ||
| 79 | |||
| 80 | case DEMANGLE_COMPONENT_REFERENCE: | ||
| 81 | case DEMANGLE_COMPONENT_RVALUE_REFERENCE: | ||
| 82 | if (d_left (dc)->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM) | ||
| 83 | - (*num_scopes)++; | ||
| 84 | + dpi->num_saved_scopes++; | ||
| 85 | goto recurse_left_right; | ||
| 86 | |||
| 87 | case DEMANGLE_COMPONENT_QUAL_NAME: | ||
| 88 | @@ -4152,42 +4152,42 @@ d_count_templates_scopes (int *num_templates, int *num_scopes, | ||
| 89 | case DEMANGLE_COMPONENT_TAGGED_NAME: | ||
| 90 | case DEMANGLE_COMPONENT_CLONE: | ||
| 91 | recurse_left_right: | ||
| 92 | - d_count_templates_scopes (num_templates, num_scopes, | ||
| 93 | - d_left (dc)); | ||
| 94 | - d_count_templates_scopes (num_templates, num_scopes, | ||
| 95 | - d_right (dc)); | ||
| 96 | + /* PR 89394 - Check for too much recursion. */ | ||
| 97 | + if (dpi->recursion > DEMANGLE_RECURSION_LIMIT) | ||
| 98 | + /* FIXME: There ought to be a way to report to the | ||
| 99 | + user that the recursion limit has been reached. */ | ||
| 100 | + return; | ||
| 101 | + | ||
| 102 | + ++ dpi->recursion; | ||
| 103 | + d_count_templates_scopes (dpi, d_left (dc)); | ||
| 104 | + d_count_templates_scopes (dpi, d_right (dc)); | ||
| 105 | + -- dpi->recursion; | ||
| 106 | break; | ||
| 107 | |||
| 108 | case DEMANGLE_COMPONENT_CTOR: | ||
| 109 | - d_count_templates_scopes (num_templates, num_scopes, | ||
| 110 | - dc->u.s_ctor.name); | ||
| 111 | + d_count_templates_scopes (dpi, dc->u.s_ctor.name); | ||
| 112 | break; | ||
| 113 | |||
| 114 | case DEMANGLE_COMPONENT_DTOR: | ||
| 115 | - d_count_templates_scopes (num_templates, num_scopes, | ||
| 116 | - dc->u.s_dtor.name); | ||
| 117 | + d_count_templates_scopes (dpi, dc->u.s_dtor.name); | ||
| 118 | break; | ||
| 119 | |||
| 120 | case DEMANGLE_COMPONENT_EXTENDED_OPERATOR: | ||
| 121 | - d_count_templates_scopes (num_templates, num_scopes, | ||
| 122 | - dc->u.s_extended_operator.name); | ||
| 123 | + d_count_templates_scopes (dpi, dc->u.s_extended_operator.name); | ||
| 124 | break; | ||
| 125 | |||
| 126 | case DEMANGLE_COMPONENT_FIXED_TYPE: | ||
| 127 | - d_count_templates_scopes (num_templates, num_scopes, | ||
| 128 | - dc->u.s_fixed.length); | ||
| 129 | + d_count_templates_scopes (dpi, dc->u.s_fixed.length); | ||
| 130 | break; | ||
| 131 | |||
| 132 | case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS: | ||
| 133 | case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS: | ||
| 134 | - d_count_templates_scopes (num_templates, num_scopes, | ||
| 135 | - d_left (dc)); | ||
| 136 | + d_count_templates_scopes (dpi, d_left (dc)); | ||
| 137 | break; | ||
| 138 | |||
| 139 | case DEMANGLE_COMPONENT_LAMBDA: | ||
| 140 | case DEMANGLE_COMPONENT_DEFAULT_ARG: | ||
| 141 | - d_count_templates_scopes (num_templates, num_scopes, | ||
| 142 | - dc->u.s_unary_num.sub); | ||
| 143 | + d_count_templates_scopes (dpi, dc->u.s_unary_num.sub); | ||
| 144 | break; | ||
| 145 | } | ||
| 146 | } | ||
| 147 | @@ -4222,8 +4222,12 @@ d_print_init (struct d_print_info *dpi, demangle_callbackref callback, | ||
| 148 | dpi->next_copy_template = 0; | ||
| 149 | dpi->num_copy_templates = 0; | ||
| 150 | |||
| 151 | - d_count_templates_scopes (&dpi->num_copy_templates, | ||
| 152 | - &dpi->num_saved_scopes, dc); | ||
| 153 | + d_count_templates_scopes (dpi, dc); | ||
| 154 | + /* If we did not reach the recursion limit, then reset the | ||
| 155 | + current recursion value back to 0, so that we can print | ||
| 156 | + the templates. */ | ||
| 157 | + if (dpi->recursion < DEMANGLE_RECURSION_LIMIT) | ||
| 158 | + dpi->recursion = 0; | ||
| 159 | dpi->num_copy_templates *= dpi->num_saved_scopes; | ||
| 160 | |||
| 161 | dpi->current_template = NULL; | ||
| 162 | -- | ||
| 163 | 2.20.1 | ||
| 164 | |||
