Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.2/patches/2222704/?format=api
{ "id": 2222704, "url": "http://patchwork.ozlabs.org/api/1.2/patches/2222704/?format=api", "web_url": "http://patchwork.ozlabs.org/project/ltp/patch/20260413134029.43754-1-mmenashe@redhat.com/", "project": { "id": 59, "url": "http://patchwork.ozlabs.org/api/1.2/projects/59/?format=api", "name": "Linux Test Project development", "link_name": "ltp", "list_id": "ltp.lists.linux.it", "list_email": "ltp@lists.linux.it", "web_url": "", "scm_url": "", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20260413134029.43754-1-mmenashe@redhat.com>", "list_archive_url": null, "date": "2026-04-13T13:40:29", "name": "[v2] futex: Add error coverage tests for wait, wake and cmp_requeue", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "aa14f145af75aa0621d3c3a09997dba77f04ac57", "submitter": { "id": 93123, "url": "http://patchwork.ozlabs.org/api/1.2/people/93123/?format=api", "name": "Michael Menasherov", "email": "mmenashe@redhat.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/ltp/patch/20260413134029.43754-1-mmenashe@redhat.com/mbox/", "series": [ { "id": 499706, "url": "http://patchwork.ozlabs.org/api/1.2/series/499706/?format=api", "web_url": "http://patchwork.ozlabs.org/project/ltp/list/?series=499706", "date": "2026-04-13T13:40:29", "name": "[v2] futex: Add error coverage tests for wait, wake and cmp_requeue", "version": 2, "mbox": "http://patchwork.ozlabs.org/series/499706/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2222704/comments/", "check": "warning", "checks": "http://patchwork.ozlabs.org/api/patches/2222704/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "ltp@lists.linux.it" ], "Delivered-To": [ "patchwork-incoming@legolas.ozlabs.org", "ltp@picard.linux.it" ], "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=lists.linux.it header.i=@lists.linux.it\n header.a=rsa-sha256 header.s=picard header.b=DOSXuChv;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=MO2l8gSG;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.linux.it\n (client-ip=2001:1418:10:5::2; helo=picard.linux.it;\n envelope-from=ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it;\n receiver=patchwork.ozlabs.org)" ], "Received": [ "from picard.linux.it (picard.linux.it [IPv6:2001:1418:10:5::2])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fvT7l0QBkz1y2d\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 13 Apr 2026 23:40:50 +1000 (AEST)", "from picard.linux.it (localhost [IPv6:::1])\n\tby picard.linux.it (Postfix) with ESMTP id F04643E4B26\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 13 Apr 2026 15:40:47 +0200 (CEST)", "from in-4.smtp.seeweb.it (in-4.smtp.seeweb.it\n [IPv6:2001:4b78:1:20::4])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature ECDSA (secp384r1))\n (No client certificate requested)\n by picard.linux.it (Postfix) with ESMTPS id D81DB3E2699\n for <ltp@lists.linux.it>; Mon, 13 Apr 2026 15:40:42 +0200 (CEST)", "from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [170.10.133.124])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by in-4.smtp.seeweb.it (Postfix) with ESMTPS id DF3D010008F6\n for <ltp@lists.linux.it>; Mon, 13 Apr 2026 15:40:41 +0200 (CEST)", "from mail-wm1-f70.google.com (mail-wm1-f70.google.com\n [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n us-mta-516-gGk5Fv54PrCirdLLwaPpCw-1; Mon, 13 Apr 2026 09:40:38 -0400", "by mail-wm1-f70.google.com with SMTP id\n 5b1f17b1804b1-488d56f87e8so24584835e9.0\n for <ltp@lists.linux.it>; Mon, 13 Apr 2026 06:40:38 -0700 (PDT)", "from fedora.redhat.com (46-116-192-140.bb.netvision.net.il.\n [46.116.192.140]) by smtp.gmail.com with ESMTPSA id\n ffacd0b85a97d-43d6ffd3880sm17533762f8f.7.2026.04.13.06.40.33\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Mon, 13 Apr 2026 06:40:34 -0700 (PDT)" ], "DKIM-Signature": [ "v=1; a=rsa-sha256; c=relaxed/simple; d=lists.linux.it;\n i=@lists.linux.it; q=dns/txt; s=picard; t=1776087648; h=to : date :\n message-id : mime-version : subject : list-id : list-unsubscribe :\n list-archive : list-post : list-help : list-subscribe : from :\n reply-to : content-type : content-transfer-encoding : sender : from;\n bh=ebQB9tMwY5dAb80+BUf89zqH+Yr5kGjO+MHM1rlyKc0=;\n b=DOSXuChvyoE3jp7XCiNf/2xMW0kRsYsWnYkB0Bi4UMY0Nf8otOrQ66j9XIcZfqeOZne2z\n /awj5CiQ6vm3aKedEI6f/eHu0+AvtBiacpZeHf1X98Z2R9NSr9yauBWowNg0xErbBltmRrN\n MOuzk4hqP2TZdOoVmo72bMzRzi/+xbU=", "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1776087640;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding;\n bh=KJQTBegNi7DjChlWYvPLOgQU5+8vsQIFrvFlXvtL/Vw=;\n b=MO2l8gSGZNLgZ/nIbxgic5D32YZP7Mz06NrRSZ8idDwT+wkhTqMPzd1BYeGZy3G4UIOPSU\n y6JhY+p+Nx1l6f6mu3QytWtaMvprUjZLIcQFBttz8MWwJBUwElA59KoXfVUdrPC7glI3Q0\n C05B3npd/APBBaTXNoHCA1o0cSivv+I=" ], "X-MC-Unique": "gGk5Fv54PrCirdLLwaPpCw-1", "X-Mimecast-MFC-AGG-ID": "gGk5Fv54PrCirdLLwaPpCw_1776087637", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1776087637; x=1776692437;\n h=content-transfer-encoding:mime-version:message-id:date:subject:cc\n :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date\n :message-id:reply-to;\n bh=KJQTBegNi7DjChlWYvPLOgQU5+8vsQIFrvFlXvtL/Vw=;\n b=hi0jJmCTpcaqaviS0eeuLrlK+8j0YvzEvmT8rmkc7rwNUbIMucRARq+wDT9MneDsqA\n 3mkk+Gihquaf5oa03rIIifQaDQObX9vKKA+fZL3IFJl887JzS9e7AMGFMtbv3jB4psog\n shr9Cs7aDWN0T75qS/F8281AJGJ5QqFR/RUrt/3h6Z+hEGuIqvdPq/YBXiGr9OGXtyrA\n 90MrdJMRatMNtwrwuGU4VRqUzJpDU793Vt4//8LDR3hmW059yVVGV6rCvrd9xcuQ1/Cf\n 4/ek7nOf5/IsFwzT2MVg84YhZrq6sWshjaK3Xc3EqgJF/sf0lX3VBoS52alVSxLMCiDu\n U2Ow==", "X-Gm-Message-State": "AOJu0YxT1qce/ZvNNkX370F6G0vYu7ZkR0DKcCP+B95vat4LrsNnMMN2\n pEOWXxVx1k3didUHclMBKPF0eIHN3W7tP2gfmWZhumoFLJ8majN1lyZ9Uyh6M/eGoY81AsGeVC3\n S2S1UGMoV/4AX4sar9qAEUMIx06xrc8Th7HIQFjvdLYC/KpI6LkPv8aRhdkir19fPKhGZIKvzJY\n Xg3In55cp2SlTOAen2WMlof7VJ/yslgvVzCQq2", "X-Gm-Gg": "AeBDievvsEdei7Ujj/UXf9sulFz2DGZu40u+0whPXvPUObfyNrE+wBWFGY2qJI6gX0n\n Ftg+zlnTCVxk5ym7POW6b/xnApBN/Lezi9RSlX8TxEWYrc9CK/UlM0NLM/fvtLGisPsQBmf0wrj\n Ec85M6ChbGql7n+VC60pXhCWy9P/ej1YT9P+ROKgf110pyhifJV9ARp2ZGFk4ssoiTEUJEQp7Oh\n iuVEHRKbSt9kJIxEZR11UaPPKSVcpbbqRCFNSb1qngCgY+nP8RzgWplTdjy/yQmJpVPU/2fGNmF\n PO2Sena6lN1bmAsBRCmZ7Q7LHjg5bFzdfQAqMaPTNxOY7Eu2fi6oiGAhC3yz8xRP6YQo4wapI8D\n 5/wAiVx00a7S2jKQ5le7hidq2WB0eDfaDMWE03ingqxJuq9zOMpYbokJ+pygm/Zx+q2A=", "X-Received": [ "by 2002:a05:600c:c084:b0:485:4006:960c with SMTP id\n 5b1f17b1804b1-488d685b86bmr133489035e9.16.1776087636561;\n Mon, 13 Apr 2026 06:40:36 -0700 (PDT)", "by 2002:a05:600c:c084:b0:485:4006:960c with SMTP id\n 5b1f17b1804b1-488d685b86bmr133488565e9.16.1776087635788;\n Mon, 13 Apr 2026 06:40:35 -0700 (PDT)" ], "To": "ltp@lists.linux.it", "Date": "Mon, 13 Apr 2026 16:40:29 +0300", "Message-ID": "<20260413134029.43754-1-mmenashe@redhat.com>", "X-Mailer": "git-send-email 2.53.0", "MIME-Version": "1.0", "X-Mimecast-Spam-Score": "0", "X-Mimecast-MFC-PROC-ID": "jzPxj1lGFv79A5a800RlruxrCDAwLaicUMRih9IZLXY_1776087637", "X-Mimecast-Originator": "redhat.com", "X-Spam-Status": "No, score=0.1 required=7.0 tests=DKIM_SIGNED,DKIM_VALID,\n DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_PASS,SPF_PASS shortcircuit=no\n autolearn=disabled version=4.0.1", "X-Spam-Checker-Version": "SpamAssassin 4.0.1 (2024-03-25) on in-4.smtp.seeweb.it", "X-Virus-Scanned": "clamav-milter 1.0.9 at in-4.smtp.seeweb.it", "X-Virus-Status": "Clean", "Subject": "[LTP] [PATCH v2] futex: Add error coverage tests for wait,\n wake and cmp_requeue", "X-BeenThere": "ltp@lists.linux.it", "X-Mailman-Version": "2.1.29", "Precedence": "list", "List-Id": "Linux Test Project <ltp.lists.linux.it>", "List-Unsubscribe": "<https://lists.linux.it/options/ltp>,\n <mailto:ltp-request@lists.linux.it?subject=unsubscribe>", "List-Archive": "<http://lists.linux.it/pipermail/ltp/>", "List-Post": "<mailto:ltp@lists.linux.it>", "List-Help": "<mailto:ltp-request@lists.linux.it?subject=help>", "List-Subscribe": "<https://lists.linux.it/listinfo/ltp>,\n <mailto:ltp-request@lists.linux.it?subject=subscribe>", "From": "Michael Menasherov via ltp <ltp@lists.linux.it>", "Reply-To": "Michael Menasherov <mmenashe@redhat.com>", "Content-Type": "text/plain; charset=\"us-ascii\"", "Content-Transfer-Encoding": "7bit", "Errors-To": "ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it", "Sender": "\"ltp\" <ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it>" }, "content": "Improve error handling coverage for futex syscalls by adding tests\nfor missing error conditions that were previously untested.\n\nfutex_wait06 verifies EFAULT is returned when uaddr or timeout\npoints to unmapped memory.\n\nfutex_wait07 verifies EINTR is returned when futex_wait() is\ninterrupted by a signal.\n\nfutex_wake05 verifies EFAULT is returned when uaddr points to\nunmapped or PROT_NONE memory.\n\nfutex_cmp_requeue03 verifies EFAULT is returned when uaddr or\nuaddr2 points to unmapped memory, and EACCES or EFAULT when uaddr\npoints to memory without read permission (PROT_NONE). The EACCES\nbehavior was introduced in kernel 5.9.\n---\nv2: Use TST_EXP_FAIL macro as requested.\n Store address directly in testcase structs and not using flags.\n Use SAFE_MMAP and not raw as requested, also added a sign off.\n runtest/syscalls | 4 +\n testcases/kernel/syscalls/futex/.gitignore | 4 +\n .../syscalls/futex/futex_cmp_requeue03.c | 96 ++++++++++++++\n .../kernel/syscalls/futex/futex_wait06.c | 73 +++++++++++\n .../kernel/syscalls/futex/futex_wait07.c | 117 ++++++++++++++++++\n .../kernel/syscalls/futex/futex_wake05.c | 86 +++++++++++++\n 6 files changed, 380 insertions(+)\n create mode 100644 testcases/kernel/syscalls/futex/futex_cmp_requeue03.c\n create mode 100644 testcases/kernel/syscalls/futex/futex_wait06.c\n create mode 100644 testcases/kernel/syscalls/futex/futex_wait07.c\n create mode 100644 testcases/kernel/syscalls/futex/futex_wake05.c", "diff": "diff --git a/runtest/syscalls b/runtest/syscalls\nindex 6ba0227a8..6c12dc225 100644\n--- a/runtest/syscalls\n+++ b/runtest/syscalls\n@@ -1859,11 +1859,14 @@ perf_event_open02 perf_event_open02\n \n futex_cmp_requeue01 futex_cmp_requeue01\n futex_cmp_requeue02 futex_cmp_requeue02\n+futex_cmp_requeue03 futex_cmp_requeue03\n futex_wait01 futex_wait01\n futex_wait02 futex_wait02\n futex_wait03 futex_wait03\n futex_wait04 futex_wait04\n futex_wait05 futex_wait05\n+futex_wait06 futex_wait06\n+futex_wait07 futex_wait07\n futex_waitv01 futex_waitv01\n futex_waitv02 futex_waitv02\n futex_waitv03 futex_waitv03\n@@ -1871,6 +1874,7 @@ futex_wake01 futex_wake01\n futex_wake02 futex_wake02\n futex_wake03 futex_wake03\n futex_wake04 futex_wake04\n+futex_wake05 futex_wake05\n futex_wait_bitset01 futex_wait_bitset01\n \n memfd_create01 memfd_create01\ndiff --git a/testcases/kernel/syscalls/futex/.gitignore b/testcases/kernel/syscalls/futex/.gitignore\nindex 9d08ba7d3..c47d39b5b 100644\n--- a/testcases/kernel/syscalls/futex/.gitignore\n+++ b/testcases/kernel/syscalls/futex/.gitignore\n@@ -1,15 +1,19 @@\n /futex_cmp_requeue01\n /futex_cmp_requeue02\n+/futex_cmp_requeue03\n /futex_wait01\n /futex_wait02\n /futex_wait03\n /futex_wait04\n /futex_wait05\n+/futex_wait06\n+/futex_wait07\n /futex_wait_bitset01\n /futex_wake01\n /futex_wake02\n /futex_wake03\n /futex_wake04\n+/futex_wake05\n /futex_waitv01\n /futex_waitv02\n /futex_waitv03\ndiff --git a/testcases/kernel/syscalls/futex/futex_cmp_requeue03.c b/testcases/kernel/syscalls/futex/futex_cmp_requeue03.c\nnew file mode 100644\nindex 000000000..099d5e35c\n--- /dev/null\n+++ b/testcases/kernel/syscalls/futex/futex_cmp_requeue03.c\n@@ -0,0 +1,96 @@\n+// SPDX-License-Identifier: GPL-2.0-or-later\n+/*\n+ * Copyright (C) 2026 Red Hat, Inc.\n+ */\n+\n+/*\\\n+ * Check that futex(FUTEX_CMP_REQUEUE) returns EFAULT when uaddr or\n+ * uaddr2 points to unmapped memory, and EACCES (or EFAULT on older kernels)\n+ * when uaddr points to memory without read permission (PROT_NONE).\n+ *\n+ * The EACCES behavior for PROT_NONE was introduced in kernel 5.9.\n+ */\n+\n+#include <errno.h>\n+#include <sys/mman.h>\n+\n+#include \"futextest.h\"\n+\n+static futex_t futex_var = FUTEX_INITIALIZER;\n+static futex_t *prot_none_addr;\n+\n+static struct futex_test_variants variants[] = {\n+#if (__NR_futex != __LTP__NR_INVALID_SYSCALL)\n+\t{ .fntype = FUTEX_FN_FUTEX, .desc = \"syscall with old kernel spec\"},\n+#endif\n+\n+#if (__NR_futex_time64 != __LTP__NR_INVALID_SYSCALL)\n+\t{ .fntype = FUTEX_FN_FUTEX64, .desc = \"syscall time64 with kernel spec\"},\n+#endif\n+};\n+\n+static struct testcase {\n+\tconst char *desc;\n+\tfutex_t *uaddr;\n+\tfutex_t *uaddr2;\n+\tint exp_errno;\n+} testcases[3];\n+\n+static void run(unsigned int n)\n+{\n+\tstruct futex_test_variants *tv = &variants[tst_variant];\n+\tstruct testcase *tc = &testcases[n];\n+\n+\tTST_EXP_FAIL(futex_cmp_requeue(tv->fntype, tc->uaddr, futex_var,\n+\t\ttc->uaddr2, 1, 1, 0), tc->exp_errno, \"%s\", tc->desc);\n+}\n+\n+static void setup(void)\n+{\n+\tstruct futex_test_variants *tv = &variants[tst_variant];\n+\tsize_t pagesize = getpagesize();\n+\tfutex_t *unmapped;\n+\n+\ttst_res(TINFO, \"Testing variant: %s\", tv->desc);\n+\tfutex_supported_by_kernel(tv->fntype);\n+\n+\tunmapped = SAFE_MMAP(NULL, pagesize, PROT_READ | PROT_WRITE,\n+\t\tMAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n+\tSAFE_MUNMAP(unmapped, pagesize);\n+\n+\tprot_none_addr = SAFE_MMAP(NULL, pagesize, PROT_NONE,\n+\t\tMAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n+\n+\ttestcases[0] = (struct testcase){\n+\t\t.desc = \"uaddr unmapped\",\n+\t\t.uaddr = unmapped,\n+\t\t.uaddr2 = &futex_var,\n+\t\t.exp_errno = EFAULT,\n+\t};\n+\ttestcases[1] = (struct testcase){\n+\t\t.desc = \"uaddr2 unmapped\",\n+\t\t.uaddr = &futex_var,\n+\t\t.uaddr2 = unmapped,\n+\t\t.exp_errno = EFAULT,\n+\t};\n+\ttestcases[2] = (struct testcase){\n+\t\t.desc = \"uaddr PROT_NONE\",\n+\t\t.uaddr = prot_none_addr,\n+\t\t.uaddr2 = &futex_var,\n+\t\t.exp_errno = tst_kvercmp(5, 9, 0) >= 0 ? EACCES : EFAULT,\n+\t};\n+}\n+\n+static void cleanup(void)\n+{\n+\tif (prot_none_addr)\n+\t\tSAFE_MUNMAP(prot_none_addr, getpagesize());\n+}\n+\n+static struct tst_test test = {\n+\t.setup = setup,\n+\t.cleanup = cleanup,\n+\t.test = run,\n+\t.tcnt = ARRAY_SIZE(testcases),\n+\t.test_variants = ARRAY_SIZE(variants),\n+};\ndiff --git a/testcases/kernel/syscalls/futex/futex_wait06.c b/testcases/kernel/syscalls/futex/futex_wait06.c\nnew file mode 100644\nindex 000000000..8bb563fb2\n--- /dev/null\n+++ b/testcases/kernel/syscalls/futex/futex_wait06.c\n@@ -0,0 +1,73 @@\n+// SPDX-License-Identifier: GPL-2.0-or-later\n+/*\n+ * Copyright (C) 2026 Red Hat, Inc.\n+ */\n+\n+/*\\\n+ * Check that futex(FUTEX_WAIT) returns EFAULT when:\n+ *\n+ * 1) uaddr points to unmapped memory\n+ * 2) timeout points to unmapped memory\n+ */\n+#include <errno.h>\n+#include <sys/mman.h>\n+\n+#include \"futextest.h\"\n+\n+static futex_t futex = FUTEX_INITIALIZER;\n+\n+static struct futex_test_variants variants[] = {\n+#if (__NR_futex != __LTP__NR_INVALID_SYSCALL)\n+\t{ .fntype = FUTEX_FN_FUTEX, .tstype = TST_KERN_OLD_TIMESPEC, .desc = \"syscall with old kernel spec\"},\n+#endif\n+\n+#if (__NR_futex_time64 != __LTP__NR_INVALID_SYSCALL)\n+\t{ .fntype = FUTEX_FN_FUTEX64, .tstype = TST_KERN_TIMESPEC, .desc = \"syscall time64 with kernel spec\"},\n+#endif\n+};\n+\n+static struct testcase {\n+\tconst char *desc;\n+\tfutex_t *uaddr;\n+\tvoid *timeout;\n+} testcases[2];\n+\n+static void run(unsigned int n)\n+{\n+\tstruct futex_test_variants *tv = &variants[tst_variant];\n+\tstruct testcase *tc = &testcases[n];\n+\n+\tTST_EXP_FAIL(futex_syscall(tv->fntype, tc->uaddr, FUTEX_WAIT, futex,\n+\t\ttc->timeout, NULL, 0, 0), EFAULT, \"%s\", tc->desc);\n+}\n+\n+static void setup(void)\n+{\n+\tstruct futex_test_variants *tv = &variants[tst_variant];\n+\tvoid *bad;\n+\n+\ttst_res(TINFO, \"Testing variant: %s\", tv->desc);\n+\tfutex_supported_by_kernel(tv->fntype);\n+\n+\tbad = SAFE_MMAP(NULL, getpagesize(), PROT_READ | PROT_WRITE,\n+\t\tMAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n+\tSAFE_MUNMAP(bad, getpagesize());\n+\n+\ttestcases[0] = (struct testcase){\n+\t\t.desc = \"uaddr points to unmapped memory\",\n+\t\t.uaddr = bad,\n+\t\t.timeout = NULL,\n+\t};\n+\ttestcases[1] = (struct testcase){\n+\t\t.desc = \"timeout points to unmapped memory\",\n+\t\t.uaddr = &futex,\n+\t\t.timeout = bad,\n+\t};\n+}\n+\n+static struct tst_test test = {\n+\t.setup = setup,\n+\t.test = run,\n+\t.tcnt = ARRAY_SIZE(testcases),\n+\t.test_variants = ARRAY_SIZE(variants),\n+};\ndiff --git a/testcases/kernel/syscalls/futex/futex_wait07.c b/testcases/kernel/syscalls/futex/futex_wait07.c\nnew file mode 100644\nindex 000000000..a3c1c153d\n--- /dev/null\n+++ b/testcases/kernel/syscalls/futex/futex_wait07.c\n@@ -0,0 +1,117 @@\n+// SPDX-License-Identifier: GPL-2.0-or-later\n+/*\n+ * Copyright (C) 2026 Red Hat, Inc.\n+ */\n+\n+/*\\\n+ * Check that futex(FUTEX_WAIT) returns EINTR when interrupted by a signal.\n+ * A child process blocks on futex_wait() with a long timeout. The parent\n+ * waits for the child to enter sleep state, then sends SIGUSR1 to it.\n+ * The child verifies it received EINTR and exits accordingly.\n+ */\n+\n+#include <errno.h>\n+#include <signal.h>\n+#include <sys/wait.h>\n+\n+#include \"futextest.h\"\n+\n+static futex_t *futex;\n+\n+static struct futex_test_variants variants[] = {\n+#if (__NR_futex != __LTP__NR_INVALID_SYSCALL)\n+\t{ .fntype = FUTEX_FN_FUTEX, .tstype = TST_KERN_OLD_TIMESPEC, .desc = \"syscall with old kernel spec\"},\n+#endif\n+\n+#if (__NR_futex_time64 != __LTP__NR_INVALID_SYSCALL)\n+\t{ .fntype = FUTEX_FN_FUTEX64, .tstype = TST_KERN_TIMESPEC, .desc = \"syscall time64 with kernel spec\"},\n+#endif\n+};\n+\n+/* We need a handler so SIGUSR1 is caught instead of killing the process.\n+ * The empty body is needed, just receiving the signal is enough to\n+ * interrupt futex_wait() and make it return into EINTR -1 status.\n+ */\n+static void sigusr1_handler(int sig LTP_ATTRIBUTE_UNUSED)\n+{\n+}\n+\n+static void do_child(void)\n+{\n+\tstruct futex_test_variants *tv = &variants[tst_variant];\n+\tstruct sigaction sa;\n+\tstruct tst_ts timeout;\n+\tint res;\n+\n+\t/* Set up the signal handler for SIGUSR1 */\n+\tsa.sa_handler = sigusr1_handler;\n+\tsa.sa_flags = 0;\n+\tSAFE_SIGEMPTYSET(&sa.sa_mask);\n+\tSAFE_SIGACTION(SIGUSR1, &sa, NULL);\n+\n+\t/* Create a timeout for 5 sec for this variant.\n+\t * if no one wakes the child before 5 sec, futex_wait() will return\n+\t * on its own with ETIMEDOUT and will not wait any longer\n+\t */\n+\ttimeout = tst_ts_from_ms(tv->tstype, 5000);\n+\tres = futex_wait(tv->fntype, futex, *futex, &timeout, 0);\n+\n+\tif (res != -1) {\n+\t\ttst_res(TFAIL, \"futex_wait() should have failed with EINTR but returned success instead\");\n+\t\texit(1);\n+\t}\n+\tif (errno != EINTR) {\n+\t\ttst_res(TFAIL | TERRNO, \"futex_wait() expected EINTR but got something else, errno\");\n+\t\texit(1);\n+\t}\n+\ttst_res(TPASS | TERRNO, \"futex_wait() returned EINTR as expected\");\n+\texit(0);\n+}\n+\n+static void run(void)\n+{\n+\tpid_t child;\n+\tint status;\n+\n+\tchild = SAFE_FORK();\n+\n+\tif (child == 0) {\n+\t\tdo_child();\n+\t}\n+\t/* Wait until child is sleeping before sending signal */\n+\tTST_PROCESS_STATE_WAIT(child, 'S', 0);\n+\t/* Wake up the child so it will return EINTR -1 status */\n+\tSAFE_KILL(child, SIGUSR1);\n+\tSAFE_WAITPID(child, &status, 0);\n+\t/* Check if the child finished everything as it should */\n+\tif (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {\n+\t\ttst_res(TFAIL, \"child exited abnormally\");\n+\t}\n+}\n+\n+static void setup(void)\n+{\n+\tstruct futex_test_variants *tv = &variants[tst_variant];\n+\n+\ttst_res(TINFO, \"Testing variant: %s\", tv->desc);\n+\tfutex_supported_by_kernel(tv->fntype);\n+\n+\t/* Futex needs to be in a shared memory so the parent and the child can access into it */\n+\tfutex = SAFE_MMAP(NULL, sizeof(*futex), PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, -1, 0);\n+\t*futex = FUTEX_INITIALIZER;\n+}\n+\n+static void cleanup(void)\n+{\n+\tif (futex) {\n+\t\tSAFE_MUNMAP((void *)futex, sizeof(*futex));\n+\t}\n+}\n+\n+static struct tst_test test = {\n+\t.setup = setup,\n+\t.cleanup = cleanup,\n+\t.test_all = run,\n+\t.test_variants = ARRAY_SIZE(variants),\n+\t.forks_child = 1,\n+};\ndiff --git a/testcases/kernel/syscalls/futex/futex_wake05.c b/testcases/kernel/syscalls/futex/futex_wake05.c\nnew file mode 100644\nindex 000000000..1e9bd6435\n--- /dev/null\n+++ b/testcases/kernel/syscalls/futex/futex_wake05.c\n@@ -0,0 +1,86 @@\n+// SPDX-License-Identifier: GPL-2.0-or-later\n+/*\n+ * Copyright (C) 2026 Red Hat, Inc.\n+ */\n+\n+/*\\\n+ * Check that futex(FUTEX_WAKE) returns EFAULT when uaddr points to\n+ * unmapped or PROT_NONE memory.\n+ *\n+ * Note: FUTEX_WAKE never reads *uaddr, so PROT_NONE triggers EFAULT\n+ * (not EACCES). The EACCES behavior only applies to syscalls that read\n+ * *uaddr (e.g. FUTEX_WAIT, FUTEX_CMP_REQUEUE).\n+ */\n+\n+#include <errno.h>\n+#include <sys/mman.h>\n+#include \"futextest.h\"\n+\n+static futex_t *prot_none_addr;\n+\n+static struct futex_test_variants variants[] = {\n+#if (__NR_futex != __LTP__NR_INVALID_SYSCALL)\n+\t{ .fntype = FUTEX_FN_FUTEX, .desc = \"syscall with old kernel spec\"},\n+#endif\n+\n+#if (__NR_futex_time64 != __LTP__NR_INVALID_SYSCALL)\n+\t{ .fntype = FUTEX_FN_FUTEX64, .desc = \"syscall time64 with kernel spec\"},\n+#endif\n+};\n+\n+static struct testcase {\n+\tconst char *desc;\n+\tfutex_t *addr;\n+\tint exp_errno;\n+} testcases[2];\n+\n+static void run(unsigned int n)\n+{\n+\tstruct futex_test_variants *tv = &variants[tst_variant];\n+\tstruct testcase *tc = &testcases[n];\n+\n+\tTST_EXP_FAIL(futex_wake(tv->fntype, tc->addr, 1, 0),\n+\t\ttc->exp_errno, \"%s\", tc->desc);\n+}\n+\n+static void setup(void)\n+{\n+\tstruct futex_test_variants *tv = &variants[tst_variant];\n+\tsize_t pagesize = getpagesize();\n+\tfutex_t *unmapped;\n+\n+\ttst_res(TINFO, \"Testing variant: %s\", tv->desc);\n+\tfutex_supported_by_kernel(tv->fntype);\n+\n+\tunmapped = SAFE_MMAP(NULL, pagesize, PROT_READ | PROT_WRITE,\n+\t\tMAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n+\tSAFE_MUNMAP(unmapped, pagesize);\n+\n+\tprot_none_addr = SAFE_MMAP(NULL, pagesize, PROT_NONE,\n+\t\tMAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n+\n+\ttestcases[0] = (struct testcase){\n+\t\t.desc = \"uaddr unmapped\",\n+\t\t.addr = unmapped,\n+\t\t.exp_errno = EFAULT,\n+\t};\n+\ttestcases[1] = (struct testcase){\n+\t\t.desc = \"uaddr PROT_NONE\",\n+\t\t.addr = prot_none_addr,\n+\t\t.exp_errno = EFAULT,\n+\t};\n+}\n+\n+static void cleanup(void)\n+{\n+\tif (prot_none_addr)\n+\t\tSAFE_MUNMAP(prot_none_addr, getpagesize());\n+}\n+\n+static struct tst_test test = {\n+\t.setup = setup,\n+\t.cleanup = cleanup,\n+\t.test = run,\n+\t.tcnt = ARRAY_SIZE(testcases),\n+\t.test_variants = ARRAY_SIZE(variants),\n+};\n", "prefixes": [ "v2" ] }