diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2017-05-31 04:33:51 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2017-06-09 23:51:33 -0400 |
commit | d9e968cb9f849770288f5fde3d8d3a5f7e339052 (patch) | |
tree | 7ceab9b36a791cd24813420c140f2475e6af5e7d | |
parent | ca2406ed58fef3f7c8ef6470cba807bfc3415605 (diff) |
getrlimit()/setrlimit(): move compat to native
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | kernel/compat.c | 38 | ||||
-rw-r--r-- | kernel/sys.c | 48 |
2 files changed, 48 insertions, 38 deletions
diff --git a/kernel/compat.c b/kernel/compat.c index 99408252762e..58b8e57398d1 100644 --- a/kernel/compat.c +++ b/kernel/compat.c | |||
@@ -427,44 +427,6 @@ COMPAT_SYSCALL_DEFINE3(sigprocmask, int, how, | |||
427 | 427 | ||
428 | #endif | 428 | #endif |
429 | 429 | ||
430 | COMPAT_SYSCALL_DEFINE2(setrlimit, unsigned int, resource, | ||
431 | struct compat_rlimit __user *, rlim) | ||
432 | { | ||
433 | struct rlimit r; | ||
434 | |||
435 | if (!access_ok(VERIFY_READ, rlim, sizeof(*rlim)) || | ||
436 | __get_user(r.rlim_cur, &rlim->rlim_cur) || | ||
437 | __get_user(r.rlim_max, &rlim->rlim_max)) | ||
438 | return -EFAULT; | ||
439 | |||
440 | if (r.rlim_cur == COMPAT_RLIM_INFINITY) | ||
441 | r.rlim_cur = RLIM_INFINITY; | ||
442 | if (r.rlim_max == COMPAT_RLIM_INFINITY) | ||
443 | r.rlim_max = RLIM_INFINITY; | ||
444 | return do_prlimit(current, resource, &r, NULL); | ||
445 | } | ||
446 | |||
447 | COMPAT_SYSCALL_DEFINE2(getrlimit, unsigned int, resource, | ||
448 | struct compat_rlimit __user *, rlim) | ||
449 | { | ||
450 | struct rlimit r; | ||
451 | int ret; | ||
452 | |||
453 | ret = do_prlimit(current, resource, NULL, &r); | ||
454 | if (!ret) { | ||
455 | if (r.rlim_cur > COMPAT_RLIM_INFINITY) | ||
456 | r.rlim_cur = COMPAT_RLIM_INFINITY; | ||
457 | if (r.rlim_max > COMPAT_RLIM_INFINITY) | ||
458 | r.rlim_max = COMPAT_RLIM_INFINITY; | ||
459 | |||
460 | if (!access_ok(VERIFY_WRITE, rlim, sizeof(*rlim)) || | ||
461 | __put_user(r.rlim_cur, &rlim->rlim_cur) || | ||
462 | __put_user(r.rlim_max, &rlim->rlim_max)) | ||
463 | return -EFAULT; | ||
464 | } | ||
465 | return ret; | ||
466 | } | ||
467 | |||
468 | int put_compat_rusage(const struct rusage *r, struct compat_rusage __user *ru) | 430 | int put_compat_rusage(const struct rusage *r, struct compat_rusage __user *ru) |
469 | { | 431 | { |
470 | if (!access_ok(VERIFY_WRITE, ru, sizeof(*ru)) || | 432 | if (!access_ok(VERIFY_WRITE, ru, sizeof(*ru)) || |
diff --git a/kernel/sys.c b/kernel/sys.c index 161b5eae9c77..873e6eaa314f 100644 --- a/kernel/sys.c +++ b/kernel/sys.c | |||
@@ -1332,6 +1332,54 @@ SYSCALL_DEFINE2(getrlimit, unsigned int, resource, struct rlimit __user *, rlim) | |||
1332 | return ret; | 1332 | return ret; |
1333 | } | 1333 | } |
1334 | 1334 | ||
1335 | #ifdef CONFIG_COMPAT | ||
1336 | |||
1337 | COMPAT_SYSCALL_DEFINE2(setrlimit, unsigned int, resource, | ||
1338 | struct compat_rlimit __user *, rlim) | ||
1339 | { | ||
1340 | struct rlimit r; | ||
1341 | struct compat_rlimit r32; | ||
1342 | |||
1343 | if (copy_from_user(&r32, rlim, sizeof(struct compat_rlimit))) | ||
1344 | return -EFAULT; | ||
1345 | |||
1346 | if (r32.rlim_cur == COMPAT_RLIM_INFINITY) | ||
1347 | r.rlim_cur = RLIM_INFINITY; | ||
1348 | else | ||
1349 | r.rlim_cur = r32.rlim_cur; | ||
1350 | if (r32.rlim_max == COMPAT_RLIM_INFINITY) | ||
1351 | r.rlim_max = RLIM_INFINITY; | ||
1352 | else | ||
1353 | r.rlim_max = r32.rlim_max; | ||
1354 | return do_prlimit(current, resource, &r, NULL); | ||
1355 | } | ||
1356 | |||
1357 | COMPAT_SYSCALL_DEFINE2(getrlimit, unsigned int, resource, | ||
1358 | struct compat_rlimit __user *, rlim) | ||
1359 | { | ||
1360 | struct rlimit r; | ||
1361 | int ret; | ||
1362 | |||
1363 | ret = do_prlimit(current, resource, NULL, &r); | ||
1364 | if (!ret) { | ||
1365 | struct rlimit r32; | ||
1366 | if (r.rlim_cur > COMPAT_RLIM_INFINITY) | ||
1367 | r32.rlim_cur = COMPAT_RLIM_INFINITY; | ||
1368 | else | ||
1369 | r32.rlim_cur = r.rlim_cur; | ||
1370 | if (r.rlim_max > COMPAT_RLIM_INFINITY) | ||
1371 | r32.rlim_max = COMPAT_RLIM_INFINITY; | ||
1372 | else | ||
1373 | r32.rlim_max = r.rlim_max; | ||
1374 | |||
1375 | if (copy_to_user(rlim, &r32, sizeof(struct compat_rlimit))) | ||
1376 | return -EFAULT; | ||
1377 | } | ||
1378 | return ret; | ||
1379 | } | ||
1380 | |||
1381 | #endif | ||
1382 | |||
1335 | #ifdef __ARCH_WANT_SYS_OLD_GETRLIMIT | 1383 | #ifdef __ARCH_WANT_SYS_OLD_GETRLIMIT |
1336 | 1384 | ||
1337 | /* | 1385 | /* |