|
@@ -39,12 +39,12 @@
|
|
|
#define MIN_GAP (128*1024*1024)
|
|
|
#define MAX_GAP (TASK_SIZE/6*5)
|
|
|
|
|
|
-static inline int mmap_is_legacy(void)
|
|
|
+static inline int mmap_is_legacy(struct rlimit *rlim_stack)
|
|
|
{
|
|
|
if (current->personality & ADDR_COMPAT_LAYOUT)
|
|
|
return 1;
|
|
|
|
|
|
- if (rlimit(RLIMIT_STACK) == RLIM_INFINITY)
|
|
|
+ if (rlim_stack->rlim_cur == RLIM_INFINITY)
|
|
|
return 1;
|
|
|
|
|
|
return sysctl_legacy_va_layout;
|
|
@@ -76,9 +76,10 @@ static inline unsigned long stack_maxrandom_size(void)
|
|
|
return (1<<30);
|
|
|
}
|
|
|
|
|
|
-static inline unsigned long mmap_base(unsigned long rnd)
|
|
|
+static inline unsigned long mmap_base(unsigned long rnd,
|
|
|
+ struct rlimit *rlim_stack)
|
|
|
{
|
|
|
- unsigned long gap = rlimit(RLIMIT_STACK);
|
|
|
+ unsigned long gap = rlim_stack->rlim_cur;
|
|
|
unsigned long pad = stack_maxrandom_size() + stack_guard_gap;
|
|
|
|
|
|
/* Values close to RLIM_INFINITY can overflow. */
|
|
@@ -196,26 +197,28 @@ radix__arch_get_unmapped_area_topdown(struct file *filp,
|
|
|
}
|
|
|
|
|
|
static void radix__arch_pick_mmap_layout(struct mm_struct *mm,
|
|
|
- unsigned long random_factor)
|
|
|
+ unsigned long random_factor,
|
|
|
+ struct rlimit *rlim_stack)
|
|
|
{
|
|
|
- if (mmap_is_legacy()) {
|
|
|
+ if (mmap_is_legacy(rlim_stack)) {
|
|
|
mm->mmap_base = TASK_UNMAPPED_BASE;
|
|
|
mm->get_unmapped_area = radix__arch_get_unmapped_area;
|
|
|
} else {
|
|
|
- mm->mmap_base = mmap_base(random_factor);
|
|
|
+ mm->mmap_base = mmap_base(random_factor, rlim_stack);
|
|
|
mm->get_unmapped_area = radix__arch_get_unmapped_area_topdown;
|
|
|
}
|
|
|
}
|
|
|
#else
|
|
|
/* dummy */
|
|
|
extern void radix__arch_pick_mmap_layout(struct mm_struct *mm,
|
|
|
- unsigned long random_factor);
|
|
|
+ unsigned long random_factor,
|
|
|
+ struct rlimit *rlim_stack);
|
|
|
#endif
|
|
|
/*
|
|
|
* This function, called very early during the creation of a new
|
|
|
* process VM image, sets up which VM layout function to use:
|
|
|
*/
|
|
|
-void arch_pick_mmap_layout(struct mm_struct *mm)
|
|
|
+void arch_pick_mmap_layout(struct mm_struct *mm, struct rlimit *rlim_stack)
|
|
|
{
|
|
|
unsigned long random_factor = 0UL;
|
|
|
|
|
@@ -223,16 +226,17 @@ void arch_pick_mmap_layout(struct mm_struct *mm)
|
|
|
random_factor = arch_mmap_rnd();
|
|
|
|
|
|
if (radix_enabled())
|
|
|
- return radix__arch_pick_mmap_layout(mm, random_factor);
|
|
|
+ return radix__arch_pick_mmap_layout(mm, random_factor,
|
|
|
+ rlim_stack);
|
|
|
/*
|
|
|
* Fall back to the standard layout if the personality
|
|
|
* bit is set, or if the expected stack growth is unlimited:
|
|
|
*/
|
|
|
- if (mmap_is_legacy()) {
|
|
|
+ if (mmap_is_legacy(rlim_stack)) {
|
|
|
mm->mmap_base = TASK_UNMAPPED_BASE;
|
|
|
mm->get_unmapped_area = arch_get_unmapped_area;
|
|
|
} else {
|
|
|
- mm->mmap_base = mmap_base(random_factor);
|
|
|
+ mm->mmap_base = mmap_base(random_factor, rlim_stack);
|
|
|
mm->get_unmapped_area = arch_get_unmapped_area_topdown;
|
|
|
}
|
|
|
}
|