Commit 3372f5a7d005dd42e754490fed6a0171c4a018c6

Authored by Alexander Stein
Committed by Greg Ungerer
1 parent 57e00098cc

m68k: Do not set global share for non-kernel shared pages

If the SG bit is set in MMUTR the page is accessible for all
userspace processes (ignoring the ASID). So a process might randomly
access a page from a different process which had a shared page
(from shared memory) in its context.

Signed-off-by: Alexander Stein <alexander.stein@systec-electronic.com>
Signed-off-by: Greg Ungerer <gerg@uclinux.org>

Showing 1 changed file with 5 additions and 4 deletions Side-by-side Diff

arch/m68k/mm/mcfmmu.c
... ... @@ -87,7 +87,7 @@
87 87  
88 88 int cf_tlb_miss(struct pt_regs *regs, int write, int dtlb, int extension_word)
89 89 {
90   - unsigned long flags, mmuar;
  90 + unsigned long flags, mmuar, mmutr;
91 91 struct mm_struct *mm;
92 92 pgd_t *pgd;
93 93 pmd_t *pmd;
... ... @@ -137,9 +137,10 @@
137 137 if (!pte_dirty(*pte) && !KMAPAREA(mmuar))
138 138 set_pte(pte, pte_wrprotect(*pte));
139 139  
140   - mmu_write(MMUTR, (mmuar & PAGE_MASK) | (asid << MMUTR_IDN) |
141   - (((int)(pte->pte) & (int)CF_PAGE_MMUTR_MASK)
142   - >> CF_PAGE_MMUTR_SHIFT) | MMUTR_V);
  140 + mmutr = (mmuar & PAGE_MASK) | (asid << MMUTR_IDN) | MMUTR_V;
  141 + if ((mmuar < TASK_UNMAPPED_BASE) || (mmuar >= TASK_SIZE))
  142 + mmutr |= (pte->pte & CF_PAGE_MMUTR_MASK) >> CF_PAGE_MMUTR_SHIFT;
  143 + mmu_write(MMUTR, mmutr);
143 144  
144 145 mmu_write(MMUDR, (pte_val(*pte) & PAGE_MASK) |
145 146 ((pte->pte) & CF_PAGE_MMUDR_MASK) | MMUDR_SZ_8KB | MMUDR_X);