diff options
| -rw-r--r-- | kernel/compat.c | 17 | ||||
| -rw-r--r-- | kernel/sys.c | 17 |
2 files changed, 11 insertions, 23 deletions
diff --git a/kernel/compat.c b/kernel/compat.c index 5adab05a3172..e167efce8423 100644 --- a/kernel/compat.c +++ b/kernel/compat.c | |||
| @@ -279,11 +279,6 @@ asmlinkage long compat_sys_setrlimit(unsigned int resource, | |||
| 279 | struct compat_rlimit __user *rlim) | 279 | struct compat_rlimit __user *rlim) |
| 280 | { | 280 | { |
| 281 | struct rlimit r; | 281 | struct rlimit r; |
| 282 | int ret; | ||
| 283 | mm_segment_t old_fs = get_fs (); | ||
| 284 | |||
| 285 | if (resource >= RLIM_NLIMITS) | ||
| 286 | return -EINVAL; | ||
| 287 | 282 | ||
| 288 | if (!access_ok(VERIFY_READ, rlim, sizeof(*rlim)) || | 283 | if (!access_ok(VERIFY_READ, rlim, sizeof(*rlim)) || |
| 289 | __get_user(r.rlim_cur, &rlim->rlim_cur) || | 284 | __get_user(r.rlim_cur, &rlim->rlim_cur) || |
| @@ -294,10 +289,7 @@ asmlinkage long compat_sys_setrlimit(unsigned int resource, | |||
| 294 | r.rlim_cur = RLIM_INFINITY; | 289 | r.rlim_cur = RLIM_INFINITY; |
| 295 | if (r.rlim_max == COMPAT_RLIM_INFINITY) | 290 | if (r.rlim_max == COMPAT_RLIM_INFINITY) |
| 296 | r.rlim_max = RLIM_INFINITY; | 291 | r.rlim_max = RLIM_INFINITY; |
| 297 | set_fs(KERNEL_DS); | 292 | return do_prlimit(current, resource, &r, NULL); |
| 298 | ret = sys_setrlimit(resource, (struct rlimit __user *) &r); | ||
| 299 | set_fs(old_fs); | ||
| 300 | return ret; | ||
| 301 | } | 293 | } |
| 302 | 294 | ||
| 303 | #ifdef COMPAT_RLIM_OLD_INFINITY | 295 | #ifdef COMPAT_RLIM_OLD_INFINITY |
| @@ -329,16 +321,13 @@ asmlinkage long compat_sys_old_getrlimit(unsigned int resource, | |||
| 329 | 321 | ||
| 330 | #endif | 322 | #endif |
| 331 | 323 | ||
| 332 | asmlinkage long compat_sys_getrlimit (unsigned int resource, | 324 | asmlinkage long compat_sys_getrlimit(unsigned int resource, |
| 333 | struct compat_rlimit __user *rlim) | 325 | struct compat_rlimit __user *rlim) |
| 334 | { | 326 | { |
| 335 | struct rlimit r; | 327 | struct rlimit r; |
| 336 | int ret; | 328 | int ret; |
| 337 | mm_segment_t old_fs = get_fs(); | ||
| 338 | 329 | ||
| 339 | set_fs(KERNEL_DS); | 330 | ret = do_prlimit(current, resource, NULL, &r); |
| 340 | ret = sys_getrlimit(resource, (struct rlimit __user *) &r); | ||
| 341 | set_fs(old_fs); | ||
| 342 | if (!ret) { | 331 | if (!ret) { |
| 343 | if (r.rlim_cur > COMPAT_RLIM_INFINITY) | 332 | if (r.rlim_cur > COMPAT_RLIM_INFINITY) |
| 344 | r.rlim_cur = COMPAT_RLIM_INFINITY; | 333 | r.rlim_cur = COMPAT_RLIM_INFINITY; |
diff --git a/kernel/sys.c b/kernel/sys.c index bc7d1be0960e..9da98dd47276 100644 --- a/kernel/sys.c +++ b/kernel/sys.c | |||
| @@ -1236,15 +1236,14 @@ SYSCALL_DEFINE2(setdomainname, char __user *, name, int, len) | |||
| 1236 | 1236 | ||
| 1237 | SYSCALL_DEFINE2(getrlimit, unsigned int, resource, struct rlimit __user *, rlim) | 1237 | SYSCALL_DEFINE2(getrlimit, unsigned int, resource, struct rlimit __user *, rlim) |
| 1238 | { | 1238 | { |
| 1239 | if (resource >= RLIM_NLIMITS) | 1239 | struct rlimit value; |
| 1240 | return -EINVAL; | 1240 | int ret; |
| 1241 | else { | 1241 | |
| 1242 | struct rlimit value; | 1242 | ret = do_prlimit(current, resource, NULL, &value); |
| 1243 | task_lock(current->group_leader); | 1243 | if (!ret) |
| 1244 | value = current->signal->rlim[resource]; | 1244 | ret = copy_to_user(rlim, &value, sizeof(*rlim)) ? -EFAULT : 0; |
| 1245 | task_unlock(current->group_leader); | 1245 | |
| 1246 | return copy_to_user(rlim, &value, sizeof(*rlim)) ? -EFAULT : 0; | 1246 | return ret; |
| 1247 | } | ||
| 1248 | } | 1247 | } |
| 1249 | 1248 | ||
| 1250 | #ifdef __ARCH_WANT_SYS_OLD_GETRLIMIT | 1249 | #ifdef __ARCH_WANT_SYS_OLD_GETRLIMIT |
