]> granicus.if.org Git - strace/commitdiff
tests: enhance test coverage of printpath and umovestr
authorDmitry V. Levin <ldv@altlinux.org>
Tue, 1 Aug 2017 20:59:48 +0000 (20:59 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Tue, 1 Aug 2017 20:59:48 +0000 (20:59 +0000)
* 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.

tests/.gitignore
tests/Makefile.am
tests/gen_tests.in
tests/init.sh
tests/printpath-umovestr-legacy.test [new file with mode: 0755]
tests/printpath-umovestr-peekdata.c [new file with mode: 0644]
tests/printpath-umovestr-undumpable.c [new file with mode: 0644]
tests/printpath-umovestr.c [new file with mode: 0644]
tests/pure_executables.list

index 31cbb70d4f2ce72ccc0f5c5461ac0a32a18e0e4b..9a3033eef288d99ba6b10fda64e73a1fbc483d03 100644 (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
index 28510747a6989bd158bcb249a47adc9296fb4674..60a6984445fc47e4e8d343bb06be70c338d5794a 100644 (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 \
index dc7e1b8ee57b113ca3b1a8bc8f90611f4dea48d4..79e60e2be90e5311bfc77e31129a067fd7b7821d 100644 (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
index be10d89a3baa70148c9a57304c99da2cac5b0295..06ff7a764835e0ade0e5cc932727098733ab3b00 100644 (file)
@@ -368,7 +368,7 @@ else
                STRACE=../strace
 fi
 
-: "${TIMEOUT_DURATION:=300}"
+: "${TIMEOUT_DURATION:=600}"
 : "${SLEEP_A_BIT:=sleep 1}"
 
 [ -z "${VERBOSE-}" ] ||
diff --git a/tests/printpath-umovestr-legacy.test b/tests/printpath-umovestr-legacy.test
new file mode 100755 (executable)
index 0000000..15f57ed
--- /dev/null
@@ -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"
diff --git a/tests/printpath-umovestr-peekdata.c b/tests/printpath-umovestr-peekdata.c
new file mode 100644 (file)
index 0000000..82f1035
--- /dev/null
@@ -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;
+}
diff --git a/tests/printpath-umovestr-undumpable.c b/tests/printpath-umovestr-undumpable.c
new file mode 100644 (file)
index 0000000..fba8f24
--- /dev/null
@@ -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
diff --git a/tests/printpath-umovestr.c b/tests/printpath-umovestr.c
new file mode 100644 (file)
index 0000000..a7251e5
--- /dev/null
@@ -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;
+}
index fa7614717363be7b6eed24e9348fd6db25656ed7..5b8c0d12b9183053c469376f8d1c86d19ee1ccc1 100755 (executable)
@@ -217,6 +217,9 @@ pread64-pwrite64
 preadv
 preadv-pwritev
 preadv2-pwritev2
+printpath-umovestr
+printpath-umovestr-peekdata
+printpath-umovestr-undumpable
 printstr
 prlimit64
 process_vm_readv