From: Nick Clifton <nickc@redhat.com>
To: binutils@sourceware.org
Subject: Commit: readelf: Improve formatting in the presence of unrecognised gnu build attribute notes
Date: Wed, 26 Apr 2017 13:26:00 -0000 [thread overview]
Message-ID: <87o9vjl2qa.fsf@redhat.com> (raw)
Hi Guys,
I am checking in the patch below to improve readelf's formatting when
displaying unrecognised gnu build attribute notes.
Cheers
Nick
binutils/ChangeLog
2017-04-26 Nick Clifton <nickc@redhat.com>
* readelf.c (process_section_headers): Warn about over-large
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.
diff --git a/binutils/readelf.c b/binutils/readelf.c
index 1139f71..061d0ad 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -6215,6 +6215,13 @@ process_section_headers (FILE * file)
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));
@@ -16897,7 +16904,6 @@ print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
expected_types = bool_expected;
++ name;
break;
-
default:
if (ISPRINT (* name))
{
@@ -16911,9 +16917,11 @@ print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
}
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;
@@ -16943,7 +16951,10 @@ print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
{
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;
@@ -16951,10 +16962,12 @@ print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
/* 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);
}
+ else if (bytes == 0)
+ error (_("corrupt numeric name field: no bytes in value\n"));
while (bytes --)
{
@@ -16994,7 +17007,15 @@ print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
}
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)
diff --git a/binutils/testsuite/binutils-all/note-2-32.s b/binutils/testsuite/binutils-all/note-2-32.s
index da3b085..9aed3df 100644
--- a/binutils/testsuite/binutils-all/note-2-32.s
+++ b/binutils/testsuite/binutils-all/note-2-32.s
@@ -17,23 +17,21 @@ note1.s:
.dc.l 0x100
.asciz "$gcc 7.0.1"
- .dc.l 2
+ .dc.l 3
.dc.l 0
.dc.l 0x100
- .dc.b 0x2b, 0x2
- .dc.b 0, 0
+ .dc.b 0x2b, 0x2, 0
+ .dc.b 0
- .dc.l 3
+ .dc.l 4
.dc.l 0
.dc.l 0x100
- .dc.b 0x2a, 0x7, 0
- .dc.b 0
+ .dc.b 0x2a, 0x7, 0, 0
- .dc.l 3
+ .dc.l 4
.dc.l 0
.dc.l 0x100
- .dc.b 0x2a, 0x6, 0
- .dc.b 0
+ .dc.b 0x2a, 0x6, 0, 0
.popsection
@@ -55,23 +53,21 @@ func1:
.dc.l 0x100
.asciz "$gcc 7.0.1"
- .dc.l 2
+ .dc.l 3
.dc.l 0
.dc.l 0x100
- .dc.b 0x21, 0x2
- .dc.b 0, 0
+ .dc.b 0x21, 0x2, 0
+ .dc.b 0
- .dc.l 3
+ .dc.l 4
.dc.l 0
.dc.l 0x101
- .dc.b 0x2a, 0x7, 1
- .dc.b 0
+ .dc.b 0x2a, 0x7, 1, 0
- .dc.l 3
+ .dc.l 4
.dc.l 0
.dc.l 0x100
- .dc.b 0x2a, 0x6, 0
- .dc.b 0
+ .dc.b 0x2a, 0x6, 0, 0
.popsection
.global note3.s
diff --git a/binutils/testsuite/binutils-all/note-2-64.s b/binutils/testsuite/binutils-all/note-2-64.s
index fcd61d0..885e947 100644
--- a/binutils/testsuite/binutils-all/note-2-64.s
+++ b/binutils/testsuite/binutils-all/note-2-64.s
@@ -17,23 +17,21 @@ note1.s:
.dc.l 0x100
.asciz "$gcc 7.0.1"
- .dc.l 2
+ .dc.l 3
.dc.l 0
.dc.l 0x100
- .dc.b 0x2b, 0x2
- .dc.b 0, 0
+ .dc.b 0x2b, 0x2, 0
+ .dc.b 0
- .dc.l 3
+ .dc.l 4
.dc.l 0
.dc.l 0x100
- .dc.b 0x2a, 0x7, 0
- .dc.b 0
+ .dc.b 0x2a, 0x7, 0, 0
- .dc.l 3
+ .dc.l 4
.dc.l 0
.dc.l 0x100
- .dc.b 0x2a, 0x6, 0
- .dc.b 0
+ .dc.b 0x2a, 0x6, 0, 0
.popsection
@@ -56,23 +54,21 @@ func1:
.dc.l 0x100
.asciz "$gcc 7.0.1"
- .dc.l 2
+ .dc.l 3
.dc.l 0
.dc.l 0x100
- .dc.b 0x21, 0x2
- .dc.b 0, 0
+ .dc.b 0x21, 0x2, 0
+ .dc.b 0
- .dc.l 3
+ .dc.l 4
.dc.l 0
.dc.l 0x101
- .dc.b 0x2a, 0x7, 1
- .dc.b 0
+ .dc.b 0x2a, 0x7, 1, 0
- .dc.l 3
+ .dc.l 4
.dc.l 0
.dc.l 0x100
- .dc.b 0x2a, 0x6, 0
- .dc.b 0
+ .dc.b 0x2a, 0x6, 0, 0
.popsection
@@ -93,5 +89,3 @@ note3.s:
.asciz "$gcc 7.0.1"
.popsection
-
-
reply other threads:[~2017-04-26 13:26 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87o9vjl2qa.fsf@redhat.com \
--to=nickc@redhat.com \
--cc=binutils@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).