diff options
author | John Baldwin <jhb@FreeBSD.org> | 2016-07-04 19:19:48 -0700 |
---|---|---|
committer | John Baldwin <jhb@FreeBSD.org> | 2016-07-20 08:43:54 -0700 |
commit | 0064d22386b99c047bbff3bcc73b6bfce9c29b4c (patch) | |
tree | 2f3090fba3fba950e7b28654bc6fad8dd6d794b6 | |
parent | 9ab8247228844bb6608d6b2c99b6d8732bab08c1 (diff) | |
download | gdb-0064d22386b99c047bbff3bcc73b6bfce9c29b4c.zip gdb-0064d22386b99c047bbff3bcc73b6bfce9c29b4c.tar.gz gdb-0064d22386b99c047bbff3bcc73b6bfce9c29b4c.tar.bz2 |
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.
-rw-r--r-- | bfd/ChangeLog | 5 | ||||
-rw-r--r-- | bfd/elf.c | 38 |
2 files changed, 34 insertions, 9 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index cbd65d5..ddf29bf 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -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 @@ -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; } |