diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 1a6bc31cd1..e72be0b755 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,8 @@ +2005-05-24 H.J. Lu + + * readelf.c (process_section_groups): Report group section + index. Check if the section member index is valid. + 2005-05-23 Fred Fish * addr2line.c (unwind_inlines): New flag for 'i' option. diff --git a/binutils/readelf.c b/binutils/readelf.c index 5dafc510c9..ab0243edb1 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -4187,8 +4187,8 @@ process_section_groups (FILE *file) if (do_section_groups) { - printf ("\n%s group section `%s' [%s] contains %u sections:\n", - get_group_flags (entry), name, group_name, size); + printf ("\n%s group section [%5u] `%s' [%s] contains %u sections:\n", + get_group_flags (entry), i, name, group_name, size); printf (_(" [Index] Name\n")); } @@ -4202,13 +4202,26 @@ process_section_groups (FILE *file) entry = byte_get (indices, 4); indices += 4; + if (entry >= elf_header.e_shnum) + { + error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"), + entry, i, elf_header.e_shnum - 1); + continue; + } + else if (entry >= SHN_LORESERVE && entry <= SHN_HIRESERVE) + { + error (_("invalid section [%5u] in group section [%5u]\n"), + entry, i); + continue; + } + if (section_headers_groups [SECTION_HEADER_INDEX (entry)] != NULL) { if (entry) { - error (_("section [%5u] already in group section [%5u]\n"), - entry, + error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"), + entry, i, section_headers_groups [SECTION_HEADER_INDEX (entry)]->group_index); continue; }