+2017-04-26 Nick Clifton <nickc@redhat.com>
+
+ * readelf.c (process_section_headers): Warn about overlarge
+ sections.
+ (print_gnu_build_attribute_name): Print the number of unrecognised
+ note types. Fix formatting in the presence of errors.
+ (testsuite/binutils-all/note-2-32.s): Fix encoding of numeric notes.
+ (testsuite/binutils-all/note-2-64.s): Likewise.
+
2017-04-26 Maciej W. Rozycki <macro@imgtec.com>
* readelf.c (process_mips_specific): Add static GOT support.
break;
}
+ /* Check the sh_size field. */
+ if (section->sh_size > current_file_size
+ && section->sh_type != SHT_NOBITS
+ && section->sh_type != SHT_NULL
+ && section->sh_type < SHT_LOOS)
+ warn (_("Size of section %u is larger than the entire file!\n"), i);
+
printf (" [%2u] ", i);
if (do_section_details)
printf ("%s\n ", printable_section_name (section));
expected_types = bool_expected;
++ name;
break;
-
default:
if (ISPRINT (* name))
{
}
else
{
- error (_("unexpected character in name field\n"));
- print_symbol (- left, _("<unknown attribute>"));
- return 0;
+ static char tmpbuf [128];
+ error (_("unrecognised byte in name field: %d\n"), * name);
+ sprintf (tmpbuf, _("<unknown:_%d>"), * name);
+ text = tmpbuf;
+ name ++;
}
expected_types = "*$!+";
break;
{
case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
{
- unsigned int bytes = pnote->namesz - (name - pnote->namedata);
+ /* The -1 is because the name field is always 0 terminated, and we
+ want to be able to ensure that the shift in the while loop below
+ will not overflow. */
+ unsigned int bytes = (pnote->namesz - (name - pnote->namedata)) - 1;
unsigned long long val = 0;
unsigned int shift = 0;
char * decoded = NULL;
/* PR 21378 */
if (bytes > sizeof (val))
{
- error (_("corrupt name field: namesz of %lu is too large for a numeric value\n"),
- pnote->namesz);
- return FALSE;
+ error (_("corrupt numeric name field: too many bytes in the value: %x\n"),
+ bytes);
+ bytes = sizeof (val);
}
+ /* We do not bother to warn if bytes == 0 as this can
+ happen with some early versions of the gcc plugin. */
while (bytes --)
{
}
if (decoded != NULL)
- print_symbol (-left, decoded);
+ {
+ print_symbol (-left, decoded);
+ left = 0;
+ }
+ else if (val == 0)
+ {
+ printf ("0x0");
+ left -= 3;
+ }
else
{
if (do_wide)