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 AE76680726 for ; Wed, 21 Oct 2026 16:58:58 +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 69LGvZmW023005; Wed, 21 Oct 2026 19:57:35 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 69LGvZmW023005 Authentication-Results: mail.openvz.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="njT/Ev/7" Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) by mail.openvz.org (8.14.4/8.14.4) with ESMTP id 69LGvNZt022943 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=FAIL) for ; Wed, 21 Oct 2026 19:57:23 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 69LGvNZt022943 Received: by mail-wr1-f71.google.com with SMTP id ffacd0b85a97d-48e1d839ddaso656430f8f.3 for ; Wed, 21 Oct 2026 09:57:23 -0700 (PDT) X-Gm-Message-State: AFq9FYJlit9dqI5k12CDJJ6gPBHApb2Hg4BeGJAVaNVvG3qUhfD7d+sp qYeBJJthuGvn947W04hggZw2lVdTqaHdmCnTzcSM9RXeG9d9Ljfj8dPMqC+f58R21R6bV8t2moT liMhvt38KF44X0FeQapbBesLsNNzGC95MQOI0OjtuWK5JGet+O3OTaA== X-Gm-Gg: AYBFou0KpAezhd8IRg2YnTJAPRSPfp1QL5LnOTqarnq+FVH1pME7DXJoef1beV1Td0A qMjf5KN+LDdUpdPexKP2+OEl6GxC7zLNx2sIQeOxE4YKtt9NHuYdTkm9bS8gFY8XeEVRFpn6AQm Lsy0BFvrukn0FsqT5S8lXp8SE62gX2nhR2IcUlry+25tKUoyBkuSXGjDBn662fT6/76OnstJXRP 3UzYFlCPsiuVSmEr7HJf8uVh8H2trxhqttoWKY/AuT1Sgj/CiF++vC3cnIXIm+3EzqDONXHEhwO cMW17uHCm4z86JMBCHZSvgJn5esVFhpjtY533/q37ewIuy+N+gGL/0V2T30zSr5TUCbt1UhZjtW hIS+P9T5NzLhIu3rViw== X-Received: by 2002:a05:6000:2009:b0:48d:f324:4621 with SMTP id ffacd0b85a97d-48e264dfd43mr4830661f8f.52.1792601842770; Wed, 21 Oct 2026 09:57:22 -0700 (PDT) X-Received: by 2002:a05:6000:2009:b0:48d:f324:4621 with SMTP id ffacd0b85a97d-48e264dfd43mr4830615f8f.52.1792601842221; Wed, 21 Oct 2026 09:57:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1792601842; cv=none; d=google.com; s=arc-20260327; b=GXVtbZhj1yAMpVnOkllRrCEbJnC26H+mbFqNGHQx6Sk6taWun3+4BTME/xFKClzyZB SFf7TpGmXMexy6mMb/YmW9btkbQkPNekGAp1zcOG3jVWVwVfZYSpkROP8ME37miCxgei 4esyMJSCA4TuKqPGU/MxMLdh+x+t9NG1rBvFbyCG0L8nBHZ558gUYcyz11mgdxewD4bT 1IrSIr0iDb7WNJcAyEH0I1lm0xWWq7RIzNAgMRdfyXeJNdh1drDhakx9vFCuMRtmtyxo Q/MF8zzGvQwZpr0QxM51PO3wJ4JfM1UrKVadZq/lj9epghH1ez3JqK077cTSsaYkgzmT OJ2Q== 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=LgDn+5VuSHVuWUfQE8PR4Dtxf5tle2Vu8t77T43TDIc=; fh=ORqO450YHYjnAvQVnHrQRoSXc/Ljts4WdUx12SqEe+w=; b=ZCezEZdUUVv9eoDGzEJOVx5k9ACSfDji8ZMhzOdgSUrUIu78RTLplQA2W6xogi3Jr5 nG1lCAY4rCQ30k0DhFX6chhSEW4q7abYjii2Ltpm2i6z2ECVMF/fkc80n90TEv7DC/+1 vecm5WKwIFyVxVTOvI8W0iIWO6h89nr/9/MIkSaty52+exWH45kik2YxNKf7c4EnjNTK zlr9R67r+AtNmGSyP3tVPXFa+eLQSt+xl1h0Twc0+1L0owWaowCDlayGPr4+LJYfxfsG 2bdlxE44urhaKu5Bb8R3eLOEbQt64qnG42ApFFY7wXY/BR2qva4JY+Mr8TfMLstsz4eu SgmQ==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=relay header.b="njT/Ev/7"; 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-48e258835b8si5822745f8f.376.2026.10.21.09.57.22 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 21 Oct 2026 09:57:22 -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="njT/Ev/7"; 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=LgDn+5VuSHVuWUfQE8PR4Dtxf5tle2Vu8t77T43TDIc=; b=njT/Ev/78nrWLmOerfA +FZ1fi4vvEEJtz1dENwG7YW0sNxiUXmkOBvkjJLaUy3A13WiUXHOTNjYRtJ2txeWIi8+QmuNSdnVw ilIDDzzwUv2yI/B0OvEU7Zq3ns1Y+SQu9IEroR+oUNV9Yr5SOd8T9Fxts5MRy1fpvLXa7TQ9A1w8N xVFCWajGj+QhDQ3KZs3uh1DNSjlPJ/mAVFyF3rQAqQqkkvcQhcbvcCzViOVJcEWzEIVjz/is1Jjmi 3H4DgNypqTIMQdMigup4zL1ELZ4TNS4aX+RgQbF3yOAl/QGX2c4rH7W17i++waJBqH9SrtnlMkVL0 6j/i+d0dOgrfuUA==; 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 1xJZZK-008y7H-0L; Wed, 21 Oct 2026 18:57:20 +0200 From: Konstantin Khorenko Date: Wed, 21 Oct 2026 18:57:18 +0200 MIME-Version: 1.0 Message-Id: <20261021-b4-prep-khorenko-vstor-149847-5-doexec-selftests-v2-5-97dbb5c6e0ab@virtuozzo.com> References: <20261021-b4-prep-khorenko-vstor-149847-5-doexec-selftests-v2-0-97dbb5c6e0ab@virtuozzo.com> In-Reply-To: <20261021-b4-prep-khorenko-vstor-149847-5-doexec-selftests-v2-0-97dbb5c6e0ab@virtuozzo.com> To: Andrey Drobyshev , Pavel Tikhomirov , Vasileios Almpanis X-Mailer: b4 0.16.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=4927; i=khorenko@virtuozzo.com; h=from:subject:message-id; bh=YTt6rUn8jiXJ0cnsuFcrgR5+MW2Nu1Hr7pLoRl4eI7U=; b=owEBbQKS/ZANAwAKAVGWCkf5YVwqAcsmYgBq2O7uXu4vG05GgPlcnyjIZ8c4blyNr/Gnc5rQn HKGXzLb/TeJAjMEAAEKAB0WIQRWD23IPcXT0GO9CCxRlgpH+WFcKgUCatju7gAKCRBRlgpH+WFc KjWBD/9fx7qZmqgYyGC+cJxUIIgqOLUSTBoDBEliCd6WQ7jOdR3mZP/abCpycPUZ6AnAmfHks82 qo6eaG26rtLBx7itaVlJiGrExSNwTgjBYHpBzzqMTrHmrbDVFrOIw2YZoXyJL/tazvMbqDH/V4D K6ZQl1dvb9J5IQq9XlClqROGNQqpXB1xGhH5936yEBbkvepVishF5Idc8mw2p4OH18jgCbBRV9o qMOW6kQCygJEVqqLvxnvmIKIbORaIx8EWqQOsI6wHOrmcJohnMMRjRACb02bFVxNtYDymtRUmLC zuiHFTLZPMsOL/dTmhNoQ8sTpvp6IyyereWDBzxeeB+NqOjLu1H9nA4ijf7Wy9XEiF9kLy58BBA immZ+Po+h7tIVxN0DX6QvKYlmTL1dqC/rREtxCevzSRyb4Nt+DZPZUcgyjjpOFc0dOTdVC0PEx3 jPJUPdTlqnXH56iLkf4T+0ZosbbZaaAAXWQMI6FcHJ26Gu4XoRwiqgbMmhaeiy5BKvlaV431w+c 7kLC9G0In9UPnQHpCyVpb+PK8HXZ9rmkhdINFucfm6QVEuHvb9VstEdEosNHz33nHkpNjEQ6UUn QsHsmKpePxuJbVye+O7pr4KEAykpbzKbPPZr6FgTLkemRS3aAwXB4Cju7dUuFOvVA/v+OfWCu2x vugI1KQ8V3m6oEA== 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 v2 5/9] selftests/mm: check VM_MAYEXEC of MADV_DOEXEC ranges in smaps 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 An EACCES from mprotect(PROT_EXEC) does not prove that VM_MAYEXEC is clear: an LSM or MDWE refuses it the same way. Read the flag from VmFlags as well. Also check that a fork child and the new image get VM_MAYEXEC back, as the mark is dropped from their copies. https://virtuozzo.atlassian.net/browse/VSTOR-150234 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, 64 insertions(+), 30 deletions(-) diff --git a/tools/testing/selftests/mm/doexec.c b/tools/testing/selftests/mm/doexec.c index a77ebd5f99cd4..00bbc8d948b63 100644 --- a/tools/testing/selftests/mm/doexec.c +++ b/tools/testing/selftests/mm/doexec.c @@ -583,9 +583,43 @@ static int devzero_exec(void) return KSFT_FAIL; } +/* Copy the line of the smaps entry of the VMA at @addr that starts with @prefix. */ +static bool smaps_line(char *addr, const char *prefix, char *line, size_t len) +{ + FILE *file = fopen("/proc/self/smaps", "r"); + bool in_vma = false, found = false; + char want[32]; + + if (!file) + return false; + snprintf(want, sizeof(want), "%lx-", (unsigned long)addr); + while (!found && fgets(line, len, file)) { + char *space = strchr(line, ' '); + + if (space && memchr(line, '-', space - line) && !memchr(line, ':', space - line)) + in_vma = !strncmp(line, want, strlen(want)); + else if (in_vma) + found = !strncmp(line, prefix, strlen(prefix)); + } + fclose(file); + return found; +} + +static bool smaps_has_flag(char *addr, const char *flag) +{ + char line[512]; + + return smaps_line(addr, "VmFlags:", line, sizeof(line)) && strstr(line, flag); +} + +/* VM_MAYEXEC ("me") is clear, so mprotect(PROT_EXEC) fails. */ static bool exec_refused(char *ram, size_t size) { - return mprotect(ram, size, PROT_READ | PROT_EXEC) && errno == EACCES; + char line[512]; + + return smaps_line(ram, "VmFlags:", line, sizeof(line)) && + !strstr(line, " me ") && + mprotect(ram, size, PROT_READ | PROT_EXEC) && errno == EACCES; } /* MADV_DONTEXEC must not grant more than mmap() did on a noexec mount. */ @@ -645,35 +679,6 @@ static int doexec_noexec(void) return ret; } -/* Copy the line of the smaps entry of the VMA at @addr that starts with @prefix. */ -static bool smaps_line(char *addr, const char *prefix, char *line, size_t len) -{ - FILE *file = fopen("/proc/self/smaps", "r"); - bool in_vma = false, found = false; - char want[32]; - - if (!file) - return false; - snprintf(want, sizeof(want), "%lx-", (unsigned long)addr); - while (!found && fgets(line, len, file)) { - char *space = strchr(line, ' '); - - if (space && memchr(line, '-', space - line) && !memchr(line, ':', space - line)) - in_vma = !strncmp(line, want, strlen(want)); - else if (in_vma) - found = !strncmp(line, prefix, strlen(prefix)); - } - fclose(file); - return found; -} - -static bool smaps_has_flag(char *addr, const char *flag) -{ - char line[512]; - - return smaps_line(addr, "VmFlags:", line, sizeof(line)) && strstr(line, flag); -} - static int after_pfnmap_exec(char *bar, size_t size) { size_t page = sysconf(_SC_PAGESIZE), i; @@ -1286,6 +1291,33 @@ static int locked_exec(void) return exec_with_flag(ram, size, "--unlocked", " lo "); } +/* Dropping the mark in a copy gives VM_MAYEXEC back. */ +static int mayexec_exec(void) +{ + size_t size = sysconf(_SC_PAGESIZE); + char *ram = preserved_ram(size); + pid_t pid; + + if (!ram) + return unsupported(); + if (!exec_refused(ram, size)) + return fail("VM_MAYEXEC kept by MADV_DOEXEC"); + pid = fork(); + if (!pid) + _exit(smaps_has_flag(ram, " me ") ? KSFT_PASS : KSFT_FAIL); + if (pid < 0 || wait_child(pid) != KSFT_PASS) + return fail("VM_MAYEXEC not back in a fork child"); + exec_mode("/proc/self/exe", "--mayexec", ram, size); + return KSFT_FAIL; +} + +static int after_mayexec(char *ram, size_t size) +{ + if (!smaps_has_flag(ram, " me ")) + return fail("VM_MAYEXEC not back after exec"); + return check_contents(ram, size, 0x31); +} + static int after_unlocked(char *ram, size_t size) { if (smaps_has_flag(ram, " lo ")) @@ -1844,6 +1876,7 @@ static const struct after_mode after_modes[] = { { "--no-uffd", after_no_uffd }, { "--mempolicy", after_mempolicy }, { "--thp-half", after_thp_half }, + { "--mayexec", after_mayexec }, }; struct more_case { @@ -1898,6 +1931,7 @@ static const struct more_case more_cases[] = { { "swapped out pages: preserved", swapped_exec }, { "half of a THP: preserved", thp_half_exec }, { "vfork() child: preserving exec refused", vfork_exec }, + { "exec permission back in a fork child and the new image", mayexec_exec }, }; int main(int argc, char **argv) -- 2.43.0 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel