Don't crash if dwarf_decode_macro_bytes's 'body' is NULL
authorSergio Durigan Junior <sergiodj@redhat.com>
Fri, 10 May 2019 20:57:26 +0000 (16:57 -0400)
committerSergio Durigan Junior <sergiodj@redhat.com>
Wed, 15 May 2019 13:57:45 +0000 (09:57 -0400)
Hi,

Ref.: https://bugzilla.redhat.com/show_bug.cgi?id=1708192
      https://bugzilla.redhat.com/show_bug.cgi?id=1708786

During the Fedora RPM build process, gdb-add-index is invoked to
extract the DWARF index from the binary, and GDB will segfault because
dwarf2read.c:parse_definition_macro's 'body' variable is NULL.

The underlying problem is that Fedora's rpm-build's "debugedit"
program will silently corrupt .debug_macro strings when a binary is
compiled with -g3.  This is being taken care of by Mark Wielaard,
here:

  https://bugzilla.redhat.com/show_bug.cgi?id=1708786

However, I still feel it's important to make GDB more resilient
against invalid DWARF input, so I'm proposing this rather simple patch
to catch the situation when "body == NULL" (i.e., it's probably been
corrupted) and issue a complaint.  This is not a real fix to the
problem, of course, but at least GDB is able to finish without
segfaulting.

OK for master?

gdb/ChangeLog:
2019-05-15  Sergio Durigan Junior  <sergiodj@redhat.com>

Ref.: https://bugzilla.redhat.com/show_bug.cgi?id=1708192
* dwarf2read.c (dwarf_decode_macro_bytes): Check whether 'body' is
NULL, and complain if that's the case.

gdb/ChangeLog
gdb/dwarf2read.c

index 6c23281d259f3ff5467f87f920d4db032d0033ff..3aaeb927543d897548109f7db0c9fcd5c1f4ece7 100644 (file)
@@ -1,3 +1,9 @@
+2019-05-15  Sergio Durigan Junior  <sergiodj@redhat.com>
+
+       Ref.: https://bugzilla.redhat.com/show_bug.cgi?id=1708192
+       * dwarf2read.c (parse_macro_definition): Check whether 'body' is
+       NULL, and complain/return if that's the case.
+
 2019-05-15  John Darrington <john@darrington.wattle.id.au>
 
        * s12z-tdep.c (push_pull_get_stack_adjustment): New function.
index b29c089606db9c5a710aa6203d278374461e451a..0e3f37ff742d91d6ab08ba6c90485cec783fc1ca 100644 (file)
@@ -24609,7 +24609,24 @@ dwarf_decode_macro_bytes (struct dwarf2_cu *cu,
                         line == 0 ? _("zero") : _("non-zero"), line, body);
 
            if (is_define)
-             parse_macro_definition (current_file, line, body);
+             {
+               if (body != NULL)
+                 parse_macro_definition (current_file, line, body);
+               else
+                 {
+                   /* Fedora's rpm-build's "debugedit" binary
+                      corrupted .debug_macro sections.
+
+                      For more info, see
+                      https://bugzilla.redhat.com/show_bug.cgi?id=1708786 */
+                   complaint (_("debug info gives %s invalid macro definition "
+                                "without body (corrupted?) at line %d"
+                                "on file %s"),
+                              at_commandline ? _("command-line")
+                              : _("in-file"),
+                              line, current_file->filename);
+                 }
+             }
            else
              {
                gdb_assert (macinfo_type == DW_MACRO_undef