From cb06d03ad92ffcfaa09c3f065837cb39e9e1486d Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Wed, 21 Jun 2017 11:13:49 +0100 Subject: [PATCH] Fix address violation parsing a corrupt IEEE Alpha binary. PR binutils/21637 * vms-alpha.c (_bfd_vms_slurp_egsd): Check for an empty section list. (image_set_ptr): Likewise. (alpha_vms_fix_sec_rel): Likewise. (alpha_vms_slurp_relocs): Likewise. --- bfd/ChangeLog | 9 +++++++++ bfd/vms-alpha.c | 27 +++++++++++++++++++++++---- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 9e1cb05272e..8edcbc2e412 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2017-06-21 Nick Clifton + + PR binutils/21637 + * vms-alpha.c (_bfd_vms_slurp_egsd): Check for an empty section + list. + (image_set_ptr): Likewise. + (alpha_vms_fix_sec_rel): Likewise. + (alpha_vms_slurp_relocs): Likewise. + 2017-06-21 Nick Clifton PR binutils/21633 diff --git a/bfd/vms-alpha.c b/bfd/vms-alpha.c index 8569868576e..aa38de9db59 100644 --- a/bfd/vms-alpha.c +++ b/bfd/vms-alpha.c @@ -1282,6 +1282,8 @@ _bfd_vms_slurp_egsd (bfd *abfd) struct vms_esdf *esdf = (struct vms_esdf *)vms_rec; entry->value = bfd_getl64 (esdf->value); + if (PRIV (sections) == NULL) + return FALSE; entry->section = PRIV (sections)[bfd_getl32 (esdf->psindx)]; if (old_flags & EGSY__V_NORM) @@ -1316,7 +1318,11 @@ _bfd_vms_slurp_egsd (bfd *abfd) entry->symbol_vector = bfd_getl32 (egst->value); if (old_flags & EGSY__V_REL) - entry->section = PRIV (sections)[bfd_getl32 (egst->psindx)]; + { + if (PRIV (sections) == NULL) + return FALSE; + entry->section = PRIV (sections)[bfd_getl32 (egst->psindx)]; + } else entry->section = bfd_abs_section_ptr; @@ -1404,6 +1410,8 @@ image_set_ptr (bfd *abfd, bfd_vma vma, int sect, struct bfd_link_info *info) vms_debug2 ((4, "image_set_ptr (0x%08x, sect=%d)\n", (unsigned)vma, sect)); + if (PRIV (sections) == NULL) + return; sec = PRIV (sections)[sect]; if (info) @@ -1726,7 +1734,12 @@ static bfd_vma alpha_vms_fix_sec_rel (bfd *abfd, struct bfd_link_info *info, unsigned int rel, bfd_vma vma) { - asection *sec = PRIV (sections)[rel & RELC_MASK]; + asection *sec; + + if (PRIV (sections) == NULL) + return 0; + + sec = PRIV (sections)[rel & RELC_MASK]; if (info) { @@ -5061,6 +5074,8 @@ alpha_vms_slurp_relocs (bfd *abfd) return FALSE; } + if (PRIV (sections) == NULL) + return FALSE; sec = PRIV (sections)[cur_psect]; if (sec == bfd_abs_section_ptr) { @@ -5119,8 +5134,12 @@ alpha_vms_slurp_relocs (bfd *abfd) reloc->sym_ptr_ptr = sym; } else if (cur_psidx >= 0) - reloc->sym_ptr_ptr = - PRIV (sections)[cur_psidx]->symbol_ptr_ptr; + { + if (PRIV (sections) == NULL) + return FALSE; + reloc->sym_ptr_ptr = + PRIV (sections)[cur_psidx]->symbol_ptr_ptr; + } else reloc->sym_ptr_ptr = NULL; -- 2.30.2