From: Doug Evans Date: Sat, 31 Dec 2011 17:18:13 +0000 (+0000) Subject: * dwarf2read.c (read_typedef): Guard against self-referential typedefs. X-Git-Tag: sid-snapshot-20120101~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3c8e0968a5264c7793a09794a12a26b4c9976cc6;p=platform%2Fupstream%2Fbinutils.git * dwarf2read.c (read_typedef): Guard against self-referential typedefs. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 40f6169..5ef00d9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2011-12-30 Doug Evans + + * dwarf2read.c (read_typedef): Guard against self-referential typedefs. + 2011-12-28 Jan Kratochvil * gdbarch.sh (max_insn_length): Extend the comment by unit. diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 31ea14e..cee021c 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -8836,14 +8836,26 @@ read_typedef (struct die_info *die, struct dwarf2_cu *cu) { struct objfile *objfile = cu->objfile; const char *name = NULL; - struct type *this_type; + struct type *this_type, *target_type; name = dwarf2_full_name (NULL, die, cu); this_type = init_type (TYPE_CODE_TYPEDEF, 0, TYPE_FLAG_TARGET_STUB, NULL, objfile); TYPE_NAME (this_type) = (char *) name; set_die_type (die, this_type, cu); - TYPE_TARGET_TYPE (this_type) = die_type (die, cu); + target_type = die_type (die, cu); + if (target_type != this_type) + TYPE_TARGET_TYPE (this_type) = target_type; + else + { + /* Self-referential typedefs are, it seems, not allowed by the DWARF + spec and cause infinite loops in GDB. */ + complaint (&symfile_complaints, + _("Self-referential DW_TAG_typedef " + "- DIE at 0x%x [in module %s]"), + die->offset, cu->objfile->name); + TYPE_TARGET_TYPE (this_type) = NULL; + } return this_type; }