diff --git a/Tests/Kernel/CMakeLists.txt b/Tests/Kernel/CMakeLists.txt index 4dcb151d2d3..61d9e5bd0e1 100644 --- a/Tests/Kernel/CMakeLists.txt +++ b/Tests/Kernel/CMakeLists.txt @@ -50,6 +50,7 @@ set(LIBTEST_BASED_SOURCES TestPosixFallocate.cpp TestPosixSpawn.cpp TestPrivateInodeVMObject.cpp + TestPtrace.cpp TestKernelAlarm.cpp TestKernelFilePermissions.cpp TestKernelPledge.cpp diff --git a/Tests/Kernel/TestPtrace.cpp b/Tests/Kernel/TestPtrace.cpp new file mode 100644 index 00000000000..dabed269ff9 --- /dev/null +++ b/Tests/Kernel/TestPtrace.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2026, the SerenityOS developers. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include +#include +#include +#include + +static Atomic s_exit_thread = false; + +static void* thread_entry(void*) +{ + while (!s_exit_thread) + continue; + + return nullptr; +} + +TEST_CASE(ptrace_self_attach_fail) +{ + pthread_t thread = 0; + VERIFY(pthread_create(&thread, nullptr, thread_entry, nullptr) == 0); + VERIFY(thread > 0); + + int ptrace_return = ptrace(PT_ATTACH, thread, 0, 0); + int error = errno; + EXPECT_EQ(ptrace_return, -1); + EXPECT_EQ(error, EPERM); + + s_exit_thread = true; + VERIFY(pthread_join(thread, nullptr) == 0); +}