Don't crash is dwarf_decode_macro_bytes's 'body' is NULL, even when '!is_define'
authorSergio Durigan Junior <sergiodj@redhat.com>
Wed, 29 May 2019 14:36:57 +0000 (10:36 -0400)
committerSergio Durigan Junior <sergiodj@redhat.com>
Wed, 29 May 2019 20:14:50 +0000 (16:14 -0400)
Ref.: https://bugzilla.redhat.com/show_bug.cgi?id=1715008

On commit 7bede82892a06e6c26989803e70f53697392dcf9 ("Don't crash if
dwarf_decode_macro_bytes's 'body' is NULL"), I was too strict when
checking if 'body' is NULL: the check only comprised the case when
'is_define' is true.  However, the corruption of .debug_macro by
rpmbuild's "debugedit" also affects the case when 'is_define' is
false, i.e., when the macro is being undefined.

This commit improves the check and covers both cases now.  This has
been tested on Fedora 30 with a problematic debuginfo, and I don't see
a segfault anymore.

OK to push?

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

Ref.: https://bugzilla.redhat.com/show_bug.cgi?id=1708192
Ref.: https://bugzilla.redhat.com/show_bug.cgi?id=1715008
* dwarf2read.c (dwarf_decode_macro_bytes): Move check to see if
'body' is NULL to the outter 'if', protecting the '!is_define'
situation as well.

gdb/ChangeLog
gdb/dwarf2read.c

index 37c0069e3f2193ae4f2f715937ec81fb94ef30e9..2ab3615be6e52ba83579b4383c543932bac89bab 100644 (file)
@@ -1,3 +1,11 @@
+2019-05-29  Sergio Durigan Junior  <sergiodj@redhat.com>
+
+       Ref.: https://bugzilla.redhat.com/show_bug.cgi?id=1708192
+       Ref.: https://bugzilla.redhat.com/show_bug.cgi?id=1715008
+       * dwarf2read.c (dwarf_decode_macro_bytes): Move check to see if
+       'body' is NULL to the outter 'if', protecting the '!is_define'
+       situation as well.
+
 2019-05-29  Tom Tromey  <tromey@adacore.com>
 
        * dwarf2read.c (partial_die_parent_scope): Call dwarf_tag_name.
index f47d130fa220123843798f33e0844c53f02107b9..e1d6bb2d580848d8f9bb3ef9f9b2f50cb2996982 100644 (file)
@@ -24648,25 +24648,22 @@ dwarf_decode_macro_bytes (struct dwarf2_cu *cu,
                         is_define ? _("definition") : _("undefinition"),
                         line == 0 ? _("zero") : _("non-zero"), line, body);
 
-           if (is_define)
+           if (body == NULL)
              {
-               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);
-                 }
+               /* 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 %s "
+                            "without body (corrupted?) at line %d "
+                            "on file %s"),
+                          at_commandline ? _("command-line") : _("in-file"),
+                          is_define ? _("definition") : _("undefinition"),
+                          line, current_file->filename);
              }
+           else if (is_define)
+             parse_macro_definition (current_file, line, body);
            else
              {
                gdb_assert (macinfo_type == DW_MACRO_undef