From nobody Sat Aug 12 06:29:14 2023 X-Original-To: dev-commits-src-main@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 4RN9jk5T5Zz4TvdM; Sat, 12 Aug 2023 06:29:14 +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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4RN9jk3Lh3z3Y7s; Sat, 12 Aug 2023 06:29:14 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1691821754; 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=sYlSVw7dDCBP7M6HGv1PYEciSfqt7lkZUeq4tdEozJM=; b=PcE2vJIFw/HB0jKF+id4k2vTcS9zTXDZo+20Rc++BQoiDR0F5lX0XmUBaiI/5SvU7TfMDd mXfg2p0r4bQty60kcVvIBi2tHjtjNAAl0H0z50vtcAPURrdU1PfKNhoXBiVkD/QAWVuO+w beFGg3Un+KOZROHgI5AEVOsqu8OF6Wduo4ylDJZxJOTrwAdMZ4k8teX+wMlYFrokbsAWSr RSiyZvCevnMYoQM2pW/WAHhdLGNDYlHWee2wrzJk18exS+8HpANBn1loS9D6Wr52lcPAiZ Nt+mRIPi1EcvKVpW2JNQtoTaKRgZTNjY55oak5z1PrAyxUj+q4yktXLUtE4A4g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1691821754; 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=sYlSVw7dDCBP7M6HGv1PYEciSfqt7lkZUeq4tdEozJM=; b=ELKMaBZ6JA1A3v5pkkgjfyztCwblQyOVmVP16BMutog8SVH7aSF5JfzlAHX+N1e4PG6ykY n4TOP4r9qLU8Jys+S2mbEgjmuhcsIeGAgW46Tz6ceQC0yKO9ILRm5B2JPuCHqqoxs6YDxp RitQD2zo3PK2FPbFcWTDyXMhIMqUfCbPopy9MU1JfXkjwhr3y6rGz3j6oxkVYLltBSV1Nk sLrzi/obaR3kW9mOENd41mdceoTdjG3w3RANDn0eOTSKXh9zNBP2Lah2mcY7KKJF7qIazN 42BxLS90zds7Jp/aqXEld731pCfYAj/hnU3eQ6C4yWkSLJDLhsjbvbzpZ2gOFw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1691821754; a=rsa-sha256; cv=none; b=MkEjeu3IrZ8YX9w95Zq2LM2syRo2psA62JaQYDLAwbIkk22BQzWuVgqAoFH++DtEPrc2W/ Acm3QWq/BmAc8FQPwKB5e8Qff5c8+UbFhkrwThfEsd4qa+qCU4OZdVuG6oN6djQyJW+/KY UBBDNIQEONBYKP+p7j9JYBWKekQaNwXCLK0WN+h7F+11O9cH3PIzzRaMLZAYboPbz1ZKko LU9M2HnjyeRCOtSn8jjcJwEz49QEtbzbkMx9lBgyFU2/Za7DvUy0r4FwmfDDLORAk1Ic8Z QweaGmVBD7e2aPfSaE/dxkV0Tk1rRkYJrObbQ/w+n42in+JK7ARSlcHkgWhKuQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (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 did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4RN9jk2SWRz192j; Sat, 12 Aug 2023 06:29:14 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 37C6TEZ1025094; Sat, 12 Aug 2023 06:29:14 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 37C6TECs025091; Sat, 12 Aug 2023 06:29:14 GMT (envelope-from git) Date: Sat, 12 Aug 2023 06:29:14 GMT Message-Id: <202308120629.37C6TECs025091@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: 9b65fa694078 - main - linuxolator: implement Linux' PROT_GROWSDOWN List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org 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: 9b65fa69407808e710748875b0af98902110f128 Auto-Submitted: auto-generated The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=9b65fa69407808e710748875b0af98902110f128 commit 9b65fa69407808e710748875b0af98902110f128 Author: Konstantin Belousov AuthorDate: 2023-07-29 21:00:51 +0000 Commit: Konstantin Belousov CommitDate: 2023-08-12 06:28:14 +0000 linuxolator: implement Linux' PROT_GROWSDOWN From the Linux man page for mprotect(2): PROT_GROWSDOWN Apply the protection mode down to the beginning of a mapping that grows downward (which should be a stack segment or a segment mapped with the MAP_GROWSDOWN flag set). Reported by: dchagin Reviewed by: alc, markj Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D41099 --- sys/compat/freebsd32/freebsd32_misc.c | 2 +- sys/compat/linux/linux_mmap.c | 14 ++++++++++---- sys/sys/syscallsubr.h | 3 ++- sys/vm/vm_mmap.c | 9 +++++---- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/sys/compat/freebsd32/freebsd32_misc.c b/sys/compat/freebsd32/freebsd32_misc.c index b7ad379df6e0..07ad68d56037 100644 --- a/sys/compat/freebsd32/freebsd32_misc.c +++ b/sys/compat/freebsd32/freebsd32_misc.c @@ -512,7 +512,7 @@ freebsd32_mprotect(struct thread *td, struct freebsd32_mprotect_args *uap) prot |= PROT_EXEC; #endif return (kern_mprotect(td, (uintptr_t)PTRIN(uap->addr), uap->len, - prot)); + prot, 0)); } int diff --git a/sys/compat/linux/linux_mmap.c b/sys/compat/linux/linux_mmap.c index 07df6f5fd43d..580f15379e31 100644 --- a/sys/compat/linux/linux_mmap.c +++ b/sys/compat/linux/linux_mmap.c @@ -229,16 +229,22 @@ out: int linux_mprotect_common(struct thread *td, uintptr_t addr, size_t len, int prot) { + int flags = 0; - /* XXX Ignore PROT_GROWSDOWN and PROT_GROWSUP for now. */ - prot &= ~(LINUX_PROT_GROWSDOWN | LINUX_PROT_GROWSUP); - if ((prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC)) != 0) + /* XXX Ignore PROT_GROWSUP for now. */ + prot &= ~LINUX_PROT_GROWSUP; + if ((prot & ~(LINUX_PROT_GROWSDOWN | PROT_READ | PROT_WRITE | + PROT_EXEC)) != 0) return (EINVAL); + if ((prot & LINUX_PROT_GROWSDOWN) != 0) { + prot &= ~LINUX_PROT_GROWSDOWN; + flags |= VM_MAP_PROTECT_GROWSDOWN; + } #if defined(__amd64__) linux_fixup_prot(td, &prot); #endif - return (kern_mprotect(td, addr, len, prot)); + return (kern_mprotect(td, addr, len, prot, flags)); } /* diff --git a/sys/sys/syscallsubr.h b/sys/sys/syscallsubr.h index 64f1b16f92b9..660b70136714 100644 --- a/sys/sys/syscallsubr.h +++ b/sys/sys/syscallsubr.h @@ -216,7 +216,8 @@ int kern_mmap(struct thread *td, const struct mmap_req *mrp); int kern_mmap_racct_check(struct thread *td, struct vm_map *map, vm_size_t size); int kern_mmap_maxprot(struct proc *p, int prot); -int kern_mprotect(struct thread *td, uintptr_t addr, size_t size, int prot); +int kern_mprotect(struct thread *td, uintptr_t addr, size_t size, + int prot, int flags); int kern_msgctl(struct thread *, int, int, struct msqid_ds *); int kern_msgrcv(struct thread *, int, void *, size_t, long, int, long *); int kern_msgsnd(struct thread *, int, const void *, size_t, int, long); diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c index 328fef007b1e..7876a055ca91 100644 --- a/sys/vm/vm_mmap.c +++ b/sys/vm/vm_mmap.c @@ -658,16 +658,17 @@ int sys_mprotect(struct thread *td, struct mprotect_args *uap) { - return (kern_mprotect(td, (uintptr_t)uap->addr, uap->len, uap->prot)); + return (kern_mprotect(td, (uintptr_t)uap->addr, uap->len, + uap->prot, 0)); } int -kern_mprotect(struct thread *td, uintptr_t addr0, size_t size, int prot) +kern_mprotect(struct thread *td, uintptr_t addr0, size_t size, int prot, + int flags) { vm_offset_t addr; vm_size_t pageoff; int vm_error, max_prot; - int flags; addr = addr0; if ((prot & ~(_PROT_ALL | PROT_MAX(_PROT_ALL))) != 0) @@ -687,7 +688,7 @@ kern_mprotect(struct thread *td, uintptr_t addr0, size_t size, int prot) if (addr + size < addr) return (EINVAL); - flags = VM_MAP_PROTECT_SET_PROT; + flags |= VM_MAP_PROTECT_SET_PROT; if (max_prot != 0) flags |= VM_MAP_PROTECT_SET_MAXPROT; vm_error = vm_map_protect(&td->td_proc->p_vmspace->vm_map,