aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2016-12-06 15:58:15 +0000
committerNick Clifton <nickc@redhat.com>2016-12-06 15:58:15 +0000
commit92744f058094edd0b29bf9762f4ac26e4c6743c2 (patch)
tree5a417e97e0029612e1a6e760bf312d69dc9abde0
parent5eecd8621b955fb99860fc1b0d87074071f42f72 (diff)
downloadgdb-92744f058094edd0b29bf9762f4ac26e4c6743c2.zip
gdb-92744f058094edd0b29bf9762f4ac26e4c6743c2.tar.gz
gdb-92744f058094edd0b29bf9762f4ac26e4c6743c2.tar.bz2
Fix seg-fault running strip on a corrupt binary.
PR binutils/20929 * aoutx.h (squirt_out_relocs): Check for relocs without an associated symbol.
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/aoutx.h17
2 files changed, 17 insertions, 6 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 351721b..fb3f3f4 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2016-12-06 Nick Clifton <nickc@redhat.com>
+
+ PR binutils/20929
+ * aoutx.h (squirt_out_relocs): Check for relocs without an
+ associated symbol.
+
2016-12-06 Alan Modra <amodra@gmail.com>
* elf64-ppc.c (ok_lo_toc_insn): Add r_type param. Recognize
diff --git a/bfd/aoutx.h b/bfd/aoutx.h
index 43e5f8d..c64f288 100644
--- a/bfd/aoutx.h
+++ b/bfd/aoutx.h
@@ -2395,10 +2395,15 @@ NAME (aout, squirt_out_relocs) (bfd *abfd, asection *section)
count != 0;
--count, natptr += each_size, ++generic)
{
- if ((*generic)->howto == NULL)
+ /* PR 20921: If the howto field has not been initialised then skip
+ this reloc.
+ PR 20929: Similarly for the symbol field. */
+ if ((*generic)->howto == NULL
+ || (*generic)->sym_ptr_ptr == NULL)
{
bfd_set_error (bfd_error_invalid_operation);
- _bfd_error_handler (_("%B: attempt to write out unknown reloc type"), abfd);
+ _bfd_error_handler (_("\
+%B: attempt to write out unknown reloc type"), abfd);
return FALSE;
}
MY_swap_ext_reloc_out (abfd, *generic,
@@ -2411,12 +2416,12 @@ NAME (aout, squirt_out_relocs) (bfd *abfd, asection *section)
count != 0;
--count, natptr += each_size, ++generic)
{
- /* PR 20921: If the howto field has not been initialised then skip
- this reloc. */
- if ((*generic)->howto == NULL)
+ if ((*generic)->howto == NULL
+ || (*generic)->sym_ptr_ptr == NULL)
{
bfd_set_error (bfd_error_invalid_operation);
- _bfd_error_handler (_("%B: attempt to write out unknown reloc type"), abfd);
+ _bfd_error_handler (_("\
+%B: attempt to write out unknown reloc type"), abfd);
return FALSE;
}
MY_swap_std_reloc_out (abfd, *generic,