PR27884, skip_attr_bytes: Assertion (data) <= (end) failed
authorAlan Modra <amodra@gmail.com>
Tue, 18 May 2021 14:11:10 +0000 (23:41 +0930)
committerAlan Modra <amodra@gmail.com>
Wed, 19 May 2021 01:37:41 +0000 (11:07 +0930)
PR 27884
* dwarf.c (get_type_abbrev_from_form): Replace cu_offset_return
param with map_return, and return map for DW_FORM_ref_addr.
(get_type_signedness): Adjust calls to get_type_abbrev_from_form.
Pass returned cu map start and end to recursive call.
(read_and_display_attr_value): Similarly.

binutils/ChangeLog
binutils/dwarf.c

index 6767729d705bb29838d70351beba42347b84e978..8373280aaaa6a6f330266ba32b9a567a8d5812e2 100644 (file)
@@ -1,3 +1,12 @@
+2021-05-19  Alan Modra  <amodra@gmail.com>
+
+       PR 27884
+       * dwarf.c (get_type_abbrev_from_form): Replace cu_offset_return
+       param with map_return, and return map for DW_FORM_ref_addr.
+       (get_type_signedness): Adjust calls to get_type_abbrev_from_form.
+       Pass returned cu map start and end to recursive call.
+       (read_and_display_attr_value): Similarly.
+
 2021-05-19  Alan Modra  <amodra@gmail.com>
 
        PR 27879
index beac2260768d47ac0fb512634e481e0cdf7f344e..6dd98789e2893f9211ed8b698b348fe423c5f6b3 100644 (file)
@@ -2059,13 +2059,13 @@ skip_attr_bytes (unsigned long form,
    associated with it.  */
 
 static abbrev_entry *
-get_type_abbrev_from_form (unsigned long                 form,
-                          unsigned long                 uvalue,
-                          dwarf_vma                     cu_offset,
-                          const struct dwarf_section *  section,
-                          unsigned long *               abbrev_num_return,
-                          unsigned char **              data_return,
-                          unsigned long *               cu_offset_return)
+get_type_abbrev_from_form (unsigned long form,
+                          unsigned long uvalue,
+                          dwarf_vma cu_offset,
+                          const struct dwarf_section *section,
+                          unsigned long *abbrev_num_return,
+                          unsigned char **data_return,
+                          abbrev_map **map_return)
 {
   unsigned long   abbrev_number;
   abbrev_map *    map;
@@ -2132,12 +2132,12 @@ get_type_abbrev_from_form (unsigned long                 form,
       return NULL;
     }
 
-  if (cu_offset_return != NULL)
+  if (map_return != NULL)
     {
       if (form == DW_FORM_ref_addr)
-       * cu_offset_return = map->start;
+       *map_return = map;
       else
-       * cu_offset_return = cu_offset;
+       *map_return = NULL;
     }
        
   READ_ULEB (abbrev_number, data, section->start + section->size);
@@ -2214,21 +2214,23 @@ get_type_signedness (abbrev_entry *entry,
        case DW_AT_type:
          /* Recurse.  */
          {
-           abbrev_entry *  type_abbrev;
-           unsigned char * type_data;
-           unsigned long   type_cu_offset;
+           abbrev_entry *type_abbrev;
+           unsigned char *type_data;
+           abbrev_map *map;
 
            type_abbrev = get_type_abbrev_from_form (attr->form,
                                                     uvalue,
                                                     cu_offset,
                                                     section,
                                                     NULL /* abbrev num return */,
-                                                    & type_data,
-                                                    & type_cu_offset);
+                                                    &type_data,
+                                                    &map);
            if (type_abbrev == NULL)
              break;
 
-           get_type_signedness (type_abbrev, section, type_data, end, type_cu_offset,
+           get_type_signedness (type_abbrev, section, type_data,
+                                map ? section->start + map->end : end,
+                                map ? map->start : cu_offset,
                                 pointer_size, offset_size, dwarf_version,
                                 is_signed, nesting + 1);
          }
@@ -2951,13 +2953,15 @@ read_and_display_attr_value (unsigned long           attribute,
          bool is_signed = false;
          abbrev_entry *type_abbrev;
          unsigned char *type_data;
-         unsigned long type_cu_offset;
+         abbrev_map *map;
 
          type_abbrev = get_type_abbrev_from_form (form, uvalue, cu_offset,
-                                                  section, NULL, & type_data, & type_cu_offset);
+                                                  section, NULL, &type_data, &map);
          if (type_abbrev != NULL)
            {
-             get_type_signedness (type_abbrev, section, type_data, end, type_cu_offset,
+             get_type_signedness (type_abbrev, section, type_data,
+                                  map ? section->start + map->end : end,
+                                  map ? map->start : cu_offset,
                                   pointer_size, offset_size, dwarf_version,
                                   & is_signed, 0);
            }