Skip to content

Commit 47a8aad

Browse files
ctmarinaswilldeacon
authored andcommitted
arm64: gcs: Honour mprotect(PROT_NONE) on shadow stack mappings
vm_get_page_prot() short-circuits the protection_map[] lookup for a VM_SHADOW_STACK mapping since it uses a different PIE index from the typical read/write/exec permissions. However, the side effect is that it also ignores mprotect(PROT_NONE) by creating an accessible PTE. Special-case the !(vm_flags & VM_ACCESS_FLAGS) flags to use the protection_map[VM_NONE] permissions instead. No GCS attributes are required for an inaccessible PTE. Signed-off-by: Catalin Marinas <catalin.marinas@arm.com> Fixes: 6497b66 ("arm64/mm: Map pages for guarded control stack") Cc: stable@vger.kernel.org Cc: Mark Brown <broonie@kernel.org> Cc: Will Deacon <will@kernel.org> Cc: David Hildenbrand <david@kernel.org> Reviewed-by: David Hildenbrand (Arm) <david@kernel.org> Signed-off-by: Will Deacon <will@kernel.org>
1 parent 8a85b31 commit 47a8aad

1 file changed

Lines changed: 5 additions & 1 deletion

File tree

arch/arm64/mm/mmap.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,11 @@ pgprot_t vm_get_page_prot(vm_flags_t vm_flags)
9191

9292
/* Short circuit GCS to avoid bloating the table. */
9393
if (system_supports_gcs() && (vm_flags & VM_SHADOW_STACK)) {
94-
prot = gcs_page_prot;
94+
/* Honour mprotect(PROT_NONE) on shadow stack mappings */
95+
if (vm_flags & VM_ACCESS_FLAGS)
96+
prot = gcs_page_prot;
97+
else
98+
prot = pgprot_val(protection_map[VM_NONE]);
9599
} else {
96100
prot = pgprot_val(protection_map[vm_flags &
97101
(VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)]);

0 commit comments

Comments
 (0)