From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.openvz.org (unknown [69.168.225.77]) by lore.virtuozzo.com (Postfix) with ESMTPS id 2729480A50 for ; Wed, 14 Oct 2026 17:14:08 +0000 (UTC) Received: from mail.openvz.org (localhost [127.0.0.1]) by mail.openvz.org (8.14.4/8.14.4) with ESMTP id 69EHCsBP001381; Wed, 14 Oct 2026 20:12:55 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 69EHCsBP001381 Authentication-Results: mail.openvz.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="yLy4u1XD" Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by mail.openvz.org (8.14.4/8.14.4) with ESMTP id 69EHCVnU001317 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=FAIL) for ; Wed, 14 Oct 2026 20:12:32 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 69EHCVnU001317 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-4a0228f4a1bso25610715e9.1 for ; Wed, 14 Oct 2026 10:12:31 -0700 (PDT) X-Gm-Message-State: AFq9FYJNioe4QAi5jz4YLBNCgHQcVkx71hbEXsjHl8MZ6mu2W8wdc5FE PHwMBGbc1oBsa1JHoXPkDoCytNPEX069d+PBHaJ9rRvtEIAVsjy2fQGlwzu4vZX+iofXioDIxU5 jg2mR5BshsfTo2lQWYMDEHBboj/QPa8VuBgEmGG2eOklFXl4WZhR4Pg== X-Gm-Gg: AYBFou14b4bHkPpIl8dnj3i6sm7qL1xAWaT3RXmcArue7deDY8WPsmcZvvdyPtJFbNe G9rsHAtja85eCYYGPX4akTNxM4AhTDFIaCc5fJ1T/gRceTv7cXdPPSuBJTDMJB6j1LnMBUsuKdR AT5UEOYmT9RG/83vQCZblJl4wXsEzbQI8ulIJcL0q6Sm5sGu9ByA4K6B1DAOpzuKobOLvCVdYnu Ce/Lu0ylBJnrZAVobR+3TTZo700K+bEMos92hKWee51BALolOFH5VFFlo31oGMI4eDeIJgWhdnK fmXMiqkzoE0QnfsqVAwFmoCgyFEoNrnp4TEOye1PmWHUBQzkwtnA1vGJj2sUJM2e7e/85G7HHWo gWoDfFsttNc4YlCmQ/w== X-Received: by 2002:a05:600c:580b:b0:4a1:688d:a43f with SMTP id 5b1f17b1804b1-4a18e4c9908mr239151375e9.35.1791997951042; Wed, 14 Oct 2026 10:12:31 -0700 (PDT) X-Received: by 2002:a05:600c:580b:b0:4a1:688d:a43f with SMTP id 5b1f17b1804b1-4a18e4c9908mr239150895e9.35.1791997950496; Wed, 14 Oct 2026 10:12:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1791997950; cv=none; d=google.com; s=arc-20260327; b=SczBlG/wDgfFrQhX377OW3df0tQzsyFpioeC4YHqL0iD43+dTx4u5spBewmI8v5+lF usljk/PvJYwIV4cChJO84h8/leC//Xe5AW5r4ASYUhf6xde14Y5J7MmfHwxQT+mQZkM2 hzl5ZQba6LDt8zgRBEv/OGqq1vmSuibLbDU6e3qZYTMtX3wFF8BVZW1LdNNmv05O2Iq4 ZekYdd3v1nVBLTjkKNHyUjGsOissjstKZ3tpbm11b4sZSjsBW8Vf6vKkLhStwKdv2BZY nZyMxdAao944OV+kHmicRxIWddr8ORHrJKzUSCj3/1m6MjxufsBhiGNsRfVL+AIOoJYh FhdQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:dkim-signature; bh=q2gHpqUisbAY7TSN1L9tH+yKwTwlVbLn+eKocY7w8HI=; fh=xUcS46XhSaUOWFT7CPWNuABJ4EJ7/+S5u4N+e+rlWN4=; b=NmpIPxquKX/nMOtbyqT7/VPOyS0Lp7jdIiADjYgC2EJgrO5U7OezxkhXxwXRV+aKb0 9dz4zGjOtfOVMeXM6axtczSxmhpEifYSMSbPIZICwhBDRqmJpbbD/32YSXCkX7prX1ij riJQ9wMMjSB2t6Go1d1qPf/vi4tc6VYawQyeAxIr/SnYYajEaZnAegTaM0zIXXr28Qwx OX+vlah2AHpbwA/mMl4s1vdyZ9E7lAKnBCdC9ug4fWSKpSKkRPRHQORNa4c9HGYbVWhs CPWkTAoEfSNv+zfXP6OQqYizkcwSnqb4xS6lXx7NjxTuOodpARk1zhBLki6O+o3ArCun KK9g==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=relay header.b=yLy4u1XD; spf=pass (google.com: domain of khorenko@virtuozzo.com designates 130.117.225.111 as permitted sender) smtp.mailfrom=khorenko@virtuozzo.com; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=virtuozzo.com Received: from relay.virtuozzo.com (relay.virtuozzo.com. [130.117.225.111]) by mx.google.com with ESMTPS id ffacd0b85a97d-48deff5d262si2317699f8f.357.2026.10.14.10.12.30 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 14 Oct 2026 10:12:30 -0700 (PDT) Received-SPF: pass (google.com: domain of khorenko@virtuozzo.com designates 130.117.225.111 as permitted sender) client-ip=130.117.225.111; Authentication-Results: mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=relay header.b=yLy4u1XD; spf=pass (google.com: domain of khorenko@virtuozzo.com designates 130.117.225.111 as permitted sender) smtp.mailfrom=khorenko@virtuozzo.com; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=virtuozzo.com DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=virtuozzo.com; s=relay; h=Message-Id:Content-Type:MIME-Version:Subject:Date :From; bh=q2gHpqUisbAY7TSN1L9tH+yKwTwlVbLn+eKocY7w8HI=; b=yLy4u1XDFpwQE2wHuau rXCvI3mWXM0fEJBct7pLUlg5yrtS0r3G5yyb768z0RLuGFACrxfs6gd9d7XqyC6msz+RNX6lzcvr5 4J4joX/P6I9LIRUcLbdbE7M3yFJsvk26P4gvQXlN69tzPw9m4aanXiCt7oqLv0KYm158Bx+Ma6Le8 WqWL5PI2aTA19ubIFwinlvYxLmlkqcswXbmXDo7O6wx0k/wtBxHXb7BecEk0dxhM643x1SGNZbLIO i+bUCNUG94/AkpoG0/nj5QbSm9FGeIVOpuczKSBdHOZHglAHlg0zdSl/i9zPipxKf7CJZ6XqbsJgg QGqLDNbZ2aPx9UA==; Received: from ch-demo-asa.virtuozzo.com ([130.117.225.8] helo=f0.sw.ru) by relay.virtuozzo.com with esmtp (Exim 4.96) (envelope-from ) id 1xH2TJ-0082VK-0B; Wed, 14 Oct 2026 19:12:29 +0200 From: Konstantin Khorenko Date: Wed, 14 Oct 2026 19:12:26 +0200 MIME-Version: 1.0 Message-Id: <20261014-b4-prep-khorenko-vstor-149847-3-doexec-oracle-fixes-v1-7-e34cbe0d1440@virtuozzo.com> References: <20261014-b4-prep-khorenko-vstor-149847-3-doexec-oracle-fixes-v1-0-e34cbe0d1440@virtuozzo.com> In-Reply-To: <20261014-b4-prep-khorenko-vstor-149847-3-doexec-oracle-fixes-v1-0-e34cbe0d1440@virtuozzo.com> To: Pavel Tikhomirov , Andrey Drobyshev , Vasileios Almpanis X-Mailer: b4 0.16.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=5230; i=khorenko@virtuozzo.com; h=from:subject:message-id; bh=oKXNcrLZCPxyELMlMF3VBHH9+OxyOlmcnNrJ1jhbi9M=; b=owEBbQKS/ZANAwAKAVGWCkf5YVwqAcsmYgBqz7f7ZTS+iR0B14fiEKKRdKDy99ULGbpD78nyo dnke0pJY1+JAjMEAAEKAB0WIQRWD23IPcXT0GO9CCxRlgpH+WFcKgUCas+3+wAKCRBRlgpH+WFc KrcZD/9vHnthzfBC8r5v8BtBN8MBLc88DnCuN0g53RsFERqgkb3pqJcaGjHEBhDfFrR3QzJ33F+ FBoVaNAcErLKJhpBKu0Q5qhkycrBlwlS2b/l6/Sfuk2KrApif8JdhuHJQjefMmCTOgHSWH9hxxt VE6VscMf/zRLCVM9dcea6j3uwEXz/tjwDO5k+MqjyxlDpHX+wORmF6D25zcmkigw8api4ZCCie4 /LDLxRq8b/6Xgv7qwqX6anYuvCOo6daZVEWSjfbgnGqS628lHHwYsDMtYb5WnC+dtztX2x2lIL8 cQi65Vq8nq6pE5663TKOP8oS/86URNXHwxrTrCzL2qNgvWbR9KLdkjtg5Uk06apD2I/J4v0bim7 3CpeFqb8n41uY3IEjpyKj7MqDwHfZYCA3rqb6+KTq8mSCdrJzXn834CoIN473s1kjwni4jlnj6q TwIvSpOSt8NMjeWfL4btj4QRfziJyN3aH3hjYKxJ/N8sWJsQfSP++mBuEI44K7TLfFz3rfmclUx 0pWWozR+cBnIYwAYFrz+Ecf5a9YrMUOzIEl2WVepcfAUfiHi2aP3CSzLwhwoIIxPt9VLABCfnfj JNwAruGCEihhsjlSydWDrrYC9PwGZU1iMYQg8jIfTJ/4sP1oSGnQV8fGmZfqtqBsDW6lcSzL4fF hLNwXxhBPtgerGQ== X-Developer-Key: i=khorenko@virtuozzo.com; a=openpgp; fpr=560F6DC83DC5D3D063BD082C51960A47F9615C2A X-OZ-Fwd: true Cc: devel@openvz.org Subject: [Devel] [PATCH hci-8.1 7/7] selftests/mm: check MADV_DOEXEC on /dev/zero and exec permission X-BeenThere: devel@openvz.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: OpenVZ development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: devel-bounces@openvz.org Errors-To: devel-bounces@openvz.org Add two cases to doexec: - A private /dev/zero mapping is marked and preserved across exec. The mapping is anonymous but holds a reference to the file; a copy that does not take its own shows up as an fput() underflow at teardown. - A marked range cannot be made executable until MADV_DONTEXEC, and MADV_DONTEXEC does not make a /dev/zero mapping from a noexec tmpfs executable. The noexec part needs a private mount namespace, a tmpfs mount and a /dev/zero node on it; the case is reported as skipped when it cannot get them. https://virtuozzo.atlassian.net/browse/VSTOR-150232 Feature: oracle/mm: MADV_DOEXEC madvise() flag Assisted-by: LLM Signed-off-by: Konstantin Khorenko --- tools/testing/selftests/mm/doexec.c | 94 ++++++++++++++++++++++++++++++++++++- 1 file changed, 92 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/mm/doexec.c b/tools/testing/selftests/mm/doexec.c index dfa3da2c43934..97e045ba678e8 100644 --- a/tools/testing/selftests/mm/doexec.c +++ b/tools/testing/selftests/mm/doexec.c @@ -17,10 +17,12 @@ #include #include #include +#include #include #include #include #include +#include #include #include @@ -501,6 +503,88 @@ static int setuid_exec(void) return ret; } +/* A private /dev/zero mapping is anonymous but holds a file reference. */ +static int devzero_exec(void) +{ + size_t size = 16 * sysconf(_SC_PAGESIZE); + int fd = open("/dev/zero", O_RDWR); + char *ram; + + if (fd < 0) + return KSFT_SKIP; + ram = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); + close(fd); + if (ram == MAP_FAILED) + return KSFT_FAIL; + memset(ram, 0x31, size); + if (madvise(ram, size, MADV_DOEXEC)) + return errno == EINVAL ? KSFT_SKIP : KSFT_FAIL; + check_exec(ram, size, 1, false); + return KSFT_FAIL; +} + +static bool exec_refused(char *ram, size_t size) +{ + return mprotect(ram, size, PROT_READ | PROT_EXEC) && errno == EACCES; +} + +/* MADV_DONTEXEC must not grant more than mmap() did on a noexec mount. */ +static int noexec_dontexec(void) +{ + size_t size = sysconf(_SC_PAGESIZE); + char dir[] = "/tmp/doexec-noexec.XXXXXX", node[64]; + int fd, ret = KSFT_FAIL; + char *ram; + + if (unshare(CLONE_NEWNS) || mount(NULL, "/", NULL, MS_REC | MS_PRIVATE, NULL) || + !mkdtemp(dir)) + return KSFT_SKIP; + if (mount("tmpfs", dir, "tmpfs", MS_NOEXEC, NULL)) { + rmdir(dir); + return KSFT_SKIP; + } + snprintf(node, sizeof(node), "%s/zero", dir); + fd = mknod(node, S_IFCHR | 0600, makedev(1, 5)) ? -1 : open(node, O_RDWR); + if (fd < 0) { + ret = KSFT_SKIP; + goto out; + } + ram = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); + close(fd); + if (ram == MAP_FAILED || !exec_refused(ram, size)) { + ret = KSFT_SKIP; + goto out; + } + if (madvise(ram, size, MADV_DOEXEC)) { + ret = errno == EINVAL ? KSFT_SKIP : KSFT_FAIL; + goto out; + } + if (!madvise(ram, size, MADV_DONTEXEC) && exec_refused(ram, size)) + ret = KSFT_PASS; +out: + umount2(dir, MNT_DETACH); + rmdir(dir); + return ret; +} + +/* A marked range cannot become executable until it is unmarked. */ +static int doexec_noexec(void) +{ + size_t size = sysconf(_SC_PAGESIZE); + char *ram = preserved_ram(size); + int ret; + + if (!ram) + return errno == EINVAL ? KSFT_SKIP : KSFT_FAIL; + if (!exec_refused(ram, size) || madvise(ram, size, MADV_DONTEXEC) || + mprotect(ram, size, PROT_READ | PROT_EXEC)) + return KSFT_FAIL; + ret = noexec_dontexec(); + if (ret == KSFT_SKIP) + ksft_print_msg("noexec mount part skipped\n"); + return ret; +} + static void *exec_thread(void *arg) { check_exec(arg, sysconf(_SC_PAGESIZE), 1, false); @@ -861,7 +945,7 @@ int main(int argc, char **argv) return KSFT_PASS; } ksft_print_header(); - ksft_set_plan(NR_TESTS + 9); + ksft_set_plan(NR_TESTS + 11); for (kind = 0; kind < NR_TESTS; kind++) { fflush(stdout); pid = fork(); @@ -884,7 +968,7 @@ int main(int argc, char **argv) ksft_test_result_skip("pre-existing COW: DOEXEC unavailable\n"); else ksft_test_result(ret == KSFT_PASS, "pre-existing COW preserved\n"); - for (kind = 0; kind < 8; kind++) { + for (kind = 0; kind < 10; kind++) { static const char * const extra_names[] = { "CLONE_VM: recoverable EBUSY and retry", "own threads: preserving exec allowed", @@ -894,6 +978,8 @@ int main(int argc, char **argv) "proc readers: repeated preserving exec allowed", "concurrent CLONE_VM: shared memory is not stolen", "setuid exec: preserving exec refused", + "private /dev/zero mapping: preserved across exec", + "marked range: not executable until unmarked", }; fflush(stdout); @@ -915,6 +1001,10 @@ int main(int argc, char **argv) _exit(clone_exec_race()); case 7: _exit(setuid_exec()); + case 8: + _exit(devzero_exec()); + case 9: + _exit(doexec_noexec()); } } ret = pid < 0 ? KSFT_FAIL : wait_child(pid); -- 2.43.0 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel