From 09e40e44ad05822ed72f6ad720b5e75ea2a8fc67 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Thu, 29 Apr 2021 17:55:43 +0100 Subject: [PATCH] Fix an access through a null pointer when parsing a corrupt SOM format fle. PR 27793 * som.c (som_slurp_symbol_table): Assign symbols without any scope to the undefined section. (som_decode_symclass): Check for a missing symbol section. * syms.c (bfd_decode_symclass): Likewise. --- bfd/ChangeLog | 8 ++++++++ bfd/som.c | 11 ++++++++++- bfd/syms.c | 4 ++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 3144a72d21d..4bdee1cb123 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2021-04-29 Nick Clifton + + PR 27793 + * som.c (som_slurp_symbol_table): Assign symbols without any scope + to the undefined section. + (som_decode_symclass): Check for a missing symbol section. + * syms.c (bfd_decode_symclass): Likewise. + 2021-04-29 Nick Clifton PR 27792 diff --git a/bfd/som.c b/bfd/som.c index 656ded96b69..42ecc765945 100644 --- a/bfd/som.c +++ b/bfd/som.c @@ -4740,7 +4740,7 @@ som_slurp_symbol_table (bfd *abfd) goto error_return; } sym->symbol.value = bfd_getb32 (bufp->symbol_value); - sym->symbol.section = 0; + sym->symbol.section = NULL; sym->symbol.flags = 0; switch (symbol_type) @@ -4800,6 +4800,10 @@ som_slurp_symbol_table (bfd *abfd) sym->symbol.section = bfd_section_from_som_symbol (abfd, bufp); sym->symbol.value -= sym->symbol.section->vma; break; + + default: + sym->symbol.section = bfd_und_section_ptr; + break; } /* Check for a weak symbol. */ @@ -5848,6 +5852,11 @@ som_decode_symclass (asymbol *symbol) { char c; + /* If the symbol did not have a scope specified, + then it will not have associated section. */ + if (symbol == NULL || symbol->section == NULL) + return '?'; + if (bfd_is_com_section (symbol->section)) return 'C'; if (bfd_is_und_section (symbol->section)) diff --git a/bfd/syms.c b/bfd/syms.c index e0ab16795d6..7daf741b7b6 100644 --- a/bfd/syms.c +++ b/bfd/syms.c @@ -654,6 +654,10 @@ bfd_decode_symclass (asymbol *symbol) { char c; + /* Paranoia... */ + if (symbol == NULL || symbol->section == NULL) + return '?'; + if (symbol->section && bfd_is_com_section (symbol->section)) { if (symbol->section->flags & SEC_SMALL_DATA) -- 2.30.2