#!/bin/sh
# Copyright (C) 2017 Red Hat, 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, see <http://www.gnu.org/licenses/>.
# Test description: [regression] Check if the vsyscall and vdso VMA regions are
# reported correctly.
#
# While [vsyscall] is mostly deprecated with newer systems, there is
# still plenty of kernels compiled with CONFIG_LEGACY_VSYSCALL_NATIVE and
# CONFIG_LEGACY_VSYSCALL_EMULATE (see linux/arch/x86/Kconfig for option
# descriptions). First part of the test will check eligible kernels for
# regression for a bug fixed by commit 103efcd9aac1 (fix perms/range of
# vsyscall vma in /proc/*/maps).
#
# Second part of test checks [vdso] VMA permissions (fixed with commits
# b6558c4a2378 (fix [vdso] page permissions) and e5b97dde514f (Add
# VM_ALWAYSDUMP)). As a consequence of this bug, VMAs were not included
# in core dumps which resulted in eg. incomplete backtraces and invalid
# core dump files created by gdb.
# Usage
# ./vma05.sh
TST_SETUP=setup
TST_CLEANUP=cleanup
TST_TESTFUNC=vma_report_check
TST_NEEDS_ROOT=1
TST_NEEDS_TMPDIR=1
TST_NEEDS_CMDS="gdb"
. tst_test.sh
CORE_LIMIT=$(ulimit -c)
CORE_PATTERN=$(cat /proc/sys/kernel/core_pattern)
setup()
{
ulimit -c unlimited
echo "core" > /proc/sys/kernel/core_pattern
}
cleanup()
{
ulimit -c "$CORE_LIMIT"
echo "$CORE_PATTERN" > /proc/sys/kernel/core_pattern
}
vma_report_check()
{
if [ $(uname -m) = "x86_64" ]; then
if LINE=$(grep "vsyscall" /proc/self/maps); then
RIGHT="ffffffffff600000-ffffffffff601000[[:space:]]r-xp"
if echo "$LINE" | grep -q "$RIGHT"; then
tst_res TPASS "[vsyscall] reported correctly"
else
tst_res TFAIL "[vsyscall] reporting wrong"
fi
fi
fi
rm -rf core*
{ vma05_vdso; } > /dev/null 2>&1
TRACE=$(gdb -silent -ex="thread apply all backtrace" -ex="quit"\
vma05_vdso ./core* 2> /dev/null)
if echo "$TRACE" | grep -qF "??"; then
tst_res TFAIL "[vdso] bug not patched"
else
tst_res TPASS "[vdso] backtrace complete"
fi
}
tst_run