display_debug_macinfo
authorAlan Modra <amodra@gmail.com>
Sat, 15 May 2021 05:31:51 +0000 (15:01 +0930)
committerAlan Modra <amodra@gmail.com>
Sat, 15 May 2021 05:35:29 +0000 (15:05 +0930)
The existing code went to the bother of using strnlen for scanning but
went wild when printing, and possibly incremented curr past end.

* dwarf.c (display_debug_macinfo): Print strings that might not
be zero terminated with %*s.  Don't bump curr if unterminated.

binutils/ChangeLog
binutils/dwarf.c

index 5fd8bc1fa15ec3493b50a580a42ccbbf27c2413d..b4f1af1957b832090cbe11dc9afb6691fc7004e3 100644 (file)
@@ -1,3 +1,8 @@
+2021-05-15  Alan Modra  <amodra@gmail.com>
+
+       * dwarf.c (display_debug_macinfo): Print strings that might not
+       be zero terminated with %*s.  Don't bump curr if unterminated.
+
 2021-05-15  Alan Modra  <amodra@gmail.com>
 
        * dwarf.c (display_debug_pubnames_worker): Delete initial_length_size.
index 878f4f766dbe01d7e0215bd4d869ff374d4ddc9d..d184e5289ed5ad55e766d3e1f16e1eff5108d312 100644 (file)
@@ -5780,17 +5780,21 @@ display_debug_macinfo (struct dwarf_section *section,
        case DW_MACINFO_define:
          READ_ULEB (lineno, curr, end);
          string = curr;
-         curr += strnlen ((char *) string, end - string) + 1;
-         printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"),
-                 lineno, string);
+         curr += strnlen ((char *) string, end - string);
+         printf (_(" DW_MACINFO_define - lineno : %d macro : %*s\n"),
+                 lineno, (int) (curr - string), string);
+         if (curr < end)
+           curr++;
          break;
 
        case DW_MACINFO_undef:
          READ_ULEB (lineno, curr, end);
          string = curr;
-         curr += strnlen ((char *) string, end - string) + 1;
-         printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"),
-                 lineno, string);
+         curr += strnlen ((char *) string, end - string);
+         printf (_(" DW_MACINFO_undef - lineno : %d macro : %*s\n"),
+                 lineno, (int) (curr - string), string);
+         if (curr < end)
+           curr++;
          break;
 
        case DW_MACINFO_vendor_ext:
@@ -5799,9 +5803,11 @@ display_debug_macinfo (struct dwarf_section *section,
 
            READ_ULEB (constant, curr, end);
            string = curr;
-           curr += strnlen ((char *) string, end - string) + 1;
-           printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"),
-                   constant, string);
+           curr += strnlen ((char *) string, end - string);
+           printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %*s\n"),
+                   constant, (int) (curr - string), string);
+           if (curr < end)
+             curr++;
          }
          break;
        }