# Copyright 2007, 2008, 2009, 2010, 2011 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 <http://www.gnu.org/licenses/>.

# Test GDB's internal buffers safety for the GCORE command.

if $tracelevel then {
	strace $tracelevel
}


set testfile "gcore-buffer-overflow"
set srcfile  ${testfile}.c
# The ${binfile} basename needs to exceed 80 characters (`sizeof (psargs)')
# plus some additional data to overwrite the stack frame.
set pattern  01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
set binfile  ${objdir}/${subdir}/${testfile}-${pattern}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     untested ${testfile}.exp
     return -1
}

# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

# Does this gdb support gcore?
gdb_test_multiple "help gcore" "help gcore" {
    -re "Undefined command: .gcore.*$gdb_prompt $" {
	# gcore command not supported -- nothing to test here.
	unsupported "gdb does not support gcore on this target"
	return -1;
    }
    -re "Save a core file .*$gdb_prompt $" {
	pass "help gcore"
    }
}

gdb_test_no_output "set args ${pattern}"	\
    "Set buffer exceeding arguments"

if { ! [ runto_main ] } then {
    untested gcore-buffer-overflow.exp
    return -1
}

set escapedfilename [string_to_regexp ${objdir}/${subdir}/gcore-buffer-overflow.test]

set test "save a corefile"
gdb_test_multiple "gcore ${objdir}/${subdir}/gcore-buffer-overflow.test" $test {
    -re "Saved corefile ${escapedfilename}\[\r\n\]+$gdb_prompt $" {
	pass $test
    }
    -re "Can't create a corefile\[\r\n\]+$gdb_prompt $" {
	unsupported $test
    }
    eof {
	fail $test
    }
}
