1 #!/bin/sh 2 3 # Copyright (C) 2017 Red Hat, Inc. 4 # 5 # This program is free software; you can redistribute it and#or modify 6 # it under the terms of the GNU General Public License as published by 7 # the Free Software Foundation; either version 2 of the License, or 8 # (at your option) any later version. 9 # 10 # This program is distributed in the hope that it will be useful, but 11 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 12 # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 13 # for more details. 14 # 15 # You should have received a copy of the GNU General Public License 16 # along with this program; if not, see <http://www.gnu.org/licenses/>. 17 18 # Test description: [regression] Check if the vsyscall and vdso VMA regions are 19 # reported correctly. 20 # 21 # While [vsyscall] is mostly deprecated with newer systems, there is 22 # still plenty of kernels compiled with CONFIG_LEGACY_VSYSCALL_NATIVE and 23 # CONFIG_LEGACY_VSYSCALL_EMULATE (see linux/arch/x86/Kconfig for option 24 # descriptions). First part of the test will check eligible kernels for 25 # regression for a bug fixed by commit 103efcd9aac1 (fix perms/range of 26 # vsyscall vma in /proc/*/maps). 27 # 28 # Second part of test checks [vdso] VMA permissions (fixed with commits 29 # b6558c4a2378 (fix [vdso] page permissions) and e5b97dde514f (Add 30 # VM_ALWAYSDUMP)). As a consequence of this bug, VMAs were not included 31 # in core dumps which resulted in eg. incomplete backtraces and invalid 32 # core dump files created by gdb. 33 34 # Usage 35 # ./vma05.sh 36 37 TST_SETUP=setup 38 TST_CLEANUP=cleanup 39 TST_TESTFUNC=vma_report_check 40 TST_NEEDS_ROOT=1 41 TST_NEEDS_TMPDIR=1 42 TST_NEEDS_CMDS="gdb" 43 44 . tst_test.sh 45 46 CORE_LIMIT=$(ulimit -c) 47 CORE_PATTERN=$(cat /proc/sys/kernel/core_pattern) 48 49 setup() 50 { 51 ulimit -c unlimited 52 echo "core" > /proc/sys/kernel/core_pattern 53 } 54 55 cleanup() 56 { 57 ulimit -c "$CORE_LIMIT" 58 echo "$CORE_PATTERN" > /proc/sys/kernel/core_pattern 59 } 60 61 vma_report_check() 62 { 63 if [ $(uname -m) = "x86_64" ]; then 64 if LINE=$(grep "vsyscall" /proc/self/maps); then 65 RIGHT="ffffffffff600000-ffffffffff601000[[:space:]]r-xp" 66 if echo "$LINE" | grep -q "$RIGHT"; then 67 tst_res TPASS "[vsyscall] reported correctly" 68 else 69 tst_res TFAIL "[vsyscall] reporting wrong" 70 fi 71 fi 72 fi 73 74 rm -rf core* 75 { vma05_vdso; } > /dev/null 2>&1 76 TRACE=$(gdb -silent -ex="thread apply all backtrace" -ex="quit"\ 77 vma05_vdso ./core* 2> /dev/null) 78 if echo "$TRACE" | grep -qF "??"; then 79 tst_res TFAIL "[vdso] bug not patched" 80 else 81 tst_res TPASS "[vdso] backtrace complete" 82 fi 83 } 84 85 tst_run 86