tests: enhance test coverage of printpath and umovestr

* tests/init.sh (TIMEOUT_DURATION): Raise from 300 to 600.
* tests/printpath-umovestr.c: New file.
* tests/printpath-umovestr-peekdata.c: Likewise.
* tests/printpath-umovestr-undumpable.c: Likewise.
* tests/printpath-umovestr-legacy.test: New test.
* tests/Makefile.am (MISC_TESTS): Add printpath-umovestr-legacy.test.
* tests/gen_tests.in (printpath-umovestr, printpath-umovestr-peekdata,
printpath-umovestr-undumpable): New entries.
* tests/pure_executables.list: Add printpath-umovestr,
printpath-umovestr-peekdata, and printpath-umovestr-undumpable.
* tests/.gitignore: Likewise.
This commit is contained in:
Дмитрий Левин 2017-08-01 20:59:48 +00:00
parent 7a9eea94ee
commit 336691583e
9 changed files with 226 additions and 1 deletions

3
tests/.gitignore vendored
View File

@ -260,6 +260,9 @@ preadv
preadv-pwritev
preadv2-pwritev2
print_maxfd
printpath-umovestr
printpath-umovestr-peekdata
printpath-umovestr-undumpable
printstr
prlimit64
process_vm_readv

View File

@ -257,6 +257,7 @@ MISC_TESTS = \
opipe.test \
options-syntax.test \
pc.test \
printpath-umovestr-legacy.test \
qual_fault-syntax.test \
qual_fault.test \
qual_inject-error-signal.test \

View File

@ -227,6 +227,9 @@ preadv -a21
preadv-pwritev -a19 -eread=0 -ewrite=1 -e trace=preadv,pwritev
preadv2-pwritev2 -a22 -eread=0 -ewrite=1 -e trace=preadv2,pwritev2
printstr -e trace=writev
printpath-umovestr -a11 -e signal=none -e trace=chdir
printpath-umovestr-peekdata -a11 -e signal=none -e trace=chdir
printpath-umovestr-undumpable -a11 -e signal=none -e trace=chdir
prlimit64
process_vm_readv -s5 -a37
process_vm_writev -s5 -a38

View File

@ -368,7 +368,7 @@ else
STRACE=../strace
fi
: "${TIMEOUT_DURATION:=300}"
: "${TIMEOUT_DURATION:=600}"
: "${SLEEP_A_BIT:=sleep 1}"
[ -z "${VERBOSE-}" ] ||

View File

@ -0,0 +1,52 @@
#!/bin/sh
#
# Force legacy printpath/umovestr using process_vm_readv fault injection.
#
# Copyright (c) 2017 Dmitry V. Levin <ldv@altlinux.org>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. The name of the author may not be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
. "${srcdir=.}/scno_tampering.sh"
> "$LOG" || fail_ "failed to write $LOG"
fault_args='-qq -esignal=none -etrace=process_vm_readv -efault=process_vm_readv'
args='../printpath-umovestr-peekdata'
$STRACE -o "$LOG" $fault_args $args > /dev/null || {
rc=$?
if [ $rc -eq 77 ]; then
skip_ "$fault_args $args exited with code 77"
else
fail_ "$fault_args $args failed with code $rc"
fi
}
> "$LOG" || fail_ "failed to write $LOG"
args="-a11 -e signal=none -e trace=chdir $args skip-process_vm_readv-check"
$STRACE -o /dev/null $fault_args \
$STRACE -o "$LOG" $args > "$EXP" ||
dump_log_and_fail_with "$STRACE $args failed with code $?"
match_diff "$LOG" "$EXP"

View File

@ -0,0 +1,47 @@
/*
* Test PTRACE_PEEKDATA-based printpath/umovestr.
*
* Copyright (c) 2017 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "tests.h"
#include "test_ucopy.h"
#include <stdio.h>
int
main(int ac, char **av)
{
if (ac < 2 && test_process_vm_readv())
error_msg_and_skip("process_vm_readv is available");
if (!test_ptrace_peekdata())
perror_msg_and_skip("PTRACE_PEEKDATA");
test_printpath(sizeof(long) * 4);
puts("+++ exited with 0 +++");
return 0;
}

View File

@ -0,0 +1,71 @@
/*
* Force legacy printpath/umovestr using PR_SET_DUMPABLE.
*
* Copyright (c) 2017 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "tests.h"
#ifdef HAVE_PRCTL
# include <sys/prctl.h>
#endif
#if defined HAVE_PRCTL && defined PR_SET_DUMPABLE
# include <stdio.h>
# include <unistd.h>
# include "test_ucopy.h"
int
main(void)
{
if (!test_process_vm_readv())
perror_msg_and_skip("process_vm_readv");
/*
* Clearing dumpable flag disallows process_vm_readv.
* If the kernel does not contain commit
* 84d77d3f06e7e8dea057d10e8ec77ad71f721be3, then
* PTRACE_PEEKDATA remains allowed.
*/
if (prctl(PR_SET_DUMPABLE, 0))
perror_msg_and_skip("PR_SET_DUMPABLE 0");
if (!test_ptrace_peekdata())
perror_msg_and_skip("PTRACE_PEEKDATA");
test_printpath(sizeof(long) * 4);
puts("+++ exited with 0 +++");
return 0;
}
#else
SKIP_MAIN_UNDEFINED("HAVE_PRCTL && PR_SET_DUMPABLE")
#endif

View File

@ -0,0 +1,45 @@
/*
* Test regular printpath/umovestr.
*
* Copyright (c) 2017 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "tests.h"
#include "test_ucopy.h"
#include <stdio.h>
#include <sys/param.h>
int
main(void)
{
if (!test_process_vm_readv())
perror_msg_and_skip("process_vm_readv");
test_printpath(PATH_MAX);
puts("+++ exited with 0 +++");
return 0;
}

View File

@ -217,6 +217,9 @@ pread64-pwrite64
preadv
preadv-pwritev
preadv2-pwritev2
printpath-umovestr
printpath-umovestr-peekdata
printpath-umovestr-undumpable
printstr
prlimit64
process_vm_readv