|
@@ -1283,10 +1283,6 @@ SYSCALL_DEFINE2(setrlimit, unsigned int, resource, struct rlimit __user *, rlim)
|
|
|
return -EFAULT;
|
|
|
if (new_rlim.rlim_cur > new_rlim.rlim_max)
|
|
|
return -EINVAL;
|
|
|
- old_rlim = current->signal->rlim + resource;
|
|
|
- if ((new_rlim.rlim_max > old_rlim->rlim_max) &&
|
|
|
- !capable(CAP_SYS_RESOURCE))
|
|
|
- return -EPERM;
|
|
|
if (resource == RLIMIT_NOFILE && new_rlim.rlim_max > sysctl_nr_open)
|
|
|
return -EPERM;
|
|
|
|
|
@@ -1304,11 +1300,16 @@ SYSCALL_DEFINE2(setrlimit, unsigned int, resource, struct rlimit __user *, rlim)
|
|
|
new_rlim.rlim_cur = 1;
|
|
|
}
|
|
|
|
|
|
+ old_rlim = current->signal->rlim + resource;
|
|
|
task_lock(current->group_leader);
|
|
|
- *old_rlim = new_rlim;
|
|
|
+ if (new_rlim.rlim_max > old_rlim->rlim_max &&
|
|
|
+ !capable(CAP_SYS_RESOURCE))
|
|
|
+ retval = -EPERM;
|
|
|
+ else
|
|
|
+ *old_rlim = new_rlim;
|
|
|
task_unlock(current->group_leader);
|
|
|
|
|
|
- if (resource != RLIMIT_CPU)
|
|
|
+ if (retval || resource != RLIMIT_CPU)
|
|
|
goto out;
|
|
|
|
|
|
/*
|
|
@@ -1322,7 +1323,7 @@ SYSCALL_DEFINE2(setrlimit, unsigned int, resource, struct rlimit __user *, rlim)
|
|
|
|
|
|
update_rlimit_cpu(current, new_rlim.rlim_cur);
|
|
|
out:
|
|
|
- return 0;
|
|
|
+ return retval;
|
|
|
}
|
|
|
|
|
|
/*
|