Commit 93908500 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux

Pull arm64 fix from Catalin Marinas:
 "Fix PTRACE_PEEKMTETAGS access to an mmapped region before the first
  write"

* tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux:
  arm64: mte: Allow PTRACE_PEEKMTETAGS access to the zero page
parents dcc0b490 68d54cee
...@@ -1701,16 +1701,12 @@ static void bti_enable(const struct arm64_cpu_capabilities *__unused) ...@@ -1701,16 +1701,12 @@ static void bti_enable(const struct arm64_cpu_capabilities *__unused)
#ifdef CONFIG_ARM64_MTE #ifdef CONFIG_ARM64_MTE
static void cpu_enable_mte(struct arm64_cpu_capabilities const *cap) static void cpu_enable_mte(struct arm64_cpu_capabilities const *cap)
{ {
static bool cleared_zero_page = false;
/* /*
* Clear the tags in the zero page. This needs to be done via the * Clear the tags in the zero page. This needs to be done via the
* linear map which has the Tagged attribute. * linear map which has the Tagged attribute.
*/ */
if (!cleared_zero_page) { if (!test_and_set_bit(PG_mte_tagged, &ZERO_PAGE(0)->flags))
cleared_zero_page = true;
mte_clear_page_tags(lm_alias(empty_zero_page)); mte_clear_page_tags(lm_alias(empty_zero_page));
}
kasan_init_hw_tags_cpu(); kasan_init_hw_tags_cpu();
} }
......
...@@ -329,11 +329,12 @@ static int __access_remote_tags(struct mm_struct *mm, unsigned long addr, ...@@ -329,11 +329,12 @@ static int __access_remote_tags(struct mm_struct *mm, unsigned long addr,
* would cause the existing tags to be cleared if the page * would cause the existing tags to be cleared if the page
* was never mapped with PROT_MTE. * was never mapped with PROT_MTE.
*/ */
if (!test_bit(PG_mte_tagged, &page->flags)) { if (!(vma->vm_flags & VM_MTE)) {
ret = -EOPNOTSUPP; ret = -EOPNOTSUPP;
put_page(page); put_page(page);
break; break;
} }
WARN_ON_ONCE(!test_bit(PG_mte_tagged, &page->flags));
/* limit access to the end of the page */ /* limit access to the end of the page */
offset = offset_in_page(addr); offset = offset_in_page(addr);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment