diff options
author | Jon Turney <jon.turney@dronecode.org.uk> | 2020-07-17 15:25:47 +0100 |
---|---|---|
committer | Jon Turney <jon.turney@dronecode.org.uk> | 2020-08-12 15:08:30 +0100 |
commit | 404ec93359eaaf6a4284613e9c3ac014eea9383b (patch) | |
tree | 972b8ec1103241478684182473a417969ec30150 | |
parent | d61f3d038344734da3eb4b1cb085f387f8ad4ffa (diff) | |
download | gdb-404ec93359eaaf6a4284613e9c3ac014eea9383b.zip gdb-404ec93359eaaf6a4284613e9c3ac014eea9383b.tar.gz gdb-404ec93359eaaf6a4284613e9c3ac014eea9383b.tar.bz2 |
Only warn about malformed win32pstatus notes
bfd/ChangeLog:
2020-07-21 Jon Turney <jon.turney@dronecode.org.uk>
* elf.c (elfcore_grok_win32pstatus): Warn on malformed
win32pstatus notes, and return TRUE so we continue rather than
stopping as if it was an error.
-rw-r--r-- | bfd/ChangeLog | 6 | ||||
-rw-r--r-- | bfd/elf.c | 39 |
2 files changed, 32 insertions, 13 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index fe7fdbf6..5539e98 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2020-07-21 Jon Turney <jon.turney@dronecode.org.uk> + + * elf.c (elfcore_grok_win32pstatus): Warn on malformed + win32pstatus notes, and return TRUE so we continue rather than + stopping as if it was an error. + 2020-07-01 Jon Turney <jon.turney@dronecode.org.uk> * elf.c (elfcore_grok_win32pstatus): Handle NOTE_INFO_MODULE64. @@ -10154,21 +10154,36 @@ elfcore_grok_win32pstatus (bfd *abfd, Elf_Internal_Note *note) type = bfd_get_32 (abfd, note->descdata); + struct { + const char *type_name; + unsigned long min_size; + } size_check[] = + { + { "NOTE_INFO_PROCESS", 12 }, + { "NOTE_INFO_THREAD", 12 }, + { "NOTE_INFO_MODULE", 12 }, + { "NOTE_INFO_MODULE64", 16 }, + }; + + if (type > (sizeof(size_check)/sizeof(size_check[0]))) + return TRUE; + + if (note->descsz < size_check[type - 1].min_size) + { + _bfd_error_handler (_("%pB: warning: win32pstatus %s of size %lu bytes is too small"), + abfd, size_check[type - 1].type_name, note->descsz); + return TRUE; + } + switch (type) { case NOTE_INFO_PROCESS: - if (note->descsz < 12) - return FALSE; - /* FIXME: need to add ->core->command. */ elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 4); elf_tdata (abfd)->core->signal = bfd_get_32 (abfd, note->descdata + 8); break; case NOTE_INFO_THREAD: - if (note->descsz < 12) - return FALSE; - /* Make a ".reg/<tid>" section containing the Win32 API thread CONTEXT structure. */ /* thread_info.tid */ @@ -10204,9 +10219,6 @@ elfcore_grok_win32pstatus (bfd *abfd, Elf_Internal_Note *note) /* Make a ".module/xxxxxxxx" section. */ if (type == NOTE_INFO_MODULE) { - if (note->descsz < 12) - return FALSE; - /* module_info.base_address */ base_addr = bfd_get_32 (abfd, note->descdata + 4); sprintf (buf, ".module/%08lx", (unsigned long) base_addr); @@ -10215,9 +10227,6 @@ elfcore_grok_win32pstatus (bfd *abfd, Elf_Internal_Note *note) } else /* NOTE_INFO_MODULE64 */ { - if (note->descsz < 16) - return FALSE; - /* module_info.base_address */ base_addr = bfd_get_64 (abfd, note->descdata + 4); sprintf (buf, ".module/%016lx", (unsigned long) base_addr); @@ -10238,7 +10247,11 @@ elfcore_grok_win32pstatus (bfd *abfd, Elf_Internal_Note *note) return FALSE; if (note->descsz < 12 + name_size) - return FALSE; + { + _bfd_error_handler (_("%pB: win32pstatus NOTE_INFO_MODULE of size %lu is too small to contain a name of size %zu"), + abfd, note->descsz, name_size); + return TRUE; + } sect->size = note->descsz; sect->filepos = note->descpos; |