Merge tag 'linux-kselftest-5.1-rc1' of git://git.kernel.org/pub/scm/linux/kernel...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 9 Mar 2019 17:19:31 +0000 (09:19 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 9 Mar 2019 17:19:31 +0000 (09:19 -0800)
Pull kselftest update fromShuah Khan:

 - ir test compile warnings fixes

 - seccomp test fixes and improvements from Tycho Andersen and Kees Cook

 - ftrace fixes to non-POSIX-compliant constructs in colored output code
   and handling absence of tput from Juerg Haefliger

* tag 'linux-kselftest-5.1-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest:
  selftests/ftrace: Handle the absence of tput
  selftests/ftrace: Replace \e with \033
  selftests/ftrace: Replace echo -e with printf
  selftests: ir: skip when non-root user runs the test
  selftests: ir: skip when lirc device doesn't exist.
  selftests: ir: fix warning: "%s" directive output may be truncated ’ directive output may be truncated
  selftests/seccomp: Actually sleep for 1/10th second
  selftests/harness: Update named initializer syntax
  selftests: unshare userns in seccomp pidns testcases
  selftests: set NO_NEW_PRIVS bit in seccomp user tests
  selftests: skip seccomp get_metadata test if not real root
  selftest: include stdio.h in kselftest.h
  selftests: fix typo in seccomp_bpf.c
  selftests: don't kill child immediately in get_metadata() test

tools/testing/selftests/ftrace/ftracetest
tools/testing/selftests/ir/ir_loopback.c
tools/testing/selftests/ir/ir_loopback.sh
tools/testing/selftests/kselftest.h
tools/testing/selftests/kselftest_harness.h
tools/testing/selftests/seccomp/seccomp_bpf.c

index 75244db7033109adc43f27dbc2fc61d567421d76..136387422b00a68dc5764071ec661ac519c47a40 100755 (executable)
@@ -154,17 +154,17 @@ fi
 
 # Define text colors
 # Check available colors on the terminal, if any
-ncolors=`tput colors 2>/dev/null`
+ncolors=`tput colors 2>/dev/null || echo 0`
 color_reset=
 color_red=
 color_green=
 color_blue=
 # If stdout exists and number of colors is eight or more, use them
-if [ -t 1 -a "$ncolors" -a "$ncolors" -ge 8 ]; then
-  color_reset="\e[0m"
-  color_red="\e[31m"
-  color_green="\e[32m"
-  color_blue="\e[34m"
+if [ -t 1 -a "$ncolors" -ge 8 ]; then
+  color_reset="\033[0m"
+  color_red="\033[31m"
+  color_green="\033[32m"
+  color_blue="\033[34m"
 fi
 
 strip_esc() {
@@ -173,8 +173,13 @@ strip_esc() {
 }
 
 prlog() { # messages
-  echo -e "$@"
-  [ "$LOG_FILE" ] && echo -e "$@" | strip_esc >> $LOG_FILE
+  newline="\n"
+  if [ "$1" = "-n" ] ; then
+    newline=
+    shift
+  fi
+  printf "$*$newline"
+  [ "$LOG_FILE" ] && printf "$*$newline" | strip_esc >> $LOG_FILE
 }
 catlog() { #file
   cat $1
index 858c19caf224f0c9089239e4905a44a49073c9f6..ff351bb7c163d8eff9b0ed1b8cff16f3e544d17b 100644 (file)
@@ -27,6 +27,8 @@
 
 #define TEST_SCANCODES 10
 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
+#define SYSFS_PATH_MAX 256
+#define DNAME_PATH_MAX 256
 
 static const struct {
        enum rc_proto proto;
@@ -56,7 +58,7 @@ static const struct {
 int lirc_open(const char *rc)
 {
        struct dirent *dent;
-       char buf[100];
+       char buf[SYSFS_PATH_MAX + DNAME_PATH_MAX];
        DIR *d;
        int fd;
 
@@ -74,7 +76,7 @@ int lirc_open(const char *rc)
        }
 
        if (!dent)
-               ksft_exit_fail_msg("cannot find lirc device for %s\n", rc);
+               ksft_exit_skip("cannot find lirc device for %s\n", rc);
 
        closedir(d);
 
index 0a0b8dfa39be6d9af9abbde2effba3d93f9016fe..b90dc9939f45d24f8c2a810941c2226f0f2997dc 100755 (executable)
@@ -4,6 +4,11 @@
 # Kselftest framework requirement - SKIP code is 4.
 ksft_skip=4
 
+if [ $UID != 0 ]; then
+       echo "Please run ir_loopback test as root [SKIP]"
+       exit $ksft_skip
+fi
+
 if ! /sbin/modprobe -q -n rc-loopback; then
         echo "ir_loopback: module rc-loopback is not found [SKIP]"
         exit $ksft_skip
index a3edb2c8e43d0a83950d8b4535756ea0ec82eb8a..47e1d995c1822903499e6597bc863f3b41402e6a 100644 (file)
@@ -13,6 +13,7 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <stdarg.h>
+#include <stdio.h>
 
 /* define kselftest exit codes */
 #define KSFT_PASS  0
index 76d654ef3234a4cab8b34427d6436a25b7066055..2d90c98eeb676e3411104e68f4b51a6b786d8392 100644 (file)
 #define __TEST_IMPL(test_name, _signal) \
        static void test_name(struct __test_metadata *_metadata); \
        static struct __test_metadata _##test_name##_object = \
-               { name: "global." #test_name, \
-                 fn: &test_name, termsig: _signal }; \
+               { .name = "global." #test_name, \
+                 .fn = &test_name, .termsig = _signal }; \
        static void __attribute__((constructor)) _register_##test_name(void) \
        { \
                __register_test(&_##test_name##_object); \
        } \
        static struct __test_metadata \
                      _##fixture_name##_##test_name##_object = { \
-               name: #fixture_name "." #test_name, \
-               fn: &wrapper_##fixture_name##_##test_name, \
-               termsig: signal, \
+               .name = #fixture_name "." #test_name, \
+               .fn = &wrapper_##fixture_name##_##test_name, \
+               .termsig = signal, \
         }; \
        static void __attribute__((constructor)) \
                        _register_##fixture_name##_##test_name(void) \
index 7e632b465ab48eea860ab32e2a2cb9b2ea1d0a4f..f69d2ee29742808600d406c47f283d743b0aa7c8 100644 (file)
@@ -2611,6 +2611,7 @@ TEST_F(TSYNC, two_siblings_not_under_filter)
 {
        long ret, sib;
        void *status;
+       struct timespec delay = { .tv_nsec = 100000000 };
 
        ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
                TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
@@ -2664,7 +2665,7 @@ TEST_F(TSYNC, two_siblings_not_under_filter)
        EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status);
        /* Poll for actual task death. pthread_join doesn't guarantee it. */
        while (!kill(self->sibling[sib].system_tid, 0))
-               sleep(0.1);
+               nanosleep(&delay, NULL);
        /* Switch to the remaining sibling */
        sib = !sib;
 
@@ -2689,7 +2690,7 @@ TEST_F(TSYNC, two_siblings_not_under_filter)
        EXPECT_EQ(0, (long)status);
        /* Poll for actual task death. pthread_join doesn't guarantee it. */
        while (!kill(self->sibling[sib].system_tid, 0))
-               sleep(0.1);
+               nanosleep(&delay, NULL);
 
        ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC,
                      &self->apply_prog);
@@ -2971,6 +2972,12 @@ TEST(get_metadata)
        struct seccomp_metadata md;
        long ret;
 
+       /* Only real root can get metadata. */
+       if (geteuid()) {
+               XFAIL(return, "get_metadata requires real root");
+               return;
+       }
+
        ASSERT_EQ(0, pipe(pipefd));
 
        pid = fork();
@@ -2985,11 +2992,11 @@ TEST(get_metadata)
                };
 
                /* one with log, one without */
-               ASSERT_EQ(0, seccomp(SECCOMP_SET_MODE_FILTER,
+               EXPECT_EQ(0, seccomp(SECCOMP_SET_MODE_FILTER,
                                     SECCOMP_FILTER_FLAG_LOG, &prog));
-               ASSERT_EQ(0, seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog));
+               EXPECT_EQ(0, seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog));
 
-               ASSERT_EQ(0, close(pipefd[0]));
+               EXPECT_EQ(0, close(pipefd[0]));
                ASSERT_EQ(1, write(pipefd[1], "1", 1));
                ASSERT_EQ(0, close(pipefd[1]));
 
@@ -3062,6 +3069,11 @@ TEST(user_notification_basic)
                .filter = filter,
        };
 
+       ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+       ASSERT_EQ(0, ret) {
+               TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
+       }
+
        pid = fork();
        ASSERT_GE(pid, 0);
 
@@ -3077,7 +3089,7 @@ TEST(user_notification_basic)
        EXPECT_EQ(true, WIFEXITED(status));
        EXPECT_EQ(0, WEXITSTATUS(status));
 
-       /* Add some no-op filters so for grins. */
+       /* Add some no-op filters for grins. */
        EXPECT_EQ(seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog), 0);
        EXPECT_EQ(seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog), 0);
        EXPECT_EQ(seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog), 0);
@@ -3143,6 +3155,11 @@ TEST(user_notification_kill_in_middle)
        struct seccomp_notif req = {};
        struct seccomp_notif_resp resp = {};
 
+       ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+       ASSERT_EQ(0, ret) {
+               TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
+       }
+
        listener = user_trap_syscall(__NR_getpid,
                                     SECCOMP_FILTER_FLAG_NEW_LISTENER);
        ASSERT_GE(listener, 0);
@@ -3190,6 +3207,11 @@ TEST(user_notification_signal)
        struct seccomp_notif_resp resp = {};
        char c;
 
+       ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+       ASSERT_EQ(0, ret) {
+               TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
+       }
+
        ASSERT_EQ(socketpair(PF_LOCAL, SOCK_SEQPACKET, 0, sk_pair), 0);
 
        listener = user_trap_syscall(__NR_gettid,
@@ -3255,6 +3277,11 @@ TEST(user_notification_closed_listener)
        long ret;
        int status, listener;
 
+       ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+       ASSERT_EQ(0, ret) {
+               TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
+       }
+
        listener = user_trap_syscall(__NR_getpid,
                                     SECCOMP_FILTER_FLAG_NEW_LISTENER);
        ASSERT_GE(listener, 0);
@@ -3287,7 +3314,7 @@ TEST(user_notification_child_pid_ns)
        struct seccomp_notif req = {};
        struct seccomp_notif_resp resp = {};
 
-       ASSERT_EQ(unshare(CLONE_NEWPID), 0);
+       ASSERT_EQ(unshare(CLONE_NEWUSER | CLONE_NEWPID), 0);
 
        listener = user_trap_syscall(__NR_getpid, SECCOMP_FILTER_FLAG_NEW_LISTENER);
        ASSERT_GE(listener, 0);
@@ -3324,6 +3351,10 @@ TEST(user_notification_sibling_pid_ns)
        struct seccomp_notif req = {};
        struct seccomp_notif_resp resp = {};
 
+       ASSERT_EQ(prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0), 0) {
+               TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
+       }
+
        listener = user_trap_syscall(__NR_getpid, SECCOMP_FILTER_FLAG_NEW_LISTENER);
        ASSERT_GE(listener, 0);
 
@@ -3386,6 +3417,8 @@ TEST(user_notification_fault_recv)
        struct seccomp_notif req = {};
        struct seccomp_notif_resp resp = {};
 
+       ASSERT_EQ(unshare(CLONE_NEWUSER), 0);
+
        listener = user_trap_syscall(__NR_getpid, SECCOMP_FILTER_FLAG_NEW_LISTENER);
        ASSERT_GE(listener, 0);