[PATCH] syscall02: add invalid syscall number test
Andrea Cervesato <[email protected]>
| Newsgroups | gmane.linux.ltp |
|---|---|
| Message-ID | <[email protected]> |
From: Andrea Cervesato <andrea.cervesato-IBi9RG/[email protected]> Add a test verifying that syscall() returns ENOSYS when called with unimplemented syscall numbers. The chosen numbers stay above the syscall table and below the architecture-specific private ranges, so they are reliably invalid on every supported architecture. Signed-off-by: Andrea Cervesato <andrea.cervesato-IBi9RG/[email protected]> --- runtest/syscalls | 1 + testcases/kernel/syscalls/syscall/.gitignore | 1 + testcases/kernel/syscalls/syscall/syscall02.c | 47 +++++++++++++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/runtest/syscalls b/runtest/syscalls index a021c79da49d4157c33187caed2dd3f0483759e0..8a777e61da1af59ba694e0bc5b5d92bb1d63754a 100644 --- a/runtest/syscalls +++ b/runtest/syscalls @@ -1678,6 +1678,7 @@ sync_file_range01 sync_file_range01 sync_file_range02 sync_file_range02 syscall01 syscall01 +syscall02 syscall02 sysconf01 sysconf01 diff --git a/testcases/kernel/syscalls/syscall/.gitignore b/testcases/kernel/syscalls/syscall/.gitignore index 74a081e40cb564e874e0f81478d3d1a0e95b6df4..fed1d81079450a7442023447285cd112924f7a10 100644 --- a/testcases/kernel/syscalls/syscall/.gitignore +++ b/testcases/kernel/syscalls/syscall/.gitignore @@ -1 +1,2 @@ /syscall01 +/syscall02 diff --git a/testcases/kernel/syscalls/syscall/syscall02.c b/testcases/kernel/syscalls/syscall/syscall02.c new file mode 100644 index 0000000000000000000000000000000000000000..3bd9fa8cdcca257e03b358749ee7a2b676d8720d --- /dev/null +++ b/testcases/kernel/syscalls/syscall/syscall02.c @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2026 Andrea Cervesato <andrea.cervesato-IBi9RG/[email protected]> + */ + +/*\ + * Verify that :manpage:`syscall(2)` fails with ENOSYS when invoked with + * invalid syscall numbers. + * + * The syscall number is dispatched as an unsigned value on Linux. A value is + * reliably unimplemented on every supported architecture when it is: + * + * - above the syscall table + * - below the architecture-specific private syscall ranges (e.g. ARM's + * 0x0f0000 base) + * - without the x32 ABI bit (0x40000000) set + * + * Such a number is routed to sys_ni_syscall and returns ENOSYS. + */ + +#include <unistd.h> +#include <sys/syscall.h> + +#include "tst_test.h" + +#define TC(x) {.scno = (long)(x), .desc = #x} + +static struct tcase { + long scno; + const char *desc; +} tcases[] = { + TC(0x8000), + TC(0xf000), + TC(0xfffe), +}; + +static void verify_syscall(unsigned int n) +{ + struct tcase *tc = &tcases[n]; + + TST_EXP_FAIL2(syscall(tc->scno), ENOSYS, "syscall(%s)", tc->desc); +} + +static struct tst_test test = { + .test = verify_syscall, + .tcnt = ARRAY_SIZE(tcases), +}; --- base-commit: ad68429b9cfd55b233733e45e600ffafa1458ac5 change-id: 20260629-invalid_syscalls-0476c52d7d0c Best regards, -- Andrea Cervesato <andrea.cervesato-IBi9RG/[email protected]> -- Mailing list info: https://lists.linux.it/listinfo/ltp