|
@@ -1123,7 +1123,7 @@ void mark_rodata_ro(void)
|
|
|
unsigned long end = (unsigned long) &__end_rodata_hpage_align;
|
|
|
unsigned long text_end = PFN_ALIGN(&__stop___ex_table);
|
|
|
unsigned long rodata_end = PFN_ALIGN(&__end_rodata);
|
|
|
- unsigned long all_end = PFN_ALIGN(&_end);
|
|
|
+ unsigned long all_end;
|
|
|
|
|
|
printk(KERN_INFO "Write protecting the kernel read-only data: %luk\n",
|
|
|
(end - start) >> 10);
|
|
@@ -1134,7 +1134,16 @@ void mark_rodata_ro(void)
|
|
|
/*
|
|
|
* The rodata/data/bss/brk section (but not the kernel text!)
|
|
|
* should also be not-executable.
|
|
|
+ *
|
|
|
+ * We align all_end to PMD_SIZE because the existing mapping
|
|
|
+ * is a full PMD. If we would align _brk_end to PAGE_SIZE we
|
|
|
+ * split the PMD and the reminder between _brk_end and the end
|
|
|
+ * of the PMD will remain mapped executable.
|
|
|
+ *
|
|
|
+ * Any PMD which was setup after the one which covers _brk_end
|
|
|
+ * has been zapped already via cleanup_highmem().
|
|
|
*/
|
|
|
+ all_end = roundup((unsigned long)_brk_end, PMD_SIZE);
|
|
|
set_memory_nx(rodata_start, (all_end - rodata_start) >> PAGE_SHIFT);
|
|
|
|
|
|
rodata_test();
|