diff options
author | Andreas Arnez <arnez@linux.vnet.ibm.com> | 2015-01-14 12:01:38 +0000 |
---|---|---|
committer | Ulrich Weigand <ulrich.weigand@de.ibm.com> | 2015-02-04 14:14:31 +0100 |
commit | 1528345d6c4a407e0b36b3474eb458cbd04146f7 (patch) | |
tree | e1fab52ee8539ddbec833fdd9256d67cbb468b92 /gdb/mips-linux-tdep.c | |
parent | 8962a307ae3dd59166a4a6dc4e60a4da880686cd (diff) | |
download | gdb-1528345d6c4a407e0b36b3474eb458cbd04146f7.zip gdb-1528345d6c4a407e0b36b3474eb458cbd04146f7.tar.gz gdb-1528345d6c4a407e0b36b3474eb458cbd04146f7.tar.bz2 |
Fix internal error when core file section is too big
As reported in PR 17808, a test case with a forged (invalid) core file
can crash GDB with an assertion failure. In that particular case the
prstatus of an i386 core file looks like that from an AMD64 core file.
Consequently the respective regset supply function i386_supply_gregset
is invoked with a larger buffer than usual. But i386_supply_gregset
asserts a specific buffer size, and this assertion fails.
The patch relaxes all buffer size assertions in regset supply
functions such that they merely check for a sufficiently large buffer.
For consistency the regset collect functions are adjusted as well.
gdb/ChangeLog:
PR corefiles/17808:
* gdbarch.sh (iterate_over_regset_sections_cb): Document this
function type, particularly its SIZE parameter.
* gdbarch.h: Regenerate.
* amd64-tdep.c (amd64_supply_fpregset): In gdb_assert, compare
actual against required size using ">=" instead of "==".
(amd64_collect_fpregset): Likewise.
* i386-tdep.c (i386_supply_gregset): Likewise.
(i386_collect_gregset): Likewise.
(i386_supply_fpregset): Likewise.
(i386_collect_fpregset): Likewise.
* mips-linux-tdep.c (mips_supply_gregset_wrapper): Likewise.
(mips_fill_gregset_wrapper): Likewise.
(mips_supply_fpregset_wrapper): Likewise.
(mips_fill_fpregset_wrapper): Likewise.
(mips64_supply_gregset_wrapper): Likewise.
(mips64_fill_gregset_wrapper): Likewise.
(mips64_supply_fpregset_wrapper): Likewise.
(mips64_fill_fpregset_wrapper): Likewise.
* mn10300-linux-tdep.c (am33_supply_gregset_method): Likewise.
(am33_supply_fpregset_method): Likewise.
(am33_collect_gregset_method): Likewise.
(am33_collect_fpregset_method): Likewise.
Diffstat (limited to 'gdb/mips-linux-tdep.c')
-rw-r--r-- | gdb/mips-linux-tdep.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/gdb/mips-linux-tdep.c b/gdb/mips-linux-tdep.c index 5239c37..fe45dcc 100644 --- a/gdb/mips-linux-tdep.c +++ b/gdb/mips-linux-tdep.c @@ -163,7 +163,7 @@ mips_supply_gregset_wrapper (const struct regset *regset, struct regcache *regcache, int regnum, const void *gregs, size_t len) { - gdb_assert (len == sizeof (mips_elf_gregset_t)); + gdb_assert (len >= sizeof (mips_elf_gregset_t)); mips_supply_gregset (regcache, (const mips_elf_gregset_t *)gregs); } @@ -231,7 +231,7 @@ mips_fill_gregset_wrapper (const struct regset *regset, const struct regcache *regcache, int regnum, void *gregs, size_t len) { - gdb_assert (len == sizeof (mips_elf_gregset_t)); + gdb_assert (len >= sizeof (mips_elf_gregset_t)); mips_fill_gregset (regcache, (mips_elf_gregset_t *)gregs, regnum); } @@ -268,7 +268,7 @@ mips_supply_fpregset_wrapper (const struct regset *regset, struct regcache *regcache, int regnum, const void *gregs, size_t len) { - gdb_assert (len == sizeof (mips_elf_fpregset_t)); + gdb_assert (len >= sizeof (mips_elf_fpregset_t)); mips_supply_fpregset (regcache, (const mips_elf_fpregset_t *)gregs); } @@ -311,7 +311,7 @@ mips_fill_fpregset_wrapper (const struct regset *regset, const struct regcache *regcache, int regnum, void *gregs, size_t len) { - gdb_assert (len == sizeof (mips_elf_fpregset_t)); + gdb_assert (len >= sizeof (mips_elf_fpregset_t)); mips_fill_fpregset (regcache, (mips_elf_fpregset_t *)gregs, regnum); } @@ -413,7 +413,7 @@ mips64_supply_gregset_wrapper (const struct regset *regset, struct regcache *regcache, int regnum, const void *gregs, size_t len) { - gdb_assert (len == sizeof (mips64_elf_gregset_t)); + gdb_assert (len >= sizeof (mips64_elf_gregset_t)); mips64_supply_gregset (regcache, (const mips64_elf_gregset_t *)gregs); } @@ -484,7 +484,7 @@ mips64_fill_gregset_wrapper (const struct regset *regset, const struct regcache *regcache, int regnum, void *gregs, size_t len) { - gdb_assert (len == sizeof (mips64_elf_gregset_t)); + gdb_assert (len >= sizeof (mips64_elf_gregset_t)); mips64_fill_gregset (regcache, (mips64_elf_gregset_t *)gregs, regnum); } @@ -533,7 +533,7 @@ mips64_supply_fpregset_wrapper (const struct regset *regset, struct regcache *regcache, int regnum, const void *gregs, size_t len) { - gdb_assert (len == sizeof (mips64_elf_fpregset_t)); + gdb_assert (len >= sizeof (mips64_elf_fpregset_t)); mips64_supply_fpregset (regcache, (const mips64_elf_fpregset_t *)gregs); } @@ -611,7 +611,7 @@ mips64_fill_fpregset_wrapper (const struct regset *regset, const struct regcache *regcache, int regnum, void *gregs, size_t len) { - gdb_assert (len == sizeof (mips64_elf_fpregset_t)); + gdb_assert (len >= sizeof (mips64_elf_fpregset_t)); mips64_fill_fpregset (regcache, (mips64_elf_fpregset_t *)gregs, regnum); } |