Skip to content

Commit b89732c

Browse files
dvyukovKAGA-KOKO
authored andcommitted
selftests: Fix errno checking in syscall_user_dispatch test
Successful syscalls don't change errno, so checking errno is wrong to ensure that a syscall has failed. For example for the following sequence: prctl(PR_SET_SYSCALL_USER_DISPATCH, op, 0x0, 0xff, 0); EXPECT_EQ(EINVAL, errno); prctl(PR_SET_SYSCALL_USER_DISPATCH, op, 0x0, 0x0, &sel); EXPECT_EQ(EINVAL, errno); only the first syscall may fail and set errno, but the second may succeed and keep errno intact, and the check will falsely pass. Or if errno happened to be EINVAL before, even the first check may falsely pass. Also use EXPECT/ASSERT consistently. Currently there is an inconsistent mix without obvious reasons for usage of one or another. Fixes: 179ef03 ("selftests: Add kselftest for syscall user dispatch") Signed-off-by: Dmitry Vyukov <dvyukov@google.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lore.kernel.org/all/af6a04dbfef9af8570f5bab43e3ef1416b62699a.1747839857.git.dvyukov@google.com
1 parent 19272b3 commit b89732c

1 file changed

Lines changed: 25 additions & 25 deletions

File tree

  • tools/testing/selftests/syscall_user_dispatch

tools/testing/selftests/syscall_user_dispatch/sud_test.c

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -79,64 +79,64 @@ TEST_SIGNAL(dispatch_trigger_sigsys, SIGSYS)
7979
}
8080
}
8181

82+
static void prctl_valid(struct __test_metadata *_metadata,
83+
unsigned long op, unsigned long off,
84+
unsigned long size, void *sel)
85+
{
86+
EXPECT_EQ(0, prctl(PR_SET_SYSCALL_USER_DISPATCH, op, off, size, sel));
87+
}
88+
89+
static void prctl_invalid(struct __test_metadata *_metadata,
90+
unsigned long op, unsigned long off,
91+
unsigned long size, void *sel, int err)
92+
{
93+
EXPECT_EQ(-1, prctl(PR_SET_SYSCALL_USER_DISPATCH, op, off, size, sel));
94+
EXPECT_EQ(err, errno);
95+
}
96+
8297
TEST(bad_prctl_param)
8398
{
8499
char sel = SYSCALL_DISPATCH_FILTER_ALLOW;
85100
int op;
86101

87102
/* Invalid op */
88103
op = -1;
89-
prctl(PR_SET_SYSCALL_USER_DISPATCH, op, 0, 0, &sel);
90-
ASSERT_EQ(EINVAL, errno);
104+
prctl_invalid(_metadata, op, 0, 0, &sel, EINVAL);
91105

92106
/* PR_SYS_DISPATCH_OFF */
93107
op = PR_SYS_DISPATCH_OFF;
94108

95109
/* offset != 0 */
96-
prctl(PR_SET_SYSCALL_USER_DISPATCH, op, 0x1, 0x0, 0);
97-
EXPECT_EQ(EINVAL, errno);
110+
prctl_invalid(_metadata, op, 0x1, 0x0, 0, EINVAL);
98111

99112
/* len != 0 */
100-
prctl(PR_SET_SYSCALL_USER_DISPATCH, op, 0x0, 0xff, 0);
101-
EXPECT_EQ(EINVAL, errno);
113+
prctl_invalid(_metadata, op, 0x0, 0xff, 0, EINVAL);
102114

103115
/* sel != NULL */
104-
prctl(PR_SET_SYSCALL_USER_DISPATCH, op, 0x0, 0x0, &sel);
105-
EXPECT_EQ(EINVAL, errno);
116+
prctl_invalid(_metadata, op, 0x0, 0x0, &sel, EINVAL);
106117

107118
/* Valid parameter */
108-
errno = 0;
109-
prctl(PR_SET_SYSCALL_USER_DISPATCH, op, 0x0, 0x0, 0x0);
110-
EXPECT_EQ(0, errno);
119+
prctl_valid(_metadata, op, 0x0, 0x0, 0x0);
111120

112121
/* PR_SYS_DISPATCH_ON */
113122
op = PR_SYS_DISPATCH_ON;
114123

115124
/* Dispatcher region is bad (offset > 0 && len == 0) */
116-
prctl(PR_SET_SYSCALL_USER_DISPATCH, op, 0x1, 0x0, &sel);
117-
EXPECT_EQ(EINVAL, errno);
118-
prctl(PR_SET_SYSCALL_USER_DISPATCH, op, -1L, 0x0, &sel);
119-
EXPECT_EQ(EINVAL, errno);
125+
prctl_invalid(_metadata, op, 0x1, 0x0, &sel, EINVAL);
126+
prctl_invalid(_metadata, op, -1L, 0x0, &sel, EINVAL);
120127

121128
/* Invalid selector */
122-
prctl(PR_SET_SYSCALL_USER_DISPATCH, op, 0x0, 0x1, (void *) -1);
123-
ASSERT_EQ(EFAULT, errno);
129+
prctl_invalid(_metadata, op, 0x0, 0x1, (void *) -1, EFAULT);
124130

125131
/*
126132
* Dispatcher range overflows unsigned long
127133
*/
128-
prctl(PR_SET_SYSCALL_USER_DISPATCH, PR_SYS_DISPATCH_ON, 1, -1L, &sel);
129-
ASSERT_EQ(EINVAL, errno) {
130-
TH_LOG("Should reject bad syscall range");
131-
}
134+
prctl_invalid(_metadata, PR_SYS_DISPATCH_ON, 1, -1L, &sel, EINVAL);
132135

133136
/*
134137
* Allowed range overflows usigned long
135138
*/
136-
prctl(PR_SET_SYSCALL_USER_DISPATCH, PR_SYS_DISPATCH_ON, -1L, 0x1, &sel);
137-
ASSERT_EQ(EINVAL, errno) {
138-
TH_LOG("Should reject bad syscall range");
139-
}
139+
prctl_invalid(_metadata, PR_SYS_DISPATCH_ON, -1L, 0x1, &sel, EINVAL);
140140
}
141141

142142
/*

0 commit comments

Comments
 (0)