|
@@ -1350,6 +1350,10 @@ static int compat_count(compat_uptr_t __user *argv, int max)
|
|
argv++;
|
|
argv++;
|
|
if (i++ >= max)
|
|
if (i++ >= max)
|
|
return -E2BIG;
|
|
return -E2BIG;
|
|
|
|
+
|
|
|
|
+ if (fatal_signal_pending(current))
|
|
|
|
+ return -ERESTARTNOHAND;
|
|
|
|
+ cond_resched();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return i;
|
|
return i;
|
|
@@ -1391,6 +1395,12 @@ static int compat_copy_strings(int argc, compat_uptr_t __user *argv,
|
|
while (len > 0) {
|
|
while (len > 0) {
|
|
int offset, bytes_to_copy;
|
|
int offset, bytes_to_copy;
|
|
|
|
|
|
|
|
+ if (fatal_signal_pending(current)) {
|
|
|
|
+ ret = -ERESTARTNOHAND;
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
|
|
|
+ cond_resched();
|
|
|
|
+
|
|
offset = pos % PAGE_SIZE;
|
|
offset = pos % PAGE_SIZE;
|
|
if (offset == 0)
|
|
if (offset == 0)
|
|
offset = PAGE_SIZE;
|
|
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)) {
|
|
if (!kmapped_page || kpos != (pos & PAGE_MASK)) {
|
|
struct page *page;
|
|
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;
|
|
ret = -E2BIG;
|
|
goto out;
|
|
goto out;
|
|
}
|
|
}
|
|
@@ -1539,8 +1539,10 @@ int compat_do_execve(char * filename,
|
|
return retval;
|
|
return retval;
|
|
|
|
|
|
out:
|
|
out:
|
|
- if (bprm->mm)
|
|
|
|
|
|
+ if (bprm->mm) {
|
|
|
|
+ acct_arg_size(bprm, 0);
|
|
mmput(bprm->mm);
|
|
mmput(bprm->mm);
|
|
|
|
+ }
|
|
|
|
|
|
out_file:
|
|
out_file:
|
|
if (bprm->file) {
|
|
if (bprm->file) {
|