Handle version 1a of FreeBSD's NT_PRSINFO.
authorJohn Baldwin <jhb@FreeBSD.org>
Tue, 5 Jul 2016 02:19:48 +0000 (19:19 -0700)
committerJohn Baldwin <jhb@FreeBSD.org>
Wed, 20 Jul 2016 15:43:54 +0000 (08:43 -0700)
Version 1a adds a pr_pid member containing the process ID of the
terminating process.  The presence of pr_pid is inferred from the
note's size.

bfd/ChangeLog:

* elf.c (elfcore_grok_freebsd_psinfo): Check for minimum note size
and handle pr_pid if present.

bfd/ChangeLog
bfd/elf.c

index cbd65d50126d3960531c87b5a8dd830bf955cdc6..ddf29bf5e58d7f6c136f2970f50f2aeb9ec11084 100644 (file)
@@ -1,3 +1,8 @@
+2016-07-20  John Baldwin  <jhb@FreeBSD.org>
+
+       * elf.c (elfcore_grok_freebsd_psinfo): Check for minimum note size
+       and handle pr_pid if present.
+
 2016-07-20  Alan Modra  <amodra@gmail.com>
 
        * elf64-ppc.c (ppc64_elf_howto_raw <R_PPC64_PLTREL32>): Put
index 2cc64e8d524ace5a15fce54df9b149e35801cebf..ba1774e7b40ace2e51058154794b718a29fd45d1 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -9590,27 +9590,36 @@ elfcore_grok_freebsd_psinfo (bfd *abfd, Elf_Internal_Note *note)
 {
   size_t offset;
 
-  /* Check for version 1 in pr_version. */
-  if (bfd_h_get_32 (abfd, (bfd_byte *) note->descdata) != 1)
-    return FALSE;
-  offset = 4;
-
-  /* Skip over pr_psinfosz. */
   switch (abfd->arch_info->bits_per_word)
     {
     case 32:
-      offset += 4;
+      if (note->descsz < 108)
+       return FALSE;
       break;
 
     case 64:
-      offset += 4;     /* Padding before pr_psinfosz. */
-      offset += 8;
+      if (note->descsz < 120)
+       return FALSE;
       break;
 
     default:
       return FALSE;
     }
 
+  /* Check for version 1 in pr_version.  */
+  if (bfd_h_get_32 (abfd, (bfd_byte *) note->descdata) != 1)
+    return FALSE;
+  offset = 4;
+
+  /* Skip over pr_psinfosz. */
+  if (abfd->arch_info->bits_per_word == 32)
+    offset += 4;
+  else
+    {
+      offset += 4;     /* Padding before pr_psinfosz. */
+      offset += 8;
+    }
+
   /* pr_fname is PRFNAMESZ (16) + 1 bytes in size.  */
   elf_tdata (abfd)->core->program
     = _bfd_elfcore_strndup (abfd, note->descdata + offset, 17);
@@ -9619,6 +9628,17 @@ elfcore_grok_freebsd_psinfo (bfd *abfd, Elf_Internal_Note *note)
   /* pr_psargs is PRARGSZ (80) + 1 bytes in size.  */
   elf_tdata (abfd)->core->command
     = _bfd_elfcore_strndup (abfd, note->descdata + offset, 81);
+  offset += 81;
+
+  /* Padding before pr_pid.  */
+  offset += 2;
+
+  /* The pr_pid field was added in version "1a".  */
+  if (note->descsz < offset + 4)
+    return TRUE;
+
+  elf_tdata (abfd)->core->pid
+    = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
 
   return TRUE;
 }