Don't crash is dwarf_decode_macro_bytes's 'body' is NULL, even when '!is_define'

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

On commit 7bede82892 ("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.
This commit is contained in:
Sergio Durigan Junior 2019-05-29 10:36:57 -04:00
parent f49055a52f
commit 955b06fa57
2 changed files with 21 additions and 16 deletions

View 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.

View 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.
/* 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);
}
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