| Context |
Check |
Description |
| ltpci/github-build-doc |
success
|
success
|
| ltpci/github-build-debian_stable_aarch64-linux-gnu-gcc_arm64 |
success
|
success
|
| ltpci/github-build-debian_stable_powerpc64le-linux-gnu-gcc_ppc64el |
success
|
success
|
| ltpci/github-build-debian_testing_gcc |
success
|
success
|
| ltpci/github-build-debian_stable_s390x-linux-gnu-gcc_s390x |
success
|
success
|
| ltpci/github-build-ubuntu_jammy_gcc |
success
|
success
|
| ltpci/github-build-debian_stable_gcc |
success
|
success
|
| ltpci/github-build-fedora_latest_clang |
success
|
success
|
| ltpci/github-build-alpine_latest_gcc |
success
|
success
|
| ltpci/github-build-quay-io-centos-centos_stream9_gcc |
success
|
success
|
| ltpci/github-build-debian_testing_clang |
success
|
success
|
| ltpci/github-build-debian_stable_gcc |
success
|
success
|
| ltpci/github-build-debian_oldstable_gcc |
success
|
success
|
| ltpci/github-build-opensuse-leap_latest_gcc |
success
|
success
|
| ltpci/github-build-debian_oldstable_clang |
success
|
success
|
| ltpci/github-build-opensuse-archive_42-2_gcc |
success
|
success
|
| ltpci/copilot-review |
success
|
Approved
|
| ltpci/github-build-ubuntu_noble_gcc |
success
|
success
|
@@ -1907,3 +1907,4 @@ io_uring03 io_uring03
perf_event_open03 perf_event_open03
futex_wait06 futex_wait06
futex_wait07 futex_wait07
+futex_wake05 futex_wake05
@@ -15,3 +15,4 @@
/futex_waitv03
/futex_wait06
/futex_wait07
+/futex_wake05
new file mode 100644
@@ -0,0 +1,85 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2026 Red Hat, Inc.
+ */
+
+/*\
+ * Check that futex(FUTEX_WAKE) returns EFAULT when uaddr points to
+ * unmapped or PROT_NONE memory.
+ *
+ * PROT_NONE memory triggers EFAULT because the kernel cannot look up
+ * the futex key for an inaccessible page.
+ */
+
+#include <errno.h>
+#include <sys/mman.h>
+#include "futextest.h"
+
+static futex_t *prot_none_addr;
+
+static struct futex_test_variants variants[] = {
+#if (__NR_futex != __LTP__NR_INVALID_SYSCALL)
+ { .fntype = FUTEX_FN_FUTEX, .desc = "syscall with old kernel spec"},
+#endif
+
+#if (__NR_futex_time64 != __LTP__NR_INVALID_SYSCALL)
+ { .fntype = FUTEX_FN_FUTEX64, .desc = "syscall time64 with kernel spec"},
+#endif
+};
+
+static struct testcase {
+ const char *desc;
+ futex_t *addr;
+ int exp_errno;
+} testcases[2];
+
+static void run(unsigned int n)
+{
+ struct futex_test_variants *tv = &variants[tst_variant];
+ struct testcase *tc = &testcases[n];
+
+ TST_EXP_FAIL(futex_wake(tv->fntype, tc->addr, 1, 0),
+ tc->exp_errno, "%s", tc->desc);
+}
+
+static void setup(void)
+{
+ struct futex_test_variants *tv = &variants[tst_variant];
+ size_t pagesize = getpagesize();
+ futex_t *unmapped;
+
+ tst_res(TINFO, "Testing variant: %s", tv->desc);
+ futex_supported_by_kernel(tv->fntype);
+
+ unmapped = SAFE_MMAP(NULL, pagesize, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ SAFE_MUNMAP(unmapped, pagesize);
+
+ prot_none_addr = SAFE_MMAP(NULL, pagesize, PROT_NONE,
+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+
+ testcases[0] = (struct testcase){
+ .desc = "uaddr unmapped",
+ .addr = unmapped,
+ .exp_errno = EFAULT,
+ };
+ testcases[1] = (struct testcase){
+ .desc = "uaddr PROT_NONE",
+ .addr = prot_none_addr,
+ .exp_errno = EFAULT,
+ };
+}
+
+static void cleanup(void)
+{
+ if (prot_none_addr)
+ SAFE_MUNMAP(prot_none_addr, getpagesize());
+}
+
+static struct tst_test test = {
+ .setup = setup,
+ .cleanup = cleanup,
+ .test = run,
+ .tcnt = ARRAY_SIZE(testcases),
+ .test_variants = ARRAY_SIZE(variants),
+};
futex(FUTEX_WAKE) has no existing test for EFAULT. Add coverage for the cases where uaddr points to unmapped or PROT_NONE memory. Signed-off-by: Michael Menasherov <mmenashe@redhat.com> --- runtest/syscalls | 1 + testcases/kernel/syscalls/futex/.gitignore | 1 + .../kernel/syscalls/futex/futex_wake05.c | 85 +++++++++++++++++++ 3 files changed, 87 insertions(+) create mode 100644 testcases/kernel/syscalls/futex/futex_wake05.c