sysctl: parisc Use the compat_sys_sysctl
Now that we have a generic 32bit compatibility implementation there is no need for parisc to implement it's own. Cc: Thibaut Varene <T-Bone@parisc-linux.org> Acked-by: Kyle McMartin <kyle@mcmartin.ca> Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
This commit is contained in:
parent
aff639cdcf
commit
f78a9a5a56
@ -90,77 +90,6 @@ asmlinkage long sys32_unimplemented(int r26, int r25, int r24, int r23,
|
|||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SYSCTL
|
|
||||||
|
|
||||||
struct __sysctl_args32 {
|
|
||||||
u32 name;
|
|
||||||
int nlen;
|
|
||||||
u32 oldval;
|
|
||||||
u32 oldlenp;
|
|
||||||
u32 newval;
|
|
||||||
u32 newlen;
|
|
||||||
u32 __unused[4];
|
|
||||||
};
|
|
||||||
|
|
||||||
asmlinkage long sys32_sysctl(struct __sysctl_args32 __user *args)
|
|
||||||
{
|
|
||||||
#ifndef CONFIG_SYSCTL_SYSCALL
|
|
||||||
return -ENOSYS;
|
|
||||||
#else
|
|
||||||
struct __sysctl_args32 tmp;
|
|
||||||
int error;
|
|
||||||
unsigned int oldlen32;
|
|
||||||
size_t oldlen, __user *oldlenp = NULL;
|
|
||||||
unsigned long addr = (((long __force)&args->__unused[0]) + 7) & ~7;
|
|
||||||
|
|
||||||
DBG(("sysctl32(%p)\n", args));
|
|
||||||
|
|
||||||
if (copy_from_user(&tmp, args, sizeof(tmp)))
|
|
||||||
return -EFAULT;
|
|
||||||
|
|
||||||
if (tmp.oldval && tmp.oldlenp) {
|
|
||||||
/* Duh, this is ugly and might not work if sysctl_args
|
|
||||||
is in read-only memory, but do_sysctl does indirectly
|
|
||||||
a lot of uaccess in both directions and we'd have to
|
|
||||||
basically copy the whole sysctl.c here, and
|
|
||||||
glibc's __sysctl uses rw memory for the structure
|
|
||||||
anyway. */
|
|
||||||
/* a possibly better hack than this, which will avoid the
|
|
||||||
* problem if the struct is read only, is to push the
|
|
||||||
* 'oldlen' value out to the user's stack instead. -PB
|
|
||||||
*/
|
|
||||||
if (get_user(oldlen32, (u32 *)(u64)tmp.oldlenp))
|
|
||||||
return -EFAULT;
|
|
||||||
oldlen = oldlen32;
|
|
||||||
if (put_user(oldlen, (size_t *)addr))
|
|
||||||
return -EFAULT;
|
|
||||||
oldlenp = (size_t *)addr;
|
|
||||||
}
|
|
||||||
|
|
||||||
lock_kernel();
|
|
||||||
error = do_sysctl((int __user *)(u64)tmp.name, tmp.nlen,
|
|
||||||
(void __user *)(u64)tmp.oldval, oldlenp,
|
|
||||||
(void __user *)(u64)tmp.newval, tmp.newlen);
|
|
||||||
unlock_kernel();
|
|
||||||
if (oldlenp) {
|
|
||||||
if (!error) {
|
|
||||||
if (get_user(oldlen, (size_t *)addr)) {
|
|
||||||
error = -EFAULT;
|
|
||||||
} else {
|
|
||||||
oldlen32 = oldlen;
|
|
||||||
if (put_user(oldlen32, (u32 *)(u64)tmp.oldlenp))
|
|
||||||
error = -EFAULT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (copy_to_user(args->__unused, tmp.__unused, sizeof(tmp.__unused)))
|
|
||||||
error = -EFAULT;
|
|
||||||
}
|
|
||||||
return error;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* CONFIG_SYSCTL */
|
|
||||||
|
|
||||||
asmlinkage long sys32_sched_rr_get_interval(pid_t pid,
|
asmlinkage long sys32_sched_rr_get_interval(pid_t pid,
|
||||||
struct compat_timespec __user *interval)
|
struct compat_timespec __user *interval)
|
||||||
{
|
{
|
||||||
|
@ -234,7 +234,7 @@
|
|||||||
ENTRY_SAME(getsid)
|
ENTRY_SAME(getsid)
|
||||||
ENTRY_SAME(fdatasync)
|
ENTRY_SAME(fdatasync)
|
||||||
/* struct __sysctl_args is a mess */
|
/* struct __sysctl_args is a mess */
|
||||||
ENTRY_DIFF(sysctl)
|
ENTRY_COMP(sysctl)
|
||||||
ENTRY_SAME(mlock) /* 150 */
|
ENTRY_SAME(mlock) /* 150 */
|
||||||
ENTRY_SAME(munlock)
|
ENTRY_SAME(munlock)
|
||||||
ENTRY_SAME(mlockall)
|
ENTRY_SAME(mlockall)
|
||||||
|
Loading…
Reference in New Issue
Block a user