This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH] Handle version 1a of FreeBSD's NT_PRSINFO.
- From: John Baldwin <jhb at FreeBSD dot org>
- To: binutils at sourceware dot org
- Date: Mon, 18 Jul 2016 08:17:58 -0700
- Subject: [PATCH] Handle version 1a of FreeBSD's NT_PRSINFO.
- Authentication-results: sourceware.org; auth=none
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