]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
selftests/landlock: Split signal_scoping_threads tests
authorMickaël Salaün <mic@digikod.net>
Tue, 18 Mar 2025 16:14:41 +0000 (17:14 +0100)
committerMickaël Salaün <mic@digikod.net>
Wed, 26 Mar 2025 12:59:32 +0000 (13:59 +0100)
Split signal_scoping_threads tests into signal_scoping_thread_before
and signal_scoping_thread_after.

Use local variables for thread synchronization.  Fix exported function.
Replace some asserts with expects.

Fixes: c8994965013e ("selftests/landlock: Test signal scoping for threads")
Cc: Günther Noack <gnoack@google.com>
Cc: Tahera Fahimi <fahimitahera@gmail.com>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/20250318161443.279194-7-mic@digikod.net
Signed-off-by: Mickaël Salaün <mic@digikod.net>
tools/testing/selftests/landlock/scoped_signal_test.c

index 767f117703b7e7df55344f8ac472a573404edd8a..d313cb6262259b8ed229baec46084f9565e5c655 100644 (file)
@@ -249,47 +249,66 @@ 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)
+static void *thread_sync(void *arg)
 {
+       const int pipe_read = *(int *)arg;
        char buf;
 
-       if (read(thread_pipe[0], &buf, 1) != 1)
+       if (read(pipe_read, &buf, 1) != 1)
                return (void *)THREAD_ERROR;
 
        return (void *)THREAD_SUCCESS;
 }
 
-TEST(signal_scoping_threads)
+TEST(signal_scoping_thread_before)
 {
-       pthread_t no_sandbox_thread, scoped_thread;
+       pthread_t no_sandbox_thread;
        enum thread_return ret = THREAD_INVALID;
+       int thread_pipe[2];
 
        drop_caps(_metadata);
        ASSERT_EQ(0, pipe2(thread_pipe, O_CLOEXEC));
 
-       ASSERT_EQ(0,
-                 pthread_create(&no_sandbox_thread, NULL, thread_func, NULL));
+       ASSERT_EQ(0, pthread_create(&no_sandbox_thread, NULL, thread_sync,
+                                   &thread_pipe[0]));
 
-       /* Restricts the domain after creating the first thread. */
+       /* Enforces restriction after creating the thread. */
        create_scoped_domain(_metadata, LANDLOCK_SCOPE_SIGNAL);
 
-       ASSERT_EQ(0, 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_kill(no_sandbox_thread, 0));
+       EXPECT_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, close(thread_pipe[0]));
+       EXPECT_EQ(0, close(thread_pipe[1]));
+}
+
+TEST(signal_scoping_thread_after)
+{
+       pthread_t scoped_thread;
+       enum thread_return ret = THREAD_INVALID;
+       int thread_pipe[2];
+
+       drop_caps(_metadata);
+       ASSERT_EQ(0, pipe2(thread_pipe, O_CLOEXEC));
+
+       /* Enforces restriction before creating the thread. */
+       create_scoped_domain(_metadata, LANDLOCK_SCOPE_SIGNAL);
+
+       ASSERT_EQ(0, pthread_create(&scoped_thread, NULL, thread_sync,
+                                   &thread_pipe[0]));
+
+       EXPECT_EQ(0, pthread_kill(scoped_thread, 0));
+       EXPECT_EQ(1, write(thread_pipe[1], ".", 1));
+
        EXPECT_EQ(0, pthread_join(scoped_thread, (void **)&ret));
        EXPECT_EQ(THREAD_SUCCESS, ret);