From 9e7f3bbbbf5a13e879a4cc3cfa958412ffac0d9d Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Tue, 3 Jul 2018 17:08:42 +0200 Subject: [PATCH] [gdb/breakpoints] Fix sigsegv in info prog at exec catchpoint With the test-case contained in this patch and compiled for debug we run into a segfault with trunk gdb: ... $ gdb catch-follow-exec -batch -ex "catch exec" \ -ex "set follow-exec-mode new" -ex "run" -ex "info prog" Catchpoint 1 (exec) process xxx is executing new program: /usr/bin/ls [New inferior 2 (process 0)] [New process xxx] Thread 2.1 "ls" hit Catchpoint 1 (exec'd /usr/bin/ls), in _start () from /lib64/ld-linux-x86-64.so.2 Segmentation fault (core dumped) ... The patch fixes the segfault by returning an error in info_program_command if get_last_target_status returns minus_one_ptid. The test-case is non-standard, because the standard approach runs into PR23368, a problem with gdb going to the background. Build and reg-tested on x86_64-linux. 2018-07-26 Tom de Vries PR breakpoints/23366 * infcmd.c (info_program_command): Handle ptid == minus_one_ptid. * gdb.base/catch-follow-exec.c: New test. * gdb.base/catch-follow-exec.exp: New file. --- gdb/ChangeLog | 5 +++ gdb/infcmd.c | 2 +- gdb/testsuite/ChangeLog | 6 +++ gdb/testsuite/gdb.base/catch-follow-exec.c | 10 +++++ gdb/testsuite/gdb.base/catch-follow-exec.exp | 58 ++++++++++++++++++++++++++++ 5 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 gdb/testsuite/gdb.base/catch-follow-exec.c create mode 100644 gdb/testsuite/gdb.base/catch-follow-exec.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ee5c9ea..605aeef 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,10 @@ 2018-07-26 Tom de Vries + PR breakpoints/23366 + * infcmd.c (info_program_command): Handle ptid == minus_one_ptid. + +2018-07-26 Tom de Vries + * dwarf2read.c (read_subrange_type): Warn if DW_AT_upper_bound or DW_AT_count can't be translated to a dynamic prop. diff --git a/gdb/infcmd.c b/gdb/infcmd.c index 821bcc6..74d5956 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -2091,7 +2091,7 @@ info_program_command (const char *args, int from_tty) get_last_target_status (&ptid, &ws); } - if (ptid == null_ptid) + if (ptid == null_ptid || ptid == minus_one_ptid) error (_("No selected thread.")); thread_info *tp = find_thread_ptid (ptid); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index ab50f70..aa8b06a 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-07-26 Tom de Vries + + PR breakpoints/23366 + * gdb.base/catch-follow-exec.c: New test. + * gdb.base/catch-follow-exec.exp: New file. + 2018-07-25 Tom de Vries * gdb.base/vla-optimized-out-o3.exp: New file. Reuse diff --git a/gdb/testsuite/gdb.base/catch-follow-exec.c b/gdb/testsuite/gdb.base/catch-follow-exec.c new file mode 100644 index 0000000..fa68a2a --- /dev/null +++ b/gdb/testsuite/gdb.base/catch-follow-exec.c @@ -0,0 +1,10 @@ +#include +#include +#include + +int +main (void) +{ + char *exec_args[] = { "/bin/ls", "ppp", NULL }; + execve (exec_args[0], exec_args, NULL); +} diff --git a/gdb/testsuite/gdb.base/catch-follow-exec.exp b/gdb/testsuite/gdb.base/catch-follow-exec.exp new file mode 100644 index 0000000..0e32ed4 --- /dev/null +++ b/gdb/testsuite/gdb.base/catch-follow-exec.exp @@ -0,0 +1,58 @@ +# 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 . + +# Check whether finish respects the print pretty user setting when printing the +# function result. + +standard_testfile + +if {[build_executable "failed to prepare" $testfile $srcfile debug] == -1} { + return -1 +} + +if { ![remote_file target exists /bin/bash] } { + unsupported "no bash" + return +} + +if { ![remote_file target exists /bin/ls] } { + unsupported "no ls" + return +} + +proc catch_follow_exec { } { + global binfile + global GDB + + set test "catch-follow-exec" + + append FLAGS " \"$binfile\"" + append FLAGS " -batch" + append FLAGS " -ex \"catch exec\"" + append FLAGS " -ex \"set follow-exec-mode new\"" + append FLAGS " -ex \"run\"" + append FLAGS " -ex \"info prog\"" + + catch {exec /bin/bash -c "$GDB $FLAGS"} catchlog + send_log "$catchlog\n" + + if { [regexp {No selected thread} $catchlog] } { + pass $test + } else { + fail $test + } +} + +catch_follow_exec -- 2.7.4