Message ID | 20240718065532.20188-1-maxj.fnst@fujitsu.com |
---|---|
State | Changes Requested |
Headers | show |
Series | [v2] getcpu: Add testcase for EFAULT | expand |
Hi Ma, Cyril, ... > +static void run(void) > +{ > + unsigned int cpu_id, node_id = 0; > + > + TST_EXP_FAIL(getcpu(tst_get_bad_addr(NULL), &node_id), EFAULT); I'm not sure why, but I get SIGSEGV due tst_get_bad_addr(NULL) on various kernels (SLES 5.14.21, Tumbleweed 6.5.1, 6.10, Debian 6.9, ...). But the test works on SLES 4.4.180. Kind regards, Petr > + TST_EXP_FAIL(getcpu(&cpu_id, tst_get_bad_addr(NULL)), EFAULT); > +} > + > +static struct tst_test test = { > + .test_all = run, > +};
Hi! > > +static void run(void) > > +{ > > + unsigned int cpu_id, node_id = 0; > > + > > + TST_EXP_FAIL(getcpu(tst_get_bad_addr(NULL), &node_id), EFAULT); > I'm not sure why, but I get SIGSEGV due tst_get_bad_addr(NULL) on various > kernels (SLES 5.14.21, Tumbleweed 6.5.1, 6.10, Debian 6.9, ...). > > But the test works on SLES 4.4.180. If you are getting SIGSEGV that means that the address is used in userspace. Looking at man getcpu() it suggests that on some architectures it may be implemented as VDSO, which would explain it. So I suppose that the easies solution here would be to run the test in a child process and accepting SIGSEGV as a correct outcome as well.
> Hi! > > > +static void run(void) > > > +{ > > > + unsigned int cpu_id, node_id = 0; > > > + > > > + TST_EXP_FAIL(getcpu(tst_get_bad_addr(NULL), &node_id), EFAULT); > > I'm not sure why, but I get SIGSEGV due tst_get_bad_addr(NULL) on various > > kernels (SLES 5.14.21, Tumbleweed 6.5.1, 6.10, Debian 6.9, ...). > > But the test works on SLES 4.4.180. > If you are getting SIGSEGV that means that the address is used in > userspace. Looking at man getcpu() it suggests that on some > architectures it may be implemented as VDSO, which would explain it. > So I suppose that the easies solution here would be to run the test in a > child process and accepting SIGSEGV as a correct outcome as well. Thanks, Cyril. Ma Xinjian, could you please send another version? You can get inspiration in: testcases/kernel/syscalls/setrlimit/setrlimit05.c Or in others: $ git grep -l .forks_child $(git grep -l SIGSEGV) Kind regards, Petr
diff --git a/runtest/syscalls b/runtest/syscalls index 136fd03fa..31922bc9f 100644 --- a/runtest/syscalls +++ b/runtest/syscalls @@ -440,6 +440,7 @@ futimesat01 futimesat01 getcontext01 getcontext01 getcpu01 getcpu01 +getcpu02 getcpu02 getcwd01 getcwd01 getcwd02 getcwd02 diff --git a/testcases/kernel/syscalls/getcpu/.gitignore b/testcases/kernel/syscalls/getcpu/.gitignore index 31fec5d35..cd3022bbb 100644 --- a/testcases/kernel/syscalls/getcpu/.gitignore +++ b/testcases/kernel/syscalls/getcpu/.gitignore @@ -1 +1,2 @@ /getcpu01 +/getcpu02 diff --git a/testcases/kernel/syscalls/getcpu/getcpu02.c b/testcases/kernel/syscalls/getcpu/getcpu02.c new file mode 100644 index 000000000..81a8dd871 --- /dev/null +++ b/testcases/kernel/syscalls/getcpu/getcpu02.c @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2024 FUJITSU LIMITED. All Rights Reserved. + * Copyright (c) Linux Test Project, 2024 + * Author: Ma Xinjian <maxj.fnst@fujitsu.com> + * + */ + +/*\ + * [Description] + * + * Verify that getcpu(2) fails with + * + * - EFAULT arguments point outside the calling process's address + * space. + */ + +#define _GNU_SOURCE +#include "tst_test.h" +#include "lapi/sched.h" + +static void run(void) +{ + unsigned int cpu_id, node_id = 0; + + TST_EXP_FAIL(getcpu(tst_get_bad_addr(NULL), &node_id), EFAULT); + TST_EXP_FAIL(getcpu(&cpu_id, tst_get_bad_addr(NULL)), EFAULT); +} + +static struct tst_test test = { + .test_all = run, +};
Add a testcase with the arguments point to an invalid address. Signed-off-by: Ma Xinjian <maxj.fnst@fujitsu.com> --- runtest/syscalls | 1 + testcases/kernel/syscalls/getcpu/.gitignore | 1 + testcases/kernel/syscalls/getcpu/getcpu02.c | 32 +++++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 testcases/kernel/syscalls/getcpu/getcpu02.c