Files
binutils-gdb/gdb/testsuite/gdb.server/twice-connect.exp
Tom de Vries 8e94bb3e3a [gdb] Fix heap-buffer-overflow in find_program_interpreter
With the test-case included in this patch, we run into:
...
(gdb) target remote localhost:2347^M
`target:twice-connect' has disappeared; keeping its symbols.^M
Remote debugging using localhost:2347^M
warning: Unable to find dynamic linker breakpoint function.^M
GDB will be unable to debug shared library initializers^M
and track explicitly loaded dynamic code.^M
Reading /usr/lib/debug/.build-id/$hex/$hex.debug from remote target...^M
0x00007ffff7dd4550 in ?? ()^M
(gdb) PASS: gdb.server/twice-connect.exp: session=second: gdbserver started
FAIL: gdb.server/twice-connect.exp: found interpreter
...

The problem originates in find_program_interpreter, where
bfd_get_section_contents is called to read .interp, but fails.  The function
returns false but the result is ignored, so find_program_interpreter returns
some random string.

Fix this by checking the result of the call to bfd_get_section_contents.

Tested on x86_64-linux.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29652
2022-10-14 21:22:57 +02:00

47 lines
1.6 KiB
Plaintext

# This testcase is part of GDB, the GNU debugger.
# Copyright 2022 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/>.
load_lib gdbserver-support.exp
standard_testfile
if { [skip_gdbserver_tests] } {
return 0
}
if { [build_executable "failed to prepare" $::testfile $::srcfile \
{debug}] } {
return -1
}
# Don't use $binfile arg, to make sure we use the remote file target:$binfile.
clean_restart
# Start gdbserver, and connect to it, twice.
foreach_with_prefix session {first second} {
lassign [gdbserver_start "" "$binfile"] unused gdbserver_address
gdb_test "disconnect"
set res [gdb_target_cmd "remote" $gdbserver_address]
gdb_assert { $res == 0 } "gdbserver started"
}
# Verify that we're not running into this warning, which triggers if
# find_program_interpreter returns something invalid.
set warning "warning: Unable to find dynamic linker breakpoint function"
gdb_assert { [regexp $warning $gdb_target_remote_cmd_msg] == 0 } \
"found interpreter"