aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf.c
diff options
context:
space:
mode:
authorJon Turney <jon.turney@dronecode.org.uk>2020-07-17 15:25:47 +0100
committerJon Turney <jon.turney@dronecode.org.uk>2020-08-12 15:08:30 +0100
commit404ec93359eaaf6a4284613e9c3ac014eea9383b (patch)
tree972b8ec1103241478684182473a417969ec30150 /bfd/elf.c
parentd61f3d038344734da3eb4b1cb085f387f8ad4ffa (diff)
downloadgdb-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.
Diffstat (limited to 'bfd/elf.c')
-rw-r--r--bfd/elf.c39
1 files changed, 26 insertions, 13 deletions
diff --git a/bfd/elf.c b/bfd/elf.c
index 6fad516..e8c457c 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -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;