| diff -uNrp kernel-3.2.fc16.orig/arch/x86/mm/mmap.c kernel-3.2.fc16.new/arch/x86/mm/mmap.c |
| |
| |
| @@ -106,6 +106,10 @@ static unsigned long mmap_legacy_base(vo |
| return TASK_UNMAPPED_BASE + mmap_rnd(); |
| } |
| |
| +#ifdef CONFIG_X86_32 |
| + #define SHLIB_BASE 0x00111000 |
| +#endif |
| + |
| /* |
| * This function, called very early during the creation of a new |
| * process VM image, sets up which VM layout function to use: |
| @@ -126,8 +126,10 @@ void arch_pick_mmap_layout(struct mm_str |
| #ifdef CONFIG_X86_32 |
| if (!(current->personality & READ_IMPLIES_EXEC) |
| && !(__supported_pte_mask & _PAGE_NX) |
| - && mmap_is_ia32()) |
| + && mmap_is_ia32()) { |
| + mm->shlib_base = SHLIB_BASE + mmap_rnd(); |
| mm->get_unmapped_exec_area = arch_get_unmapped_exec_area; |
| + } |
| #endif |
| mm->unmap_area = arch_unmap_area_topdown; |
| } |
| diff -uNrp kernel-3.2.fc16.orig/include/linux/mm_types.h kernel-3.2.fc16.new/include/linux/mm_types.h |
| |
| |
| @@ -300,6 +300,7 @@ struct mm_struct { |
| void (*unmap_area) (struct mm_struct *mm, unsigned long addr); |
| #endif |
| unsigned long mmap_base; /* base of mmap area */ |
| + unsigned long shlib_base; /* base of lib map area (ASCII armour)*/ |
| unsigned long task_size; /* size of task vm space */ |
| unsigned long cached_hole_size; /* if non-zero, the largest hole below free_area_cache */ |
| unsigned long free_area_cache; /* first hole of size cached_hole_size or larger */ |
| diff -uNrp kernel-3.2.fc16.orig/mm/mmap.c kernel-3.2.fc16.new/mm/mmap.c |
| |
| |
| @@ -1594,8 +1594,6 @@ static bool should_randomize(void) |
| !(current->personality & ADDR_NO_RANDOMIZE); |
| } |
| |
| -#define SHLIB_BASE 0x00110000 |
| - |
| unsigned long |
| arch_get_unmapped_exec_area(struct file *filp, unsigned long addr0, |
| unsigned long len0, unsigned long pgoff, unsigned long flags) |
| @@ -1612,8 +1610,8 @@ arch_get_unmapped_exec_area(struct file |
| return addr; |
| |
| if (!addr) |
| - addr = !should_randomize() ? SHLIB_BASE : |
| - randomize_range(SHLIB_BASE, 0x01000000, len); |
| + addr = !should_randomize() ? mm->shlib_base : |
| + randomize_range(mm->shlib_base, 0x01000000, len); |
| |
| if (addr) { |
| addr = PAGE_ALIGN(addr); |
| @@ -1623,7 +1621,7 @@ arch_get_unmapped_exec_area(struct file |
| return addr; |
| } |
| |
| - addr = SHLIB_BASE; |
| + addr = mm->shlib_base; |
| for (vma = find_vma(mm, addr); ; vma = vma->vm_next) { |
| /* At this point: (!vma || addr < vma->vm_end). */ |
| if (TASK_SIZE - len < addr) |