From: Nick Clifton Date: Tue, 16 Jan 2001 23:22:44 +0000 (+0000) Subject: Prevent seg fault with corrupt section name indicies X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d40ac9bde2952e0a206cbbca58be7294a0cd3b87;p=binutils-gdb.git Prevent seg fault with corrupt section name indicies --- diff --git a/binutils/readelf.c b/binutils/readelf.c index f42f393e718..66f48fb2b45 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -1,5 +1,5 @@ /* readelf.c -- display contents of an ELF format file - Copyright (C) 1998, 99, 2000 Free Software Foundation, Inc. + Copyright (C) 1998, 99, 2000, 2001 Free Software Foundation, Inc. Originally developed by Eric Youngdale Modifications by Nick Clifton @@ -85,6 +85,7 @@ unsigned int rela_addr; unsigned int rela_size; char * dynamic_strings; char * string_table; +unsigned long string_table_length; unsigned long num_dynamic_syms; Elf_Internal_Sym * dynamic_symbols; Elf_Internal_Syminfo * dynamic_syminfo; @@ -232,7 +233,9 @@ typedef int Elf32_Word; #endif #define UNKNOWN -1 -#define SECTION_NAME(X) (string_table + (X)->sh_name) +#define SECTION_NAME(X) ((X) == NULL ? "" : \ + ((X)->sh_name >= string_table_length \ + ? "" : string_table + (X)->sh_name)) #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */ @@ -2712,12 +2715,10 @@ process_section_headers (file) if (section->sh_size != 0) { - unsigned long string_table_offset; - - string_table_offset = section->sh_offset; - GET_DATA_ALLOC (section->sh_offset, section->sh_size, string_table, char *, "string table"); + + string_table_length = section->sh_size; } /* Scan the sections for the dynamic symbol table @@ -7445,7 +7446,7 @@ process_mips_specific (file) } printf (_("\nSection '%s' contains %d entries:\n"), - string_table + sect->sh_name, cnt); + SECTION_NAME (sect), cnt); option = iopt; @@ -8004,6 +8005,7 @@ process_file (file_name) { free (string_table); string_table = NULL; + string_table_length = 0; } if (dynamic_strings)