diff options
Diffstat (limited to 'fs/compat.c')
| -rw-r--r-- | fs/compat.c | 28 | 
1 files changed, 15 insertions, 13 deletions
diff --git a/fs/compat.c b/fs/compat.c index c580c322fa6..eb1740ac8c0 100644 --- a/fs/compat.c +++ b/fs/compat.c @@ -1350,6 +1350,10 @@ static int compat_count(compat_uptr_t __user *argv, int max)  			argv++;  			if (i++ >= max)  				return -E2BIG; + +			if (fatal_signal_pending(current)) +				return -ERESTARTNOHAND; +			cond_resched();  		}  	}  	return i; @@ -1391,6 +1395,12 @@ static int compat_copy_strings(int argc, compat_uptr_t __user *argv,  		while (len > 0) {  			int offset, bytes_to_copy; +			if (fatal_signal_pending(current)) { +				ret = -ERESTARTNOHAND; +				goto out; +			} +			cond_resched(); +  			offset = pos % PAGE_SIZE;  			if (offset == 0)  				offset = PAGE_SIZE; @@ -1407,18 +1417,8 @@ static int compat_copy_strings(int argc, compat_uptr_t __user *argv,  			if (!kmapped_page || kpos != (pos & PAGE_MASK)) {  				struct page *page; -#ifdef CONFIG_STACK_GROWSUP -				ret = expand_stack_downwards(bprm->vma, pos); -				if (ret < 0) { -					/* We've exceed the stack rlimit. */ -					ret = -E2BIG; -					goto out; -				} -#endif -				ret = get_user_pages(current, bprm->mm, pos, -						     1, 1, 1, &page, NULL); -				if (ret <= 0) { -					/* We've exceed the stack rlimit. */ +				page = get_arg_page(bprm, pos, 1); +				if (!page) {  					ret = -E2BIG;  					goto out;  				} @@ -1539,8 +1539,10 @@ int compat_do_execve(char * filename,  	return retval;  out: -	if (bprm->mm) +	if (bprm->mm) { +		acct_arg_size(bprm, 0);  		mmput(bprm->mm); +	}  out_file:  	if (bprm->file) {  |