This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Handle version 1a of FreeBSD's NT_PRSINFO.


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 |  5 +++++
 bfd/elf.c     | 38 +++++++++++++++++++++++++++++---------
 2 files changed, 34 insertions(+), 9 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index ec8fd85..37502c5 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+2016-07-18  John Baldwin  <jhb@FreeBSD.org>
+
+	* elf.c (elfcore_grok_freebsd_psinfo): Check for minimum note size
+	and handle pr_pid if present.
+
 2016-07-15  Thomas Preud'homme  <thomas.preudhomme@arm.com>
 
 	* elf-bfd.h (elf_backend_filter_implib_symbols): Declare backend hook.
diff --git a/bfd/elf.c b/bfd/elf.c
index ebcf40a..3a62c45 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -9588,27 +9588,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);
@@ -9617,6 +9626,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;
 }
-- 
2.8.4


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]