[LTP] [PATCH] sysctl03: sysctl returns EACCES after 2.6.33-rc1

Shi Weihua
2010-02-01T11:25:23Z

The syscall of sysctl has been changed function call process on 2.6.33-rc1.
So we should change some code about sysctl.

Before 2.6.33-rc1:
do_sysctl
->parse_table
->sysctl_perm (will return EPERM sometime)
->do_sysctl_strategy
->sysctl_perm (will return EPERM sometime)
...

After 2.6.33-rc1:
do_sysctl
->binary_sysctl
check enable to access or not (will return EACCES some time)
...

I fixed sysctl03, other cases of sysctl are OK.
This patch works on 2.6.31.5-127.fc12.x86_64, 2.6.32, 2.6.33-rc1,
and 2.6.33-rc6.

Signed-off-by: Shi Weihua <shiwh@cn.fujitsu.com>
---
--- testcases/kernel/syscalls/sysctl/sysctl03.c.orig 2010-02-02 18:15:56.000000000 +0800
+++ testcases/kernel/syscalls/sysctl/sysctl03.c 2010-02-02 18:49:40.000000000 +0800
@@ -22,15 +22,18 @@
* sysctl03.c
*
* DESCRIPTION
- * Testcase to check that sysctl(2) sets errno to EPERM correctly.
+ * Testcase to check that sysctl(2) sets errno to EPERM or EACCES
+ * correctly. But it will return EACCES on kernels that are 2.6.33-rc1
+ * and higher.
*
* ALGORITHM
* a. Call sysctl(2) as a root user, and attempt to write data
* to the kernel_table[]. Since the table does not have write
- * permissions even for the root, it should fail EPERM.
+ * permissions even for the root, it should fail EPERM or EACCES.
* b. Call sysctl(2) as a non-root user, and attempt to write data
* to the kernel_table[]. Since the table does not have write
- * permission for the regular user, it should fail with EPERM.
+ * permission for the regular user, it should fail with EPERM
+ * or EACCES.
*
* USAGE: <for command-line>
* sysctl03 [-c n] [-e] [-i n] [-I x] [-P x] [-t]
@@ -43,6 +46,7 @@
*
* HISTORY
* 07/2001 Ported by Wayne Boyer
+ * 02/2010 Updated by shiwh@cn.fujitsu.com
*
* RESTRICTIONS
* Test must be run as root.
@@ -82,6 +86,7 @@ int main(int ac, char **av)
{
int lc;
char *msg;
+ int exp_eno;

char osname[OSNAMESZ];
int osnamelth, status;
@@ -96,6 +101,13 @@ int main(int ac, char **av)

setup();

+ if ((tst_kvercmp(2, 6, 32)) <= 0){
+ exp_eno = EPERM;
+ } else {
+ exp_eno = EACCES;
+ exp_enos[0] = EACCES;
+ }
+
TEST_EXP_ENOS(exp_enos);

/* check looping state if -i option is given */
@@ -114,13 +126,13 @@ int main(int ac, char **av)
} else {
TEST_ERROR_LOG(TEST_ERRNO);

- if (TEST_ERRNO != EPERM) {
+ if (TEST_ERRNO != exp_eno) {
tst_resm(TFAIL,
- "Expected EPERM (%d), got %d: %s",
- EPERM, TEST_ERRNO,
+ "Expected %s (%d), got %d: %s",
+ strerror(exp_eno), exp_eno, TEST_ERRNO,
strerror(TEST_ERRNO));
} else {
- tst_resm(TPASS, "Got expected EPERM error");
+ tst_resm(TPASS, "Got expected %s error", strerror(exp_eno));
}
}

@@ -147,12 +159,12 @@ int main(int ac, char **av)
} else {
TEST_ERROR_LOG(TEST_ERRNO);

- if (TEST_ERRNO != EPERM) {
- tst_resm(TFAIL, "Expected EPERM, got "
- "%d", TEST_ERRNO);
+ if (TEST_ERRNO != exp_eno) {
+ tst_resm(TFAIL, "Expected %s, got "
+ "%d", strerror(exp_eno), TEST_ERRNO);
} else {
- tst_resm(TPASS, "Got expected EPERM "
- "error");
+ tst_resm(TPASS, "Got expected %s "
+ "error", strerror(exp_eno));
}
}

------------------------------------------------------------------------------
The Planet: dedicated and managed hosting, cloud storage, colocation
Stay online with enterprise data centers and the best network in the business
Choose flexible plans and management services without long-term contracts
Personal 24x7 support from experience hosting pros just a phone call away.