From patchwork Fri Dec 21 18:54:15 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 30800 Received: (qmail 109215 invoked by alias); 21 Dec 2018 18:54:27 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 109206 invoked by uid 89); 21 Dec 2018 18:54:26 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=H*RU:100.42.49.20, H*RU:sk:cm17.we, Hx-spam-relays-external:sk:cm17.we, Hx-spam-relays-external:100.42.49.20 X-HELO: gateway20.websitewelcome.com Received: from gateway20.websitewelcome.com (HELO gateway20.websitewelcome.com) (192.185.50.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 21 Dec 2018 18:54:23 +0000 Received: from cm17.websitewelcome.com (cm17.websitewelcome.com [100.42.49.20]) by gateway20.websitewelcome.com (Postfix) with ESMTP id 57D51400CC27B for ; Fri, 21 Dec 2018 12:54:21 -0600 (CST) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id aPwDgU1iA90onaPwDg1jyP; Fri, 21 Dec 2018 12:54:21 -0600 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tromey.com; s=default; h=Content-Transfer-Encoding:MIME-Version:Message-Id:Date:Subject: Cc:To:From:Sender:Reply-To:Content-Type:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=lUYUX+O1JPjfweRoEyl4UyiVh3vhhxmofpnfHBh2BJA=; b=UOFjhfn6+4nVqq6x/JRCxVlDW3 yFYq95fpUxPZixTrU4NGJj2aOk6h/xuqgEBOePtkkR+np/ZXXS7XNFJLMKSSwSkBtDowxOj269GI/ CTzRFWTKA+ShU2PCsVHOW+ssN; Received: from 75-166-72-210.hlrn.qwest.net ([75.166.72.210]:56076 helo=murgatroyd.Home) by box5379.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.91) (envelope-from ) id 1gaPwD-003Rkq-4x; Fri, 21 Dec 2018 12:54:21 -0600 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH] Fix a crash in jit.c Date: Fri, 21 Dec 2018 11:54:15 -0700 Message-Id: <20181221185415.20964-1-tom@tromey.com> MIME-Version: 1.0 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-21 Tom Tromey * jit.c (free_objfile_data): Only delete breakpoint if non-null. gdb/testsuite/ChangeLog 2018-12-21 Tom Tromey * gdb.base/jit-exec.exp: New file. * gdb.base/jit-exec.c: New file. * gdb.base/jit-execd.c: New file. --- gdb/ChangeLog | 4 +++ gdb/jit.c | 3 +- gdb/testsuite/ChangeLog | 6 ++++ gdb/testsuite/gdb.base/jit-exec.c | 28 ++++++++++++++++++ gdb/testsuite/gdb.base/jit-exec.exp | 46 +++++++++++++++++++++++++++++ gdb/testsuite/gdb.base/jit-execd.c | 22 ++++++++++++++ 6 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 gdb/testsuite/gdb.base/jit-exec.c create mode 100644 gdb/testsuite/gdb.base/jit-exec.exp create mode 100644 gdb/testsuite/gdb.base/jit-execd.c diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 28ab3345032..8357344290e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2018-12-21 Tom Tromey + + * jit.c (free_objfile_data): Only delete breakpoint if non-null. + 2018-12-19 Andrew Burgess * gdb/dummy-frame.c (default_dummy_id): Defined new function. diff --git a/gdb/jit.c b/gdb/jit.c index e6b3cc25ca4..9ae5d4a908c 100644 --- a/gdb/jit.c +++ b/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; } } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index ab3a74fffd6..8c512ab564e 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-12-21 Tom Tromey + + * gdb.base/jit-exec.exp: New file. + * gdb.base/jit-exec.c: New file. + * gdb.base/jit-execd.c: New file. + 2018-12-12 Andrew Burgess * gdb.base/annota1.exp: Update a test regexp. diff --git a/gdb/testsuite/gdb.base/jit-exec.c b/gdb/testsuite/gdb.base/jit-exec.c new file mode 100644 index 00000000000..85b5334ee74 --- /dev/null +++ b/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 . */ + +/* Simple standalone program using the JIT API. */ + +#include "jit-simple-jit.c" +#include + +int +main (int argc, char **argv) +{ + execl (PROGRAM, PROGRAM, (char *) 0); + return 99; +} diff --git a/gdb/testsuite/gdb.base/jit-exec.exp b/gdb/testsuite/gdb.base/jit-exec.exp new file mode 100644 index 00000000000..0a4fce7b88d --- /dev/null +++ b/gdb/testsuite/gdb.base/jit-exec.exp @@ -0,0 +1,46 @@ +# 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 . + +# 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 + +gdb_test "run" "Inferior .* exited normally.*" diff --git a/gdb/testsuite/gdb.base/jit-execd.c b/gdb/testsuite/gdb.base/jit-execd.c new file mode 100644 index 00000000000..6afe539cb4b --- /dev/null +++ b/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 . */ + +int +main (int argc, char **argv) +{ + return 0; +}