]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Re: readelf..debug-dump=loc displays bogus base addresses
authorAlan Modra <amodra@gmail.com>
Thu, 14 Dec 2023 23:34:48 +0000 (10:04 +1030)
committerAlan Modra <amodra@gmail.com>
Fri, 15 Dec 2023 02:26:45 +0000 (12:56 +1030)
Commit b05efa39b479 removed checks I added in commit f22f27f46c75 to
prevent segfaults when debug_info_p is NULL, which can be the case
with fuzzed objects.  Restore those checks.  Also, for dwo look at
rnglists_dwo rather than rnglists.

binutils/dwarf.c

index 15046909bd09df567ccd564b550212c75d9cc2e2..b5e5ea8f8f34bbd63049ddb1c0bd3f02203084d2 100644 (file)
@@ -2771,7 +2771,9 @@ read_and_display_attr_value (unsigned long attribute,
 
          if (form == DW_FORM_loclistx)
            {
-             if (dwo)
+             if (debug_info_p == NULL)
+               idx = -1;
+             else if (dwo)
                {
                  idx = fetch_indexed_offset (uvalue, loclists_dwo,
                                              debug_info_p->loclists_base,
@@ -2779,7 +2781,7 @@ read_and_display_attr_value (unsigned long attribute,
                  if (idx != (uint64_t) -1)
                    idx += (offset_size == 8) ? 20 : 12;
                }
-             else if (debug_info_p == NULL || dwarf_version > 4)
+             else if (dwarf_version > 4)
                {
                  idx = fetch_indexed_offset (uvalue, loclists,
                                              debug_info_p->loclists_base,
@@ -2804,21 +2806,13 @@ read_and_display_attr_value (unsigned long attribute,
            }
          else if (form == DW_FORM_rnglistx)
            {
-             if (dwo)
-               {
-                 idx = fetch_indexed_offset (uvalue, rnglists,
-                                             debug_info_p->rnglists_base,
-                                             debug_info_p->offset_size);
-               }
+             if (debug_info_p == NULL)
+               idx = -1;
              else
-               {
-                 if (debug_info_p == NULL)
-                   base = 0;
-                 else
-                   base = debug_info_p->rnglists_base;
-                 idx = fetch_indexed_offset (uvalue, rnglists, base,
-                                             debug_info_p->offset_size);
-               }
+               idx = fetch_indexed_offset (uvalue,
+                                           dwo ? rnglists_dwo : rnglists,
+                                           debug_info_p->rnglists_base,
+                                           debug_info_p->offset_size);
            }
          else
            {