mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-30 06:10:56 +00:00
take compat_sys_old_getrlimit() to native syscall
... and sanitize the ifdefs in there Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
123dbfe088
commit
613763a1f0
6 changed files with 25 additions and 33 deletions
|
@ -109,7 +109,6 @@ struct compat_statfs {
|
||||||
int f_spare[4];
|
int f_spare[4];
|
||||||
};
|
};
|
||||||
|
|
||||||
#define COMPAT_RLIM_OLD_INFINITY 0x7fffffff
|
|
||||||
#define COMPAT_RLIM_INFINITY 0xffffffff
|
#define COMPAT_RLIM_INFINITY 0xffffffff
|
||||||
|
|
||||||
typedef u32 compat_old_sigset_t;
|
typedef u32 compat_old_sigset_t;
|
||||||
|
|
|
@ -178,7 +178,6 @@ struct compat_statfs64 {
|
||||||
u32 f_spare[4];
|
u32 f_spare[4];
|
||||||
};
|
};
|
||||||
|
|
||||||
#define COMPAT_RLIM_OLD_INFINITY 0x7fffffff
|
|
||||||
#define COMPAT_RLIM_INFINITY 0xffffffff
|
#define COMPAT_RLIM_INFINITY 0xffffffff
|
||||||
|
|
||||||
typedef u32 compat_old_sigset_t; /* at least 32 bits */
|
typedef u32 compat_old_sigset_t; /* at least 32 bits */
|
||||||
|
|
|
@ -116,7 +116,6 @@ struct compat_statfs {
|
||||||
int f_spare[4];
|
int f_spare[4];
|
||||||
};
|
};
|
||||||
|
|
||||||
#define COMPAT_RLIM_OLD_INFINITY 0x7fffffff
|
|
||||||
#define COMPAT_RLIM_INFINITY 0xffffffff
|
#define COMPAT_RLIM_INFINITY 0xffffffff
|
||||||
|
|
||||||
typedef u32 compat_old_sigset_t; /* at least 32 bits */
|
typedef u32 compat_old_sigset_t; /* at least 32 bits */
|
||||||
|
|
|
@ -650,7 +650,7 @@ asmlinkage long sys_olduname(struct oldold_utsname __user *);
|
||||||
|
|
||||||
asmlinkage long sys_getrlimit(unsigned int resource,
|
asmlinkage long sys_getrlimit(unsigned int resource,
|
||||||
struct rlimit __user *rlim);
|
struct rlimit __user *rlim);
|
||||||
#if defined(COMPAT_RLIM_OLD_INFINITY) || !(defined(CONFIG_IA64))
|
#ifdef __ARCH_WANT_SYS_OLD_GETRLIMIT
|
||||||
asmlinkage long sys_old_getrlimit(unsigned int resource, struct rlimit __user *rlim);
|
asmlinkage long sys_old_getrlimit(unsigned int resource, struct rlimit __user *rlim);
|
||||||
#endif
|
#endif
|
||||||
asmlinkage long sys_setrlimit(unsigned int resource,
|
asmlinkage long sys_setrlimit(unsigned int resource,
|
||||||
|
|
|
@ -468,35 +468,6 @@ COMPAT_SYSCALL_DEFINE2(setrlimit, unsigned int, resource,
|
||||||
return do_prlimit(current, resource, &r, NULL);
|
return do_prlimit(current, resource, &r, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef COMPAT_RLIM_OLD_INFINITY
|
|
||||||
|
|
||||||
COMPAT_SYSCALL_DEFINE2(old_getrlimit, unsigned int, resource,
|
|
||||||
struct compat_rlimit __user *, rlim)
|
|
||||||
{
|
|
||||||
struct rlimit r;
|
|
||||||
int ret;
|
|
||||||
mm_segment_t old_fs = get_fs();
|
|
||||||
|
|
||||||
set_fs(KERNEL_DS);
|
|
||||||
ret = sys_old_getrlimit(resource, (struct rlimit __user *)&r);
|
|
||||||
set_fs(old_fs);
|
|
||||||
|
|
||||||
if (!ret) {
|
|
||||||
if (r.rlim_cur > COMPAT_RLIM_OLD_INFINITY)
|
|
||||||
r.rlim_cur = COMPAT_RLIM_INFINITY;
|
|
||||||
if (r.rlim_max > COMPAT_RLIM_OLD_INFINITY)
|
|
||||||
r.rlim_max = COMPAT_RLIM_INFINITY;
|
|
||||||
|
|
||||||
if (!access_ok(VERIFY_WRITE, rlim, sizeof(*rlim)) ||
|
|
||||||
__put_user(r.rlim_cur, &rlim->rlim_cur) ||
|
|
||||||
__put_user(r.rlim_max, &rlim->rlim_max))
|
|
||||||
return -EFAULT;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
COMPAT_SYSCALL_DEFINE2(getrlimit, unsigned int, resource,
|
COMPAT_SYSCALL_DEFINE2(getrlimit, unsigned int, resource,
|
||||||
struct compat_rlimit __user *, rlim)
|
struct compat_rlimit __user *, rlim)
|
||||||
{
|
{
|
||||||
|
|
24
kernel/sys.c
24
kernel/sys.c
|
@ -1328,6 +1328,30 @@ SYSCALL_DEFINE2(old_getrlimit, unsigned int, resource,
|
||||||
return copy_to_user(rlim, &x, sizeof(x)) ? -EFAULT : 0;
|
return copy_to_user(rlim, &x, sizeof(x)) ? -EFAULT : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_COMPAT
|
||||||
|
COMPAT_SYSCALL_DEFINE2(old_getrlimit, unsigned int, resource,
|
||||||
|
struct compat_rlimit __user *, rlim)
|
||||||
|
{
|
||||||
|
struct rlimit r;
|
||||||
|
|
||||||
|
if (resource >= RLIM_NLIMITS)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
task_lock(current->group_leader);
|
||||||
|
r = current->signal->rlim[resource];
|
||||||
|
task_unlock(current->group_leader);
|
||||||
|
if (r.rlim_cur > 0x7FFFFFFF)
|
||||||
|
r.rlim_cur = 0x7FFFFFFF;
|
||||||
|
if (r.rlim_max > 0x7FFFFFFF)
|
||||||
|
r.rlim_max = 0x7FFFFFFF;
|
||||||
|
|
||||||
|
if (put_user(r.rlim_cur, &rlim->rlim_cur) ||
|
||||||
|
put_user(r.rlim_max, &rlim->rlim_max))
|
||||||
|
return -EFAULT;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static inline bool rlim64_is_infinity(__u64 rlim64)
|
static inline bool rlim64_is_infinity(__u64 rlim64)
|
||||||
|
|
Loading…
Reference in a new issue