Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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: 179ef035992e ("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


authored by

Dmitry Vyukov and committed by
Thomas Gleixner
b89732c8 19272b37

+25 -25
+25 -25
tools/testing/selftests/syscall_user_dispatch/sud_test.c
··· 79 79 } 80 80 } 81 81 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 + 82 97 TEST(bad_prctl_param) 83 98 { 84 99 char sel = SYSCALL_DISPATCH_FILTER_ALLOW; ··· 101 86 102 87 /* Invalid op */ 103 88 op = -1; 104 - prctl(PR_SET_SYSCALL_USER_DISPATCH, op, 0, 0, &sel); 105 - ASSERT_EQ(EINVAL, errno); 89 + prctl_invalid(_metadata, op, 0, 0, &sel, EINVAL); 106 90 107 91 /* PR_SYS_DISPATCH_OFF */ 108 92 op = PR_SYS_DISPATCH_OFF; 109 93 110 94 /* offset != 0 */ 111 - prctl(PR_SET_SYSCALL_USER_DISPATCH, op, 0x1, 0x0, 0); 112 - EXPECT_EQ(EINVAL, errno); 95 + prctl_invalid(_metadata, op, 0x1, 0x0, 0, EINVAL); 113 96 114 97 /* len != 0 */ 115 - prctl(PR_SET_SYSCALL_USER_DISPATCH, op, 0x0, 0xff, 0); 116 - EXPECT_EQ(EINVAL, errno); 98 + prctl_invalid(_metadata, op, 0x0, 0xff, 0, EINVAL); 117 99 118 100 /* sel != NULL */ 119 - prctl(PR_SET_SYSCALL_USER_DISPATCH, op, 0x0, 0x0, &sel); 120 - EXPECT_EQ(EINVAL, errno); 101 + prctl_invalid(_metadata, op, 0x0, 0x0, &sel, EINVAL); 121 102 122 103 /* Valid parameter */ 123 - errno = 0; 124 - prctl(PR_SET_SYSCALL_USER_DISPATCH, op, 0x0, 0x0, 0x0); 125 - EXPECT_EQ(0, errno); 104 + prctl_valid(_metadata, op, 0x0, 0x0, 0x0); 126 105 127 106 /* PR_SYS_DISPATCH_ON */ 128 107 op = PR_SYS_DISPATCH_ON; 129 108 130 109 /* Dispatcher region is bad (offset > 0 && len == 0) */ 131 - prctl(PR_SET_SYSCALL_USER_DISPATCH, op, 0x1, 0x0, &sel); 132 - EXPECT_EQ(EINVAL, errno); 133 - prctl(PR_SET_SYSCALL_USER_DISPATCH, op, -1L, 0x0, &sel); 134 - EXPECT_EQ(EINVAL, errno); 110 + prctl_invalid(_metadata, op, 0x1, 0x0, &sel, EINVAL); 111 + prctl_invalid(_metadata, op, -1L, 0x0, &sel, EINVAL); 135 112 136 113 /* Invalid selector */ 137 - prctl(PR_SET_SYSCALL_USER_DISPATCH, op, 0x0, 0x1, (void *) -1); 138 - ASSERT_EQ(EFAULT, errno); 114 + prctl_invalid(_metadata, op, 0x0, 0x1, (void *) -1, EFAULT); 139 115 140 116 /* 141 117 * Dispatcher range overflows unsigned long 142 118 */ 143 - prctl(PR_SET_SYSCALL_USER_DISPATCH, PR_SYS_DISPATCH_ON, 1, -1L, &sel); 144 - ASSERT_EQ(EINVAL, errno) { 145 - TH_LOG("Should reject bad syscall range"); 146 - } 119 + prctl_invalid(_metadata, PR_SYS_DISPATCH_ON, 1, -1L, &sel, EINVAL); 147 120 148 121 /* 149 122 * Allowed range overflows usigned long 150 123 */ 151 - prctl(PR_SET_SYSCALL_USER_DISPATCH, PR_SYS_DISPATCH_ON, -1L, 0x1, &sel); 152 - ASSERT_EQ(EINVAL, errno) { 153 - TH_LOG("Should reject bad syscall range"); 154 - } 124 + prctl_invalid(_metadata, PR_SYS_DISPATCH_ON, -1L, 0x1, &sel, EINVAL); 155 125 } 156 126 157 127 /*