Browse Source

Fix a crash in jit.c

A user at Mozilla pointed out a crash in jit.c.  In his situation, an
inferior using the JIT API exec'd an executable that did not use it.
This caused an assertion failure when jit.c:free_objfile_data called
delete_breakpoint with NULL.

This patch fixes the problem in the obvious way.  New test case
included.

gdb/ChangeLog
2018-12-28  Tom Tromey  <tom@tromey.com>

	* jit.c (free_objfile_data): Only delete breakpoint if non-null.

gdb/testsuite/ChangeLog
2018-12-28  Tom Tromey  <tom@tromey.com>
	    Simon Marchi <simark@simark.ca>

	* gdb.base/jit-exec.exp: New file.
	* gdb.base/jit-exec.c: New file.
	* gdb.base/jit-execd.c: New file.
binutils-2_32-branch
Tom Tromey 7 years ago
parent
commit
2cd8cc0b66
  1. 4
      gdb/ChangeLog
  2. 3
      gdb/jit.c
  3. 7
      gdb/testsuite/ChangeLog
  4. 28
      gdb/testsuite/gdb.base/jit-exec.c
  5. 52
      gdb/testsuite/gdb.base/jit-exec.exp
  6. 22
      gdb/testsuite/gdb.base/jit-execd.c

4
gdb/ChangeLog

@ -1,3 +1,7 @@
2018-12-28 Tom Tromey <tom@tromey.com>
* jit.c (free_objfile_data): Only delete breakpoint if non-null.
2018-12-28 Tom Tromey <tom@tromey.com>
* NEWS: Mention terminal styling.

3
gdb/jit.c

@ -1464,7 +1464,8 @@ free_objfile_data (struct objfile *objfile, void *data)
if (ps_data != NULL && ps_data->objfile == objfile)
{
ps_data->objfile = NULL;
delete_breakpoint (ps_data->jit_breakpoint);
if (ps_data->jit_breakpoint != NULL)
delete_breakpoint (ps_data->jit_breakpoint);
ps_data->cached_code_address = 0;
}
}

7
gdb/testsuite/ChangeLog

@ -1,3 +1,10 @@
2018-12-28 Tom Tromey <tom@tromey.com>
Simon Marchi <simark@simark.ca>
* gdb.base/jit-exec.exp: New file.
* gdb.base/jit-exec.c: New file.
* gdb.base/jit-execd.c: New file.
2018-12-28 Tom Tromey <tom@tromey.com>
* gdb.base/style.exp: Update test to check for address styling.

28
gdb/testsuite/gdb.base/jit-exec.c

@ -0,0 +1,28 @@
/* This testcase is part of GDB, the GNU debugger.
Copyright 2018 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* Simple standalone program using the JIT API. */
#include "jit-simple-jit.c"
#include <unistd.h>
int
main (int argc, char **argv)
{
execl (PROGRAM, PROGRAM, (char *) 0);
return 99;
}

52
gdb/testsuite/gdb.base/jit-exec.exp

@ -0,0 +1,52 @@
# Copyright 2018 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# Regression test for a jit.c bug. Previously it would crash if an
# inferior that used the JIT API then exec'd a program that did not
# use it.
if { ![istarget "*-linux*"] } then {
return
}
standard_testfile jit-exec.c
set testfile2 "jit-execd"
set srcfile2 ${testfile2}.c
set binfile2 [standard_output_file ${testfile2}]
set compile_options [list debug additional_flags=-DPROGRAM=\"$binfile2\"]
if {[gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" \
executable $compile_options] != ""} {
untested "failed to compile"
return -1
}
if {[gdb_compile "${srcdir}/${subdir}/${srcfile2}" "${binfile2}" \
executable $compile_options] != ""} {
untested "failed to compile"
return -1
}
clean_restart $binfile
if {![runto_main]} {
fail "can't run to main"
return
}
delete_breakpoints
gdb_test "continue" "Inferior .* exited normally.*"

22
gdb/testsuite/gdb.base/jit-execd.c

@ -0,0 +1,22 @@
/* This testcase is part of GDB, the GNU debugger.
Copyright 2018 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
int
main (int argc, char **argv)
{
return 0;
}
Loading…
Cancel
Save