readelf: nds32 specific decoding
authorAlan Modra <amodra@gmail.com>
Mon, 4 May 2020 00:50:54 +0000 (10:20 +0930)
committerAlan Modra <amodra@gmail.com>
Mon, 4 May 2020 01:58:40 +0000 (11:28 +0930)
* 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
binutils/readelf.c

index 52082fcae1216b14561050e11c1052ee29eb52e5..7b0d1a0477ed0c08a0f7fda0919ca413aa0f8a3d 100644 (file)
@@ -1,3 +1,9 @@
+2020-05-04  Alan Modra  <amodra@gmail.com>
+
+       * 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  <amodra@gmail.com>
            Haim Shimonovich  <Haim.Shimonovich@ceva-dsp.com>
 
index 4ceb6b2151f2c96b130ffc5a421114818a42484f..25c2cce21ae8ecbc84a3519d5e01d6310a664ffa 100644 (file)
@@ -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");