diff options
author | OverMighty <its.overmighty@gmail.com> | 2024-06-20 03:16:02 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-19 20:16:02 -0500 |
commit | 57778ec36c9c7e96b76a167f19dccbe00d49c9d4 (patch) | |
tree | 7a9847a2b9e124b42eb4e0c2f675611196fc9c6c /libc/test | |
parent | f8f4235612b9668bbcbb6a58634fcb756794045e (diff) | |
download | llvm-57778ec36c9c7e96b76a167f19dccbe00d49c9d4.zip llvm-57778ec36c9c7e96b76a167f19dccbe00d49c9d4.tar.gz llvm-57778ec36c9c7e96b76a167f19dccbe00d49c9d4.tar.bz2 |
[libc] Fix scheduler test incorrectly guessing user privileges (#95562)
Non-root users may be able to set real-time scheduling policies. Don't
expect failure to set real-time scheduling policies based on UID.
Instead, check that if it fails, it is either due to missing privileges,
or unsupported parameters if the scheduling policy is not mandated by
POSIX.
Fixes #95564.
Diffstat (limited to 'libc/test')
-rw-r--r-- | libc/test/src/sched/param_and_scheduler_test.cpp | 48 |
1 files changed, 27 insertions, 21 deletions
diff --git a/libc/test/src/sched/param_and_scheduler_test.cpp b/libc/test/src/sched/param_and_scheduler_test.cpp index 8e81f2e..747c7e34 100644 --- a/libc/test/src/sched/param_and_scheduler_test.cpp +++ b/libc/test/src/sched/param_and_scheduler_test.cpp @@ -36,7 +36,7 @@ class SchedTest : public LIBC_NAMESPACE::testing::Test { public: - void testSched(int policy, bool can_set) { + void testSched(int policy, bool is_mandatory) { LIBC_NAMESPACE::libc_errno = 0; int init_policy = LIBC_NAMESPACE::sched_getscheduler(0); @@ -74,24 +74,26 @@ public: param.sched_priority = max_priority + 1; ASSERT_EQ(LIBC_NAMESPACE::sched_setscheduler(0, policy, ¶m), -1); - // A bit hard to test as depending if we are root or not we can run into + // A bit hard to test as depending on user privileges we can run into // different issues. ASSERT_TRUE(LIBC_NAMESPACE::libc_errno == EINVAL || LIBC_NAMESPACE::libc_errno == EPERM); LIBC_NAMESPACE::libc_errno = 0; - // Some sched policies require permissions, so skip param.sched_priority = min_priority; - // Success / missing permissions. - ASSERT_EQ(LIBC_NAMESPACE::sched_setscheduler(0, policy, ¶m), - can_set ? 0 : -1); - ASSERT_TRUE(can_set ? (LIBC_NAMESPACE::libc_errno == 0) - : (LIBC_NAMESPACE::libc_errno == EINVAL || - LIBC_NAMESPACE::libc_errno == EPERM)); + // Success/unsupported policy/missing permissions. + int setscheduler_result = + LIBC_NAMESPACE::sched_setscheduler(0, policy, ¶m); + ASSERT_TRUE(setscheduler_result == 0 || setscheduler_result == -1); + ASSERT_TRUE( + setscheduler_result != -1 + ? (LIBC_NAMESPACE::libc_errno == 0) + : ((!is_mandatory && LIBC_NAMESPACE::libc_errno == EINVAL) || + LIBC_NAMESPACE::libc_errno == EPERM)); LIBC_NAMESPACE::libc_errno = 0; ASSERT_EQ(LIBC_NAMESPACE::sched_getscheduler(0), - can_set ? policy : init_policy); + setscheduler_result != -1 ? policy : init_policy); ASSERT_ERRNO_SUCCESS(); // Out of bounds priority @@ -121,17 +123,21 @@ public: ASSERT_ERRNO_EQ(EINVAL); LIBC_NAMESPACE::libc_errno = 0; - // Success / missing permissions - ASSERT_EQ(LIBC_NAMESPACE::sched_setparam(0, ¶m), can_set ? 0 : -1); - ASSERT_TRUE(can_set ? (LIBC_NAMESPACE::libc_errno == 0) - : (LIBC_NAMESPACE::libc_errno == EINVAL || - LIBC_NAMESPACE::libc_errno == EPERM)); + // Success/unsupported policy/missing permissions + int setparam_result = LIBC_NAMESPACE::sched_setparam(0, ¶m); + ASSERT_TRUE(setparam_result == 0 || setparam_result == -1); + ASSERT_TRUE(setparam_result != -1 + ? (LIBC_NAMESPACE::libc_errno == 0) + : ((setscheduler_result == -1 && + LIBC_NAMESPACE::libc_errno == EINVAL) || + LIBC_NAMESPACE::libc_errno == EPERM)); LIBC_NAMESPACE::libc_errno = 0; ASSERT_EQ(LIBC_NAMESPACE::sched_getparam(0, ¶m), 0); ASSERT_ERRNO_SUCCESS(); - ASSERT_EQ(param.sched_priority, can_set ? priority : init_priority); + ASSERT_EQ(param.sched_priority, + setparam_result != -1 ? priority : init_priority); } // Null test @@ -145,12 +151,12 @@ public: using LlvmLibcSchedTest = SchedTest; \ TEST_F(LlvmLibcSchedTest, Sched_##policy) { testSched(policy, can_set); } -// Root is required to set these policies. -LIST_SCHED_TESTS(SCHED_FIFO, LIBC_NAMESPACE::getuid() == 0) -LIST_SCHED_TESTS(SCHED_RR, LIBC_NAMESPACE::getuid() == 0) - -// No root is required to set these policies. +// Mandated by POSIX. LIST_SCHED_TESTS(SCHED_OTHER, true) +LIST_SCHED_TESTS(SCHED_FIFO, true) +LIST_SCHED_TESTS(SCHED_RR, true) + +// Linux extensions. LIST_SCHED_TESTS(SCHED_BATCH, true) LIST_SCHED_TESTS(SCHED_IDLE, true) |