]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
selftests/landlock: Test signal scoping for threads
authorTahera Fahimi <fahimitahera@gmail.com>
Fri, 6 Sep 2024 21:30:05 +0000 (15:30 -0600)
committerMickaël Salaün <mic@digikod.net>
Mon, 16 Sep 2024 21:50:53 +0000 (23:50 +0200)
Expand the signal scoping tests with pthread_kill(3).  Test if a scoped
thread can send signal to a process in the same scoped domain, or a
non-sandboxed thread.

Signed-off-by: Tahera Fahimi <fahimitahera@gmail.com>
Link: https://lore.kernel.org/r/c15e9eafbb2da1210e46ba8db7b8907f5ea11009.1725657728.git.fahimitahera@gmail.com
[mic: Improve commit message]
Signed-off-by: Mickaël Salaün <mic@digikod.net>
tools/testing/selftests/landlock/scoped_signal_test.c

index 55d983e38fc517922503d7a383895b6b6eb92a02..4426b8a8b7184b8c4cef617d472eb904ddfc739d 100644 (file)
@@ -9,6 +9,7 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <linux/landlock.h>
+#include <pthread.h>
 #include <signal.h>
 #include <sys/prctl.h>
 #include <sys/types.h>
@@ -248,4 +249,52 @@ TEST_F(scoped_domains, check_access_signal)
                _metadata->exit_code = KSFT_FAIL;
 }
 
+static int thread_pipe[2];
+
+enum thread_return {
+       THREAD_INVALID = 0,
+       THREAD_SUCCESS = 1,
+       THREAD_ERROR = 2,
+};
+
+void *thread_func(void *arg)
+{
+       char buf;
+
+       if (read(thread_pipe[0], &buf, 1) != 1)
+               return (void *)THREAD_ERROR;
+
+       return (void *)THREAD_SUCCESS;
+}
+
+TEST(signal_scoping_threads)
+{
+       pthread_t no_sandbox_thread, scoped_thread;
+       enum thread_return ret = THREAD_INVALID;
+
+       drop_caps(_metadata);
+       ASSERT_EQ(0, pipe2(thread_pipe, O_CLOEXEC));
+
+       ASSERT_EQ(0,
+                 pthread_create(&no_sandbox_thread, NULL, thread_func, NULL));
+
+       /* Restricts the domain after creating the first thread. */
+       create_scoped_domain(_metadata, LANDLOCK_SCOPE_SIGNAL);
+
+       ASSERT_EQ(EPERM, pthread_kill(no_sandbox_thread, 0));
+       ASSERT_EQ(1, write(thread_pipe[1], ".", 1));
+
+       ASSERT_EQ(0, pthread_create(&scoped_thread, NULL, thread_func, NULL));
+       ASSERT_EQ(0, pthread_kill(scoped_thread, 0));
+       ASSERT_EQ(1, write(thread_pipe[1], ".", 1));
+
+       EXPECT_EQ(0, pthread_join(no_sandbox_thread, (void **)&ret));
+       EXPECT_EQ(THREAD_SUCCESS, ret);
+       EXPECT_EQ(0, pthread_join(scoped_thread, (void **)&ret));
+       EXPECT_EQ(THREAD_SUCCESS, ret);
+
+       EXPECT_EQ(0, close(thread_pipe[0]));
+       EXPECT_EQ(0, close(thread_pipe[1]));
+}
+
 TEST_HARNESS_MAIN