From 5bad3170301060ee0801a739ffc213abae664973 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Mon, 17 Oct 2016 16:47:36 -0400 Subject: [PATCH] Fix -trace-save crash when argument is missing -trace-save doesn't check whether an argument is passed, leading to a segfault if you pass nothing. I added a small test, which only tests the error conditions of -trace-save. gdb/ChangeLog: * mi/mi-main.c (mi_cmd_trace_save): Check if argument is present before using it. gdb/testsuite/ChangeLog: * gdb.trace/mi-trace-save.exp: New file. --- gdb/ChangeLog | 5 +++ gdb/mi/mi-main.c | 5 +++ gdb/testsuite/ChangeLog | 4 +++ gdb/testsuite/gdb.trace/mi-trace-save.exp | 42 +++++++++++++++++++++++ 4 files changed, 56 insertions(+) create mode 100644 gdb/testsuite/gdb.trace/mi-trace-save.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 4ebbf8d70f..4f706fdf6b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2016-10-17 Simon Marchi + + * mi/mi-main.c (mi_cmd_trace_save): Check if argument is present + before using it. + 2016-10-17 Pedro Alves * charset.h (class wchar_iterator) [PHONY_ICONV] : Use diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c index 7cd9706c57..81e82edcf9 100644 --- a/gdb/mi/mi-main.c +++ b/gdb/mi/mi-main.c @@ -2699,6 +2699,11 @@ mi_cmd_trace_save (char *command, char **argv, int argc) break; } } + + if (argc - oind != 1) + error (_("Exactly one argument required " + "(file in which to save trace data)")); + filename = argv[oind]; if (generate_ctf) diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index ac2d05dc05..f0c8415a94 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2016-10-17 Simon Marchi + + * gdb.trace/mi-trace-save.exp: New file. + 2016-10-13 Yao Qi * gdb.base/code_elim.exp (get_var_address): Remove. diff --git a/gdb/testsuite/gdb.trace/mi-trace-save.exp b/gdb/testsuite/gdb.trace/mi-trace-save.exp new file mode 100644 index 0000000000..96bb70dbce --- /dev/null +++ b/gdb/testsuite/gdb.trace/mi-trace-save.exp @@ -0,0 +1,42 @@ +# Copyright 2016 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 . + +# The -trace-save command is already tested in other files (e.g. +# mi-trace-frame-collected.exp), so this file currently only tests the error +# cases of -trace-save. + +load_lib mi-support.exp + +mi_gdb_start + +# Test without the required "filename" argument. + +proc test_trace_save_wrong_num_args { } { + set err_re [string_to_regexp "^error,msg=\"Exactly one argument required (file in which to save trace data)\""] + + mi_gdb_test "-trace-save" "$err_re" "-trace-save with missing argument" + mi_gdb_test "-trace-save a b" "$err_re" "-trace-save with missing argument" +} + +# Test with an unrecognized option. + +proc test_trace_save_wrong_opt { } { + set err_re [string_to_regexp "^error,msg=\"-trace-save: Unknown option ``hey''\""] + + mi_gdb_test "-trace-save -hey" "$err_re" "-trace-save with wrong option" +} + +test_trace_save_wrong_num_args +test_trace_save_wrong_opt -- 2.34.1