diff options
Diffstat (limited to 'mm/mmap.c')
| -rw-r--r-- | mm/mmap.c | 13 | 
1 files changed, 9 insertions, 4 deletions
| diff --git a/mm/mmap.c b/mm/mmap.c index 7b36aa7cc89a..7f684d5a8087 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -778,10 +778,12 @@ again:			remove_next = 1 + (end > next->vm_end);  		if (exporter && exporter->anon_vma && !importer->anon_vma) {  			int error; +			importer->anon_vma = exporter->anon_vma;  			error = anon_vma_clone(importer, exporter); -			if (error) +			if (error) { +				importer->anon_vma = NULL;  				return error; -			importer->anon_vma = exporter->anon_vma; +			}  		}  	} @@ -2099,14 +2101,17 @@ static int acct_stack_growth(struct vm_area_struct *vma, unsigned long size, uns  {  	struct mm_struct *mm = vma->vm_mm;  	struct rlimit *rlim = current->signal->rlim; -	unsigned long new_start; +	unsigned long new_start, actual_size;  	/* address space limit tests */  	if (!may_expand_vm(mm, grow))  		return -ENOMEM;  	/* Stack limit test */ -	if (size > ACCESS_ONCE(rlim[RLIMIT_STACK].rlim_cur)) +	actual_size = size; +	if (size && (vma->vm_flags & (VM_GROWSUP | VM_GROWSDOWN))) +		actual_size -= PAGE_SIZE; +	if (actual_size > ACCESS_ONCE(rlim[RLIMIT_STACK].rlim_cur))  		return -ENOMEM;  	/* mlock limit tests */ | 
