From 9c7b8e9b92696f38ff29efeeb12eb166994c0a23 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 4 May 2020 10:20:54 +0930 Subject: [PATCH] readelf: nds32 specific decoding * readelf.c (process_nds32_specific): Check size of .nds32_e_flags section. Don't assume endian of host matches nds32 target. Free buffer. --- binutils/ChangeLog | 6 ++++++ binutils/readelf.c | 15 +++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 52082fcae12..7b0d1a0477e 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,9 @@ +2020-05-04 Alan Modra + + * readelf.c (process_nds32_specific): Check size of .nds32_e_flags + section. Don't assume endian of host matches nds32 target. Free + buffer. + 2020-05-01 Alan Modra Haim Shimonovich diff --git a/binutils/readelf.c b/binutils/readelf.c index 4ceb6b2151f..25c2cce21ae 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -17481,18 +17481,21 @@ process_nds32_specific (Filedata * filedata) Elf_Internal_Shdr *sect = NULL; sect = find_section (filedata, ".nds32_e_flags"); - if (sect != NULL) + if (sect != NULL && sect->sh_size >= 4) { - unsigned int *flag; + unsigned char *buf; + unsigned int flag; printf ("\nNDS32 elf flags section:\n"); - flag = get_data (NULL, filedata, sect->sh_offset, 1, - sect->sh_size, _("NDS32 elf flags section")); + buf = get_data (NULL, filedata, sect->sh_offset, 1, 4, + _("NDS32 elf flags section")); - if (! flag) + if (buf == NULL) return FALSE; - switch ((*flag) & 0x3) + flag = byte_get (buf, 4); + free (buf); + switch (flag & 0x3) { case 0: printf ("(VEC_SIZE):\tNo entry.\n"); -- 2.30.2