From nobody Tue Jun 30 01:09:34 2026 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4gq4n02swTz6k9Td for ; Tue, 30 Jun 2026 01:09:40 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "YR1" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4gq4n00MVtz3t96 for ; Tue, 30 Jun 2026 01:09:40 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1782781780; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=8aOtMVR6AHuZe8VL2aEZdwzePjMlYcuBAUFdnOje1X0=; b=FsKtdPaBsxmx/7+0ggR1n1NU+a2AzsLPlYTX0R8d+Odow4L7/Fd6m74D7I5v/991PzsYV2 PuDcbBARaihS9Wb8i3TqDQgYg3u0XrzPMIoeSd//qqh672e50hcXQ8GKmfCjkk6nSzbWB3 7QkawFNzrwRaqUfmt8mH423HrwTfwJb5p7eAmfgcyCPISR11ITsswDzzyvVVpATk7nWiPO 7BShryZC0pq/x0H3T9hIQbGV5j3dakIZX3+u2cDYDq7rru2Wpa8XuSgycOXayU8IfGZMbK AjodqXWOYig1IqF8YbwaJ7NdBqivHEiUpFjW8tTSRCnS93L7+b1F9m7rj2O3BA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1782781780; a=rsa-sha256; cv=none; b=jNwba2EG79lZ+r3Y6i8FcvBe3yC4p5SdP/lb7hcG4vKDn6WBYXYp7tY6ikiZXAGfo59Ss5 uVpiWSkJso4iHWAsGp22KTMkY5wX2F9OQeV7/o45/kiFYYFe2qRAJJXa/TFjm1M3lKIlFr NOXAX/Wt4hu+F2hISDQCYyxJK3uPQJRdZBhiNzqsVPbUu/ozVzibTfjlY/SlFXb/TFV4JV 7KHfbqkaZ6Np4emFSfH/LH+9016G+mnDTvnFtxqGeQKAxx3i0lG8Jg0oryH2ImM8d01bRi vzDtIPgdMYCUT5uuWPh5WMJNWWUrd/QG5GhP8qsCS/DfkeNLjrHzOS9LG5+4Ww== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1782781780; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=8aOtMVR6AHuZe8VL2aEZdwzePjMlYcuBAUFdnOje1X0=; b=juKVJY7MPeMJzR8fgpWw180hA4xW5wAj7dmYwmgByjFec1h6WgGjwxGYZJUL9SC94dvlxS 7IFiclUoMlZVf8aVVVyPbnS+Wqnlu+nIeETQhksI2D6vvVSW40BNyS89Klrt1NwYN0jTSK PFvaU/9LqCVl8zDFdo//efdAq674K3KGTb9+S6Ut4+aKC4jdju93dfC5Nl2/ujycaZO9/i S3qA/saN4OPuBZk8uSxHd+xLv9qJKq3p7MTlF9rF26scvJHHAYMFtdPognmtiLsUupQ8fk 0sf6Roj4wbSpheqbGzCA6ZB9atBceoihXBz22AoSh6JzCsOkx4joTVTKObpCTw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gq4mz5nWCz6b9 for ; Tue, 30 Jun 2026 01:09:39 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 1cceb by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Tue, 30 Jun 2026 01:09:34 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: 2767a1f3686e - main - posix_spawn(3): create a guard page below the stack for rfork_thread on x86 List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kib X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 2767a1f3686e5b1657ff4c3d57737c7f21598125 Auto-Submitted: auto-generated Date: Tue, 30 Jun 2026 01:09:34 +0000 Message-Id: <6a43174e.1cceb.286f155@gitrepo.freebsd.org> The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=2767a1f3686e5b1657ff4c3d57737c7f21598125 commit 2767a1f3686e5b1657ff4c3d57737c7f21598125 Author: Konstantin Belousov AuthorDate: 2026-06-29 22:06:53 +0000 Commit: Konstantin Belousov CommitDate: 2026-06-30 01:09:13 +0000 posix_spawn(3): create a guard page below the stack for rfork_thread on x86 Reviewed by: kevans Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D57955 --- lib/libc/gen/posix_spawn.c | 47 ++++++++++++++++++---------------------------- 1 file changed, 18 insertions(+), 29 deletions(-) diff --git a/lib/libc/gen/posix_spawn.c b/lib/libc/gen/posix_spawn.c index b9d3084ef156..50eda5360767 100644 --- a/lib/libc/gen/posix_spawn.c +++ b/lib/libc/gen/posix_spawn.c @@ -28,6 +28,7 @@ #include "namespace.h" #include +#include #include #include #include @@ -231,19 +232,7 @@ struct posix_spawn_args { volatile int error; }; -#define PSPAWN_STACK_ALIGNMENT 16 -#define PSPAWN_STACK_ALIGNBYTES (PSPAWN_STACK_ALIGNMENT - 1) -#define PSPAWN_STACK_ALIGN(sz) \ - (((sz) + PSPAWN_STACK_ALIGNBYTES) & ~PSPAWN_STACK_ALIGNBYTES) - -/* - * Below we'll assume that _RFORK_THREAD_STACK_SIZE is appropriately aligned for - * the posix_spawn() case where we do not end up calling execvpe and won't ever - * try to allocate space on the stack for argv[]. - */ #define _RFORK_THREAD_STACK_SIZE 4096 -_Static_assert((_RFORK_THREAD_STACK_SIZE % PSPAWN_STACK_ALIGNMENT) == 0, - "Inappropriate stack size alignment"); static int _posix_spawn_thr(void *data) @@ -285,11 +274,13 @@ do_posix_spawn(pid_t *pid, const char *path, pid_t p; int pfd; bool do_pfd; - char *stack; - size_t stacksz; + char *guard, *stack; + size_t stacksz, pagesz; #if defined(__i386__) || defined(__amd64__) stacksz = _RFORK_THREAD_STACK_SIZE; + pagesz = getpagesize(); + if (use_env_path) { size_t cnt; @@ -304,24 +295,21 @@ do_posix_spawn(pid_t *pid, const char *path, for (cnt = 0; argv[cnt] != NULL; ++cnt) ; stacksz += MAX(3, cnt + 2) * sizeof(char *); - stacksz = PSPAWN_STACK_ALIGN(stacksz); } - /* - * aligned_alloc is not safe to use here, because we can't guarantee - * that aligned_alloc and free will be provided by the same - * implementation. We've actively hit at least one application that - * will provide its own malloc/free but not aligned_alloc leading to - * a free by the wrong allocator. - */ - stack = malloc(stacksz); - if (stack == NULL) + stacksz = round_page(stacksz); + guard = mmap(NULL, stacksz + pagesz, 0, MAP_GUARD, -1, 0); + if (guard == MAP_FAILED) return (ENOMEM); - stacksz = (((uintptr_t)stack + stacksz) & ~PSPAWN_STACK_ALIGNBYTES) - - (uintptr_t)stack; + stack = mmap(guard + pagesz, stacksz, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_FIXED | MAP_ANON, -1, 0); + if (stack == MAP_FAILED) { + munmap(guard, stacksz + pagesz); + return (ENOMEM); + } #else - stack = NULL; - stacksz = 0; + guard = stack = NULL; + pagesz = stacksz = 0; #endif psa.path = path; psa.fa = fa; @@ -362,7 +350,8 @@ do_posix_spawn(pid_t *pid, const char *path, p = rfork_thread(RFSPAWN, stack + stacksz, _posix_spawn_thr, &psa); } - free(stack); + if (stack != NULL) + munmap(guard, stacksz + pagesz); /* * The above block should leave us in a state where we've either