diff options
author | Tom Tromey <tromey@adacore.com> | 2021-04-15 08:54:06 -0600 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2021-04-30 07:33:01 -0600 |
commit | 2869ac4b59d58caf736f216f7bc65377116bd5f7 (patch) | |
tree | 41800bc393f05104e2e55de0cbaf48a3d0394b4f /gdb/ada-lang.c | |
parent | d1fbc3ba09fb2e79acf633df29ccbe9285624419 (diff) | |
download | binutils-2869ac4b59d58caf736f216f7bc65377116bd5f7.zip binutils-2869ac4b59d58caf736f216f7bc65377116bd5f7.tar.gz binutils-2869ac4b59d58caf736f216f7bc65377116bd5f7.tar.bz2 |
Fix crash with GNAT minimal encodings
Running the AdaCore internal test suite with -fgnat-encodings=minimal
found a gdb crash. The bug is that GDB ends up with a typedef in
ada_index_type, resulting in a NULL dereference.
This crash can be reproduced using GCC 11 with the included test case.
Tested on x86-64 Fedora 32. Because this is Ada-specific, and was
already reviewed by Joel, I am going to check it in.
2021-04-30 Tom Tromey <tromey@adacore.com>
* ada-lang.c (ada_index_type): Use ada_check_typedef.
gdb/testsuite/ChangeLog
2021-04-30 Tom Tromey <tromey@adacore.com>
* gdb.ada/enum_idx_packed/pck.ads (My_Enum, My_Array_Type)
(Confused_Array): New types.
* gdb.ada/enum_idx_packed/foo.adb (Confused_Array): New variable.
* gdb.ada/enum_idx_packed.exp: Add new tests.
Diffstat (limited to 'gdb/ada-lang.c')
-rw-r--r-- | gdb/ada-lang.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 0b50a78..e15e583 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -2877,8 +2877,11 @@ ada_index_type (struct type *type, int n, const char *name) int i; for (i = 1; i < n; i += 1) - type = TYPE_TARGET_TYPE (type); - result_type = TYPE_TARGET_TYPE (type->index_type ()); + { + type = ada_check_typedef (type); + type = TYPE_TARGET_TYPE (type); + } + result_type = TYPE_TARGET_TYPE (ada_check_typedef (type)->index_type ()); /* FIXME: The stabs type r(0,0);bound;bound in an array type has a target type of TYPE_CODE_UNDEF. We compensate here, but perhaps stabsread.c would make more sense. */ |