diff options
| -rw-r--r-- | kernel/sys.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/kernel/sys.c b/kernel/sys.c index 9dbcbbcce153..c762eebdebf7 100644 --- a/kernel/sys.c +++ b/kernel/sys.c | |||
| @@ -1277,7 +1277,7 @@ int do_setrlimit(struct task_struct *tsk, unsigned int resource, | |||
| 1277 | struct rlimit *new_rlim) | 1277 | struct rlimit *new_rlim) |
| 1278 | { | 1278 | { |
| 1279 | struct rlimit *old_rlim; | 1279 | struct rlimit *old_rlim; |
| 1280 | int retval; | 1280 | int retval = 0; |
| 1281 | 1281 | ||
| 1282 | if (resource >= RLIM_NLIMITS) | 1282 | if (resource >= RLIM_NLIMITS) |
| 1283 | return -EINVAL; | 1283 | return -EINVAL; |
| @@ -1293,9 +1293,14 @@ int do_setrlimit(struct task_struct *tsk, unsigned int resource, | |||
| 1293 | goto out; | 1293 | goto out; |
| 1294 | } | 1294 | } |
| 1295 | 1295 | ||
| 1296 | retval = security_task_setrlimit(tsk->group_leader, resource, new_rlim); | 1296 | old_rlim = tsk->signal->rlim + resource; |
| 1297 | if (retval) | 1297 | task_lock(tsk->group_leader); |
| 1298 | goto out; | 1298 | if (new_rlim->rlim_max > old_rlim->rlim_max && |
| 1299 | !capable(CAP_SYS_RESOURCE)) | ||
| 1300 | retval = -EPERM; | ||
| 1301 | if (!retval) | ||
| 1302 | retval = security_task_setrlimit(tsk->group_leader, resource, | ||
| 1303 | new_rlim); | ||
| 1299 | 1304 | ||
| 1300 | if (resource == RLIMIT_CPU && new_rlim->rlim_cur == 0) { | 1305 | if (resource == RLIMIT_CPU && new_rlim->rlim_cur == 0) { |
| 1301 | /* | 1306 | /* |
| @@ -1307,12 +1312,7 @@ int do_setrlimit(struct task_struct *tsk, unsigned int resource, | |||
| 1307 | new_rlim->rlim_cur = 1; | 1312 | new_rlim->rlim_cur = 1; |
| 1308 | } | 1313 | } |
| 1309 | 1314 | ||
| 1310 | old_rlim = tsk->signal->rlim + resource; | 1315 | if (!retval) |
| 1311 | task_lock(tsk->group_leader); | ||
| 1312 | if (new_rlim->rlim_max > old_rlim->rlim_max && | ||
| 1313 | !capable(CAP_SYS_RESOURCE)) | ||
| 1314 | retval = -EPERM; | ||
| 1315 | else | ||
| 1316 | *old_rlim = *new_rlim; | 1316 | *old_rlim = *new_rlim; |
| 1317 | task_unlock(tsk->group_leader); | 1317 | task_unlock(tsk->group_leader); |
| 1318 | 1318 | ||
