From 17d6efc44b4779a1a8a95645daf293a587ef3da9 Mon Sep 17 00:00:00 2001 From: Joel Brobecker Date: Mon, 26 Nov 2012 17:41:44 +0000 Subject: [PATCH] Do not crash when calling GDB with empty executable name. % gdb -q '' ... or ... % gdb -q (gdb) file '' ... both cause GDB to crash with an invalid free. This is because exec_file_attach is attempting to free a string that has not been allocated. The string is only allocated if openp is successful. But in the case of this obviously invalid filename, openp fails, and leaves scratch_pathname uninitialized, thus causing the xfree to fail. The fix is to enable the associated cleanup after we have verified that openp was successful. gdb/ChangeLog (By Keith Seitz ): * exec.c (exec_file_attach): Move cleanup after verifying that memory has in fact been allocated. gdb/testsuite/ChangeLog: * gdb.base/empty_exe.exp: New testcase. --- gdb/ChangeLog | 5 +++++ gdb/exec.c | 4 ++-- gdb/testsuite/ChangeLog | 4 ++++ gdb/testsuite/gdb.base/empty_exe.exp | 26 ++++++++++++++++++++++++++ 4 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 gdb/testsuite/gdb.base/empty_exe.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 41e7a30ed0..98afd334b9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2012-11-26 Keith Seitz + + * exec.c (exec_file_attach): Move cleanup after verifying that + memory has in fact been allocated. + 2012-11-26 Tom Tromey * ada-lang.c (user_select_syms): Use SYMBOL_SYMTAB. diff --git a/gdb/exec.c b/gdb/exec.c index 615d5c097e..21d3c3c4c5 100644 --- a/gdb/exec.c +++ b/gdb/exec.c @@ -225,11 +225,11 @@ exec_file_attach (char *filename, int from_tty) &scratch_pathname); } #endif + if (scratch_chan < 0) + perror_with_name (filename); cleanups = make_cleanup (xfree, scratch_pathname); - if (scratch_chan < 0) - perror_with_name (filename); if (write_files) exec_bfd = gdb_bfd_fopen (scratch_pathname, gnutarget, FOPEN_RUB, scratch_chan); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 907bec3660..b625a7b8c2 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2012-11-26 Joel Brobecker + + * gdb.base/empty_exe.exp: New testcase. + 2012-11-20 Mike Frysinger * gdb.base/completion.exp: Add test for help aliases completion. diff --git a/gdb/testsuite/gdb.base/empty_exe.exp b/gdb/testsuite/gdb.base/empty_exe.exp new file mode 100644 index 0000000000..7c555543f7 --- /dev/null +++ b/gdb/testsuite/gdb.base/empty_exe.exp @@ -0,0 +1,26 @@ +# Copyright 2012 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 . + +gdb_exit +gdb_start + +# Make sure that the "file" command rejects an empty filename, +# rather than crash. +gdb_test "file ''" \ + ": No such file or directory\\." + +# And to make extra sure that GDB is still alive, do a quick +# sanity check. +gdb_test "print 1" "= 1"