From nobody Sat Aug 12 06:29:09 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 4RN9jf1DW9z4TvgZ; Sat, 12 Aug 2023 06:29:10 +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 4RN9jd63nlz3Xyv; Sat, 12 Aug 2023 06:29:09 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1691821749; 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=dD+36P0QYM2tTBt2wFpxK2FQMhGMeejh2eu4tr1IF8Y=; b=xH/sIXbyngzaZPf76vufPMAZ3+6KK/CDCVECgCoyw6KrpGx6OUckWgd3RM+ieNQyhE9YUQ Vyt8L/Fgu8ydXreXVA5NbHqsZZHQ7DacLf/Wm466nZMFYPIpTg07DaliU/p/samLBwDaes 4pjLKEP5MViTQNmzB3DL2+XqqeW3JtFkGA4MV4EiLD0dhN2sozIxmBXlLBFa3Xl707h3JI d1I9bFSuUTDJkbMXi8RBAd+7G0PUeXJrovR5yCqpSJQho5K+Mhor5TRtRv9haBvwCqMJmL LIO0JPmevKnkGTwfEkL8nYTOi/kRopYN1R4snmZnhgWlbls91CeOnTMaNFgj/A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1691821749; 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=dD+36P0QYM2tTBt2wFpxK2FQMhGMeejh2eu4tr1IF8Y=; b=om7fv55o7PMXqkXmK2m9jiBfVcdKAJF0VlyrArX2LGG2LOPOh2cXPEqEDx7HdzmSLcZwUp qRg9jr2qUPrJ4DVTezMGOSStCNv9iP409jnpI1m8Gpffd3EMz3LebJGDmhkh/8wcz+XrrB gqQPZWx1L8Xc7a9pPVWaRHRNsCvvwB0ntJfczuPnUukY3SkyuwtVhb/xZHlcbdd4jj4A/s Mj8DOcR6DMb5DF5aKR4BWdfjuyWp6gV/SUZ4hcgbEf477sI5UZFwKHX2RM+RHJjnqkh93M uTWEpb5IjmDz5hO6Ro7o/eFzKCV7OGw8WX0/V9Zl2t/LWgms7Ktb4wHIAH8NGA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1691821749; a=rsa-sha256; cv=none; b=u8Dt/VlX096Z9C36W1JG/ln/IQqC1k2YPvcRW/xUSevNxihBxxza4dmAqWwCVR+nYCl5NO foptk4u8EaoV4qljkCLLT+YLRtIwjnrAws7XkHu+hKgwwpIeI/WXMPJx4GnHGMRrlYxNNW e0LuuhCeNhlxq8Bb5N0+kX9c+0Lxgnw4ht3FFlF49gYK6Xi+Mcif3wJLl1i4VxpgPJhK9Y Afkoh0rlTbN8h7zZN7LQUxvP2mt1h7gY/9MuhBWYWTbquTLgJVoWhT1Z9GNYz9cMfpfu1B XuIEziWVDGPFY3nxTctksSiHOm6IT3j1lgjsHGHDKpyZIViQ+0w0Xyt9U7clTw== 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 4RN9jd58QYz18t6; Sat, 12 Aug 2023 06:29:09 +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 37C6T9OL024902; Sat, 12 Aug 2023 06:29:09 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 37C6T9Ql024899; Sat, 12 Aug 2023 06:29:09 GMT (envelope-from git) Date: Sat, 12 Aug 2023 06:29:09 GMT Message-Id: <202308120629.37C6T9Ql024899@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: 55be6be12cd9 - main - vm_map_protect(): handle stack protection stored in the stack guard 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: 55be6be12cd95552a46feccb42db984c8d3cbc36 Auto-Submitted: auto-generated The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=55be6be12cd95552a46feccb42db984c8d3cbc36 commit 55be6be12cd95552a46feccb42db984c8d3cbc36 Author: Konstantin Belousov AuthorDate: 2023-07-25 13:32:28 +0000 Commit: Konstantin Belousov CommitDate: 2023-08-12 06:28:13 +0000 vm_map_protect(): handle stack protection stored in the stack guard mprotect(2) on the stack region needs to adjust guard stored protection, so that e.g. enable executing on stack worked properly on stack growth. 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/vm/vm_map.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c index dd342752bf6c..e63fcdc7c6f1 100644 --- a/sys/vm/vm_map.c +++ b/sys/vm/vm_map.c @@ -2726,7 +2726,22 @@ static void vm_map_protect_guard(vm_map_entry_t entry, vm_prot_t new_prot, vm_prot_t new_maxprot, int flags) { + vm_prot_t old_prot; + MPASS((entry->eflags & MAP_ENTRY_GUARD) != 0); + if ((entry->eflags & (MAP_ENTRY_STACK_GAP_UP | + MAP_ENTRY_STACK_GAP_DN)) == 0) + return; + + old_prot = PROT_EXTRACT(entry->offset); + if ((flags & VM_MAP_PROTECT_SET_MAXPROT) != 0) { + entry->offset = PROT_MAX(new_maxprot) | + (new_maxprot & old_prot); + } + if ((flags & VM_MAP_PROTECT_SET_PROT) != 0) { + entry->offset = new_prot | PROT_MAX( + PROT_MAX_EXTRACT(entry->offset)); + } } /* @@ -2742,7 +2757,7 @@ vm_map_protect(vm_map_t map, vm_offset_t start, vm_offset_t end, vm_map_entry_t entry, first_entry, in_tran, prev_entry; vm_object_t obj; struct ucred *cred; - vm_prot_t check_prot, old_prot; + vm_prot_t check_prot, max_prot, old_prot; int rv; if (start == end) @@ -2791,10 +2806,14 @@ again: vm_map_unlock(map); return (KERN_INVALID_ARGUMENT); } - if ((entry->eflags & MAP_ENTRY_GUARD) != 0) { + if ((entry->eflags & (MAP_ENTRY_GUARD | + MAP_ENTRY_STACK_GAP_DN | MAP_ENTRY_STACK_GAP_UP)) == + MAP_ENTRY_GUARD) continue; - } - if (!CONTAINS_BITS(entry->max_protection, check_prot)) { + max_prot = (entry->eflags & (MAP_ENTRY_STACK_GAP_DN | + MAP_ENTRY_STACK_GAP_UP)) != 0 ? + PROT_MAX_EXTRACT(entry->offset) : entry->max_protection; + if (!CONTAINS_BITS(max_prot, check_prot)) { vm_map_unlock(map); return (KERN_PROTECTION_FAILURE); }