aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2017-05-31 04:33:51 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2017-06-09 23:51:33 -0400
commitd9e968cb9f849770288f5fde3d8d3a5f7e339052 (patch)
tree7ceab9b36a791cd24813420c140f2475e6af5e7d
parentca2406ed58fef3f7c8ef6470cba807bfc3415605 (diff)
getrlimit()/setrlimit(): move compat to native
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--kernel/compat.c38
-rw-r--r--kernel/sys.c48
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
430COMPAT_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
447COMPAT_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
468int put_compat_rusage(const struct rusage *r, struct compat_rusage __user *ru) 430int 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
1337COMPAT_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
1357COMPAT_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/*