From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 113993 invoked by alias); 23 Dec 2015 14:30:27 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 113969 invoked by uid 89); 23 Dec 2015 14:30:24 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=AWL,BAYES_00,KAM_LAZY_DOMAIN_SECURITY,RP_MATCHES_RCVD autolearn=no version=3.3.2 spammy=Trace, H*r:sk:mmetzge, metzger, traced X-HELO: mga09.intel.com Received: from mga09.intel.com (HELO mga09.intel.com) (134.134.136.24) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 23 Dec 2015 14:30:22 +0000 Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga102.jf.intel.com with ESMTP; 23 Dec 2015 06:30:06 -0800 X-ExtLoop1: 1 Received: from irvmail001.ir.intel.com ([163.33.26.43]) by orsmga003.jf.intel.com with ESMTP; 23 Dec 2015 06:30:05 -0800 Received: from ulvlx001.iul.intel.com (ulvlx001.iul.intel.com [172.28.207.17]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id tBNEU53Z013313; Wed, 23 Dec 2015 14:30:05 GMT Received: from ulvlx001.iul.intel.com (localhost [127.0.0.1]) by ulvlx001.iul.intel.com with ESMTP id tBNEU4X4031425; Wed, 23 Dec 2015 15:30:04 +0100 Received: (from mmetzger@localhost) by ulvlx001.iul.intel.com with œ id tBNEU4vs031421; Wed, 23 Dec 2015 15:30:04 +0100 From: Markus Metzger To: palves@redhat.com Cc: gdb-patches@sourceware.org Subject: [PATCH] btrace: do not return out of TRY/CATCH Date: Wed, 23 Dec 2015 14:30:00 -0000 Message-Id: <1450881004-31154-1-git-send-email-markus.t.metzger@intel.com> X-IsSubscribed: yes X-SW-Source: 2015-12/txt/msg00465.txt.bz2 In btrace_pt_readmem_callback, we read memory inside TRY/CATCH and return in case of an error return value. This corrupts the cleanup chain, which eventually results in a SEGV when doing or discarding cleanups later on. 2015-12-23 Markus Metzger gdb/ * btrace.c (btrace_pt_readmem_callback): Do not return in TRY/CATCH. testsuite/ * gdb.btrace/dlopen.exp: New. * gdb.btrace/dlopen.c: New. * gdb.btrace/dlopen-dso.c: New. --- gdb/btrace.c | 9 +++--- gdb/testsuite/gdb.btrace/dlopen-dso.c | 22 +++++++++++++++ gdb/testsuite/gdb.btrace/dlopen.c | 50 +++++++++++++++++++++++++++++++++ gdb/testsuite/gdb.btrace/dlopen.exp | 52 +++++++++++++++++++++++++++++++++++ 4 files changed, 129 insertions(+), 4 deletions(-) create mode 100644 gdb/testsuite/gdb.btrace/dlopen-dso.c create mode 100644 gdb/testsuite/gdb.btrace/dlopen.c create mode 100644 gdb/testsuite/gdb.btrace/dlopen.exp diff --git a/gdb/btrace.c b/gdb/btrace.c index 35431cb..152daa7 100644 --- a/gdb/btrace.c +++ b/gdb/btrace.c @@ -842,21 +842,22 @@ btrace_pt_readmem_callback (gdb_byte *buffer, size_t size, const struct pt_asid *asid, uint64_t pc, void *context) { - int errcode; + int result, errcode; + result = (int) size; TRY { errcode = target_read_code ((CORE_ADDR) pc, buffer, size); if (errcode != 0) - return -pte_nomap; + result = -pte_nomap; } CATCH (error, RETURN_MASK_ERROR) { - return -pte_nomap; + result = -pte_nomap; } END_CATCH - return size; + return result; } /* Translate the vendor from one enum to another. */ diff --git a/gdb/testsuite/gdb.btrace/dlopen-dso.c b/gdb/testsuite/gdb.btrace/dlopen-dso.c new file mode 100644 index 0000000..1ea7657 --- /dev/null +++ b/gdb/testsuite/gdb.btrace/dlopen-dso.c @@ -0,0 +1,22 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2015 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 +answer (void) +{ + return 42; +} diff --git a/gdb/testsuite/gdb.btrace/dlopen.c b/gdb/testsuite/gdb.btrace/dlopen.c new file mode 100644 index 0000000..70df604 --- /dev/null +++ b/gdb/testsuite/gdb.btrace/dlopen.c @@ -0,0 +1,50 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2015 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 . */ + +#include +#include +#include + +static int +test (void) +{ + void *dso; + int (*fun) (void); + int answer; + + dso = dlopen (DSO_NAME, RTLD_NOW | RTLD_GLOBAL); + assert (dso != NULL); + + fun = (int (*) (void)) dlsym (dso, "answer"); + assert (fun != NULL); + + answer = fun (); + + dlclose (dso); + + return answer; +} + +int +main (void) +{ + int answer; + + answer = test (); + + return answer; +} diff --git a/gdb/testsuite/gdb.btrace/dlopen.exp b/gdb/testsuite/gdb.btrace/dlopen.exp new file mode 100644 index 0000000..48368ae --- /dev/null +++ b/gdb/testsuite/gdb.btrace/dlopen.exp @@ -0,0 +1,52 @@ +# This testcase is part of GDB, the GNU debugger. +# +# Copyright 2015 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 . + +if { [skip_btrace_tests] } { return -1 } +if { [skip_shlib_tests] } { return -1 } + +standard_testfile + +set basename_lib dlopen-dso +set srcfile_lib $srcdir/$subdir/$basename_lib.c +set binfile_lib [standard_output_file $basename_lib.so] + +if { [gdb_compile_shlib $srcfile_lib $binfile_lib \ + [list additional_flags=-fPIC]] != "" } { + untested "Could not compile $binfile_lib." + return -1 +} + +if { [prepare_for_testing $testfile.exp $testfile $srcfile \ + [list additional_flags=-DDSO_NAME=\"$binfile_lib\" libs=-ldl]] } { + return -1 +} + +if ![runto_main] { + return 0 +} + +# Trace the test function +# +gdb_test_no_output "record btrace" +gdb_test "next" + +# The memory containing the library call we traced is already gone. +# Trace decode used to run into a SEGV after corrupting the cleanup chain. +# +# The test passes if we don't crash GDB. +# +gdb_test "info record" -- 1.8.3.1