diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2019-11-17 13:34:36 +0300 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2019-11-17 13:34:36 +0300 |
commit | 6cf4e270d951dccb5cabe70d865415d2628c7a4e (patch) | |
tree | 119cbca714d74244d1aa4e2241e59fbf8450d30d /debian/patches/pr21137.diff | |
parent | f0ef3d0a5cb2410eab2b1b412e7ec7ef94fa0dc6 (diff) | |
download | binutils-6cf4e270d951dccb5cabe70d865415d2628c7a4e.tar.gz |
Import 2.33.1-2debian/2.33.1-2debian
Diffstat (limited to 'debian/patches/pr21137.diff')
-rw-r--r-- | debian/patches/pr21137.diff | 112 |
1 files changed, 0 insertions, 112 deletions
diff --git a/debian/patches/pr21137.diff b/debian/patches/pr21137.diff deleted file mode 100644 index b60ffb3..0000000 --- a/debian/patches/pr21137.diff +++ /dev/null @@ -1,112 +0,0 @@ -# DP: Fix PR binutils/21137, readelf writing to illegal addresses. - -From 03f7786e2f440b9892b1c34a58fb26222ce1b493 Mon Sep 17 00:00:00 2001 -From: Nick Clifton <nickc@redhat.com> -Date: Mon, 13 Feb 2017 13:08:32 +0000 -Subject: [PATCH] Fix readelf writing to illegal addresses whilst processing - corrupt input files containing symbol-difference relocations. - - PR binutils/21137 - * readelf.c (target_specific_reloc_handling): Add end parameter. - Check for buffer overflow before writing relocated values. - (apply_relocations): Pass end to target_specific_reloc_handling. ---- - binutils/ChangeLog | 7 +++++++ - binutils/readelf.c | 30 +++++++++++++++++++++++++----- - 2 files changed, 32 insertions(+), 5 deletions(-) - -2017-02-13 Nick Clifton <nickc@redhat.com> - - PR binutils/21137 - * readelf.c (target_specific_reloc_handling): Add end parameter. - Check for buffer overflow before writing relocated values. - (apply_relocations): Pass end to target_specific_reloc_handling. - -diff --git a/binutils/readelf.c b/binutils/readelf.c -index b488714..e474f27 100644 ---- a/binutils/readelf.c -+++ b/binutils/readelf.c -@@ -11591,6 +11591,7 @@ process_syminfo (FILE * file ATTRIBUTE_UNUSED) - static bfd_boolean - target_specific_reloc_handling (Elf_Internal_Rela * reloc, - unsigned char * start, -+ unsigned char * end, - Elf_Internal_Sym * symtab) - { - unsigned int reloc_type = get_reloc_type (reloc->r_info); -@@ -11631,13 +11632,19 @@ target_specific_reloc_handling (Elf_Internal_Rela * reloc, - handle_sym_diff: - if (saved_sym != NULL) - { -+ int reloc_size = reloc_type == 1 ? 4 : 2; - bfd_vma value; - - value = reloc->r_addend - + (symtab[get_reloc_symindex (reloc->r_info)].st_value - - saved_sym->st_value); - -- byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2); -+ if (start + reloc->r_offset + reloc_size >= end) -+ /* PR 21137 */ -+ error (_("MSP430 sym diff reloc writes past end of section (%p vs %p)\n"), -+ start + reloc->r_offset + reloc_size, end); -+ else -+ byte_put (start + reloc->r_offset, value, reloc_size); - - saved_sym = NULL; - return TRUE; -@@ -11668,13 +11675,18 @@ target_specific_reloc_handling (Elf_Internal_Rela * reloc, - case 2: /* R_MN10300_16 */ - if (saved_sym != NULL) - { -+ int reloc_size = reloc_type == 1 ? 4 : 2; - bfd_vma value; - - value = reloc->r_addend - + (symtab[get_reloc_symindex (reloc->r_info)].st_value - - saved_sym->st_value); - -- byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2); -+ if (start + reloc->r_offset + reloc_size >= end) -+ error (_("MN10300 sym diff reloc writes past end of section (%p vs %p)\n"), -+ start + reloc->r_offset + reloc_size, end); -+ else -+ byte_put (start + reloc->r_offset, value, reloc_size); - - saved_sym = NULL; - return TRUE; -@@ -11709,12 +11721,20 @@ target_specific_reloc_handling (Elf_Internal_Rela * reloc, - break; - - case 0x41: /* R_RL78_ABS32. */ -- byte_put (start + reloc->r_offset, value, 4); -+ if (start + reloc->r_offset + 4 >= end) -+ error (_("RL78 sym diff reloc writes past end of section (%p vs %p)\n"), -+ start + reloc->r_offset + 2, end); -+ else -+ byte_put (start + reloc->r_offset, value, 4); - value = 0; - return TRUE; - - case 0x43: /* R_RL78_ABS16. */ -- byte_put (start + reloc->r_offset, value, 2); -+ if (start + reloc->r_offset + 2 >= end) -+ error (_("RL78 sym diff reloc writes past end of section (%p vs %p)\n"), -+ start + reloc->r_offset + 2, end); -+ else -+ byte_put (start + reloc->r_offset, value, 2); - value = 0; - return TRUE; - -@@ -12340,7 +12360,7 @@ apply_relocations (void * file, - - reloc_type = get_reloc_type (rp->r_info); - -- if (target_specific_reloc_handling (rp, start, symtab)) -+ if (target_specific_reloc_handling (rp, start, end, symtab)) - continue; - else if (is_none_reloc (reloc_type)) - continue; --- -2.9.3 - |