dwarf2read.c (update_enumeration_type_from_children): Avoid infinite loop.
authorDoug Evans <dje@google.com>
Thu, 13 Nov 2014 23:43:12 +0000 (15:43 -0800)
committerDoug Evans <dje@google.com>
Thu, 13 Nov 2014 23:43:12 +0000 (15:43 -0800)
gdb/ChangeLog:

* dwarf2read.c (update_enumeration_type_from_children): Avoid
infinite loop.

gdb/ChangeLog
gdb/dwarf2read.c

index 53b05b4465eb00b32dbe0ee766279d51e5ff963b..7f918e9ecfeda89adcdae0ec13ab188db222023d 100644 (file)
@@ -1,3 +1,8 @@
+2014-11-13  Doug Evans  <dje@google.com>
+
+       * dwarf2read.c (update_enumeration_type_from_children): Avoid
+       infinite loop.
+
 2014-11-13  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        * NEWS (maint set target-async): Fix typo.
index ce37adfe72e11594148e7c4af3290e948c944a0f..1250bc7e76837c66d67b3676353615484305b26c 100644 (file)
@@ -13231,7 +13231,7 @@ update_enumeration_type_from_children (struct die_info *die,
                                       struct dwarf2_cu *cu)
 {
   struct obstack obstack;
-  struct die_info *child_die = die->child;
+  struct die_info *child_die;
   int unsigned_enum = 1;
   int flag_enum = 1;
   ULONGEST mask = 0;
@@ -13240,13 +13240,16 @@ update_enumeration_type_from_children (struct die_info *die,
   obstack_init (&obstack);
   old_chain = make_cleanup_obstack_free (&obstack);
 
-  while (child_die != NULL && child_die->tag)
+  for (child_die = die->child;
+       child_die != NULL && child_die->tag;
+       child_die = sibling_die (child_die))
     {
       struct attribute *attr;
       LONGEST value;
       const gdb_byte *bytes;
       struct dwarf2_locexpr_baton *baton;
       const char *name;
+
       if (child_die->tag != DW_TAG_enumerator)
        continue;
 
@@ -13274,7 +13277,6 @@ update_enumeration_type_from_children (struct die_info *die,
         a flag type, no need to look at the rest of the enumerates.  */
       if (!unsigned_enum && !flag_enum)
        break;
-      child_die = sibling_die (child_die);
     }
 
   if (unsigned_enum)