Skip to content

Commit 57778ec

Browse files
authored
[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.
1 parent f8f4235 commit 57778ec

File tree

1 file changed

+27
-21
lines changed

1 file changed

+27
-21
lines changed

libc/test/src/sched/param_and_scheduler_test.cpp

+27-21
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636

3737
class SchedTest : public LIBC_NAMESPACE::testing::Test {
3838
public:
39-
void testSched(int policy, bool can_set) {
39+
void testSched(int policy, bool is_mandatory) {
4040
LIBC_NAMESPACE::libc_errno = 0;
4141

4242
int init_policy = LIBC_NAMESPACE::sched_getscheduler(0);
@@ -74,24 +74,26 @@ class SchedTest : public LIBC_NAMESPACE::testing::Test {
7474

7575
param.sched_priority = max_priority + 1;
7676
ASSERT_EQ(LIBC_NAMESPACE::sched_setscheduler(0, policy, &param), -1);
77-
// A bit hard to test as depending if we are root or not we can run into
77+
// A bit hard to test as depending on user privileges we can run into
7878
// different issues.
7979
ASSERT_TRUE(LIBC_NAMESPACE::libc_errno == EINVAL ||
8080
LIBC_NAMESPACE::libc_errno == EPERM);
8181
LIBC_NAMESPACE::libc_errno = 0;
8282

83-
// Some sched policies require permissions, so skip
8483
param.sched_priority = min_priority;
85-
// Success / missing permissions.
86-
ASSERT_EQ(LIBC_NAMESPACE::sched_setscheduler(0, policy, &param),
87-
can_set ? 0 : -1);
88-
ASSERT_TRUE(can_set ? (LIBC_NAMESPACE::libc_errno == 0)
89-
: (LIBC_NAMESPACE::libc_errno == EINVAL ||
90-
LIBC_NAMESPACE::libc_errno == EPERM));
84+
// Success/unsupported policy/missing permissions.
85+
int setscheduler_result =
86+
LIBC_NAMESPACE::sched_setscheduler(0, policy, &param);
87+
ASSERT_TRUE(setscheduler_result == 0 || setscheduler_result == -1);
88+
ASSERT_TRUE(
89+
setscheduler_result != -1
90+
? (LIBC_NAMESPACE::libc_errno == 0)
91+
: ((!is_mandatory && LIBC_NAMESPACE::libc_errno == EINVAL) ||
92+
LIBC_NAMESPACE::libc_errno == EPERM));
9193
LIBC_NAMESPACE::libc_errno = 0;
9294

9395
ASSERT_EQ(LIBC_NAMESPACE::sched_getscheduler(0),
94-
can_set ? policy : init_policy);
96+
setscheduler_result != -1 ? policy : init_policy);
9597
ASSERT_ERRNO_SUCCESS();
9698

9799
// Out of bounds priority
@@ -121,17 +123,21 @@ class SchedTest : public LIBC_NAMESPACE::testing::Test {
121123
ASSERT_ERRNO_EQ(EINVAL);
122124
LIBC_NAMESPACE::libc_errno = 0;
123125

124-
// Success / missing permissions
125-
ASSERT_EQ(LIBC_NAMESPACE::sched_setparam(0, &param), can_set ? 0 : -1);
126-
ASSERT_TRUE(can_set ? (LIBC_NAMESPACE::libc_errno == 0)
127-
: (LIBC_NAMESPACE::libc_errno == EINVAL ||
128-
LIBC_NAMESPACE::libc_errno == EPERM));
126+
// Success/unsupported policy/missing permissions
127+
int setparam_result = LIBC_NAMESPACE::sched_setparam(0, &param);
128+
ASSERT_TRUE(setparam_result == 0 || setparam_result == -1);
129+
ASSERT_TRUE(setparam_result != -1
130+
? (LIBC_NAMESPACE::libc_errno == 0)
131+
: ((setscheduler_result == -1 &&
132+
LIBC_NAMESPACE::libc_errno == EINVAL) ||
133+
LIBC_NAMESPACE::libc_errno == EPERM));
129134
LIBC_NAMESPACE::libc_errno = 0;
130135

131136
ASSERT_EQ(LIBC_NAMESPACE::sched_getparam(0, &param), 0);
132137
ASSERT_ERRNO_SUCCESS();
133138

134-
ASSERT_EQ(param.sched_priority, can_set ? priority : init_priority);
139+
ASSERT_EQ(param.sched_priority,
140+
setparam_result != -1 ? priority : init_priority);
135141
}
136142

137143
// Null test
@@ -145,12 +151,12 @@ class SchedTest : public LIBC_NAMESPACE::testing::Test {
145151
using LlvmLibcSchedTest = SchedTest; \
146152
TEST_F(LlvmLibcSchedTest, Sched_##policy) { testSched(policy, can_set); }
147153

148-
// Root is required to set these policies.
149-
LIST_SCHED_TESTS(SCHED_FIFO, LIBC_NAMESPACE::getuid() == 0)
150-
LIST_SCHED_TESTS(SCHED_RR, LIBC_NAMESPACE::getuid() == 0)
151-
152-
// No root is required to set these policies.
154+
// Mandated by POSIX.
153155
LIST_SCHED_TESTS(SCHED_OTHER, true)
156+
LIST_SCHED_TESTS(SCHED_FIFO, true)
157+
LIST_SCHED_TESTS(SCHED_RR, true)
158+
159+
// Linux extensions.
154160
LIST_SCHED_TESTS(SCHED_BATCH, true)
155161
LIST_SCHED_TESTS(SCHED_IDLE, true)
156162

0 commit comments

Comments
 (0)