# Copyright 2007, 2008, 2009 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

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

if $tracelevel then {
	strace $tracelevel
}

set prms_id 0
set bug_id 0

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 gcore.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?
send_gdb "help gcore\n"
gdb_expect {
    -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"
    }
    -re ".*$gdb_prompt $" {
	fail "help gcore"
    }
    timeout {
	fail "help gcore (timeout)"
    }
}

gdb_test "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
    }
}
