Skip to content

Commit d9e968c

Browse files
author
Al Viro
committed
getrlimit()/setrlimit(): move compat to native
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
1 parent ca2406e commit d9e968c

File tree

2 files changed

+48
-38
lines changed

2 files changed

+48
-38
lines changed

kernel/compat.c

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -427,44 +427,6 @@ COMPAT_SYSCALL_DEFINE3(sigprocmask, int, how,
427427

428428
#endif
429429

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-
468430
int put_compat_rusage(const struct rusage *r, struct compat_rusage __user *ru)
469431
{
470432
if (!access_ok(VERIFY_WRITE, ru, sizeof(*ru)) ||

kernel/sys.c

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1332,6 +1332,54 @@ SYSCALL_DEFINE2(getrlimit, unsigned int, resource, struct rlimit __user *, rlim)
13321332
return ret;
13331333
}
13341334

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+
13351383
#ifdef __ARCH_WANT_SYS_OLD_GETRLIMIT
13361384

13371385
/*

0 commit comments

Comments
 (0)