Fix a seg-fault when displaying notes from a prorgam segment. Check for a NULL strin...
authorNick Clifton <nickc@redhat.com>
Mon, 27 Nov 2017 11:05:39 +0000 (11:05 +0000)
committerNick Clifton <nickc@redhat.com>
Mon, 27 Nov 2017 11:05:39 +0000 (11:05 +0000)
PR 22490
* readelf.c (dump_section_as_bytes): Check for a NULL string
section pointer.
(process_notes_at): Compute the alignment to use if displaying
notes from a segment.

binutils/ChangeLog
binutils/readelf.c

index 75ef5cd0321e25d56419899cf3251c9242da79a2..f30ef1970f16f640d26440c652dc658b4354ad8e 100644 (file)
@@ -1,3 +1,11 @@
+2017-11-27  Nick Clifton  <nickc@redhat.com>
+
+       PR 22490
+       * readelf.c (dump_section_as_bytes): Check for a NULL string
+       section pointer.
+       (process_notes_at): Compute the alignment to use if displaying
+       notes from a segment.
+
 2017-11-26  H.J. Lu  <hongjiu.lu@intel.com>
 
        * dwarf.c (load_separate_debug_info): Rename argument name from
index 739367d899bc1332242a3f6e48ff370ea2751b03..53896ae647bf54d596528581e94472061d98c883 100644 (file)
@@ -13581,7 +13581,7 @@ load_debug_section (enum dwarf_section_display_enum debug, void * data)
       /* Read in the string table, so that we have section names to scan.  */
       strs = filedata->section_headers + filedata->file_header.e_shstrndx;
 
-      if (strs->sh_size != 0)
+      if (strs != NULL && strs->sh_size != 0)
        {
          filedata->string_table = (char *) get_data (NULL, filedata, strs->sh_offset,
                                                      1, strs->sh_size,
@@ -17908,8 +17908,9 @@ process_notes_at (Filedata *           filedata,
 {
   Elf_External_Note * pnotes;
   Elf_External_Note * external;
-  char * end;
-  bfd_boolean res = TRUE;
+  char *              end;
+  bfd_boolean         res = TRUE;
+  size_t              align;
 
   if (length <= 0)
     return FALSE;
@@ -17922,10 +17923,21 @@ process_notes_at (Filedata *           filedata,
          if (! apply_relocations (filedata, section, (unsigned char *) pnotes, length, NULL, NULL))
            return FALSE;
        }
+      align = section->sh_addralign;
     }
   else
-    pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
+    {
+      pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
                                             _("notes"));
+
+      /* FIXME: Core notes seem to be produced with
+        4-byte alignment even on 64-bit systems.  */
+      if (filedata->file_header.e_type == ET_CORE)
+       align = 4;
+      else
+       align = is_32bit_elf ? 4 : 4;
+    }
+
   if (pnotes == NULL)
     return FALSE;
 
@@ -17944,7 +17956,7 @@ process_notes_at (Filedata *           filedata,
     {
       Elf_Internal_Note inote;
       size_t min_notesz;
-      char *next;
+      char * next;
       char * temp = NULL;
       size_t data_remaining = end - (char *) external;
 
@@ -17970,12 +17982,10 @@ process_notes_at (Filedata *           filedata,
          inote.namedata = external->name;
          inote.descsz   = BYTE_GET (external->descsz);
          inote.descdata = ((char *) external
-                           + ELF_NOTE_DESC_OFFSET (inote.namesz,
-                                                   section->sh_addralign));
+                           + ELF_NOTE_DESC_OFFSET (inote.namesz, align));
          inote.descpos  = offset + (inote.descdata - (char *) pnotes);
          next = ((char *) external
-                 + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz,
-                                         section->sh_addralign));
+                 + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz, align));
        }
       else
        {
@@ -18016,8 +18026,8 @@ process_notes_at (Filedata *           filedata,
        {
          warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
                (unsigned long) ((char *) external - (char *) pnotes));
-         warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
-               inote.type, inote.namesz, inote.descsz);
+         warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx, alignment: %u\n"),
+               inote.type, inote.namesz, inote.descsz, (int) align);
          break;
        }