mirror of https://gitee.com/openkylin/linux.git
[CVE-2009-0029] s390 specific system call wrappers
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
This commit is contained in:
parent
2b66421995
commit
26689452f5
|
@ -547,7 +547,7 @@ sys32_setdomainname_wrapper:
|
|||
.globl sys32_newuname_wrapper
|
||||
sys32_newuname_wrapper:
|
||||
llgtr %r2,%r2 # struct new_utsname *
|
||||
jg s390x_newuname # branch to system call
|
||||
jg sys_s390_newuname # branch to system call
|
||||
|
||||
.globl compat_sys_adjtimex_wrapper
|
||||
compat_sys_adjtimex_wrapper:
|
||||
|
@ -615,7 +615,7 @@ sys32_sysfs_wrapper:
|
|||
.globl sys32_personality_wrapper
|
||||
sys32_personality_wrapper:
|
||||
llgfr %r2,%r2 # unsigned long
|
||||
jg s390x_personality # branch to system call
|
||||
jg sys_s390_personality # branch to system call
|
||||
|
||||
.globl sys32_setfsuid16_wrapper
|
||||
sys32_setfsuid16_wrapper:
|
||||
|
|
|
@ -31,21 +31,22 @@ struct old_sigaction;
|
|||
struct sel_arg_struct;
|
||||
|
||||
long sys_mmap2(struct mmap_arg_struct __user *arg);
|
||||
long old_mmap(struct mmap_arg_struct __user *arg);
|
||||
long sys_s390_old_mmap(struct mmap_arg_struct __user *arg);
|
||||
long sys_ipc(uint call, int first, unsigned long second,
|
||||
unsigned long third, void __user *ptr);
|
||||
long s390x_newuname(struct new_utsname __user *name);
|
||||
long s390x_personality(unsigned long personality);
|
||||
long s390_fadvise64(int fd, u32 offset_high, u32 offset_low,
|
||||
long sys_s390_newuname(struct new_utsname __user *name);
|
||||
long sys_s390_personality(unsigned long personality);
|
||||
long sys_s390_fadvise64(int fd, u32 offset_high, u32 offset_low,
|
||||
size_t len, int advice);
|
||||
long s390_fadvise64_64(struct fadvise64_64_args __user *args);
|
||||
long s390_fallocate(int fd, int mode, loff_t offset, u32 len_high, u32 len_low);
|
||||
long sys_s390_fadvise64_64(struct fadvise64_64_args __user *args);
|
||||
long sys_s390_fallocate(int fd, int mode, loff_t offset, u32 len_high,
|
||||
u32 len_low);
|
||||
long sys_fork(void);
|
||||
long sys_clone(void);
|
||||
long sys_vfork(void);
|
||||
void execve_tail(void);
|
||||
long sys_execve(void);
|
||||
int sys_sigsuspend(int history0, int history1, old_sigset_t mask);
|
||||
long sys_sigsuspend(int history0, int history1, old_sigset_t mask);
|
||||
long sys_sigaction(int sig, const struct old_sigaction __user *act,
|
||||
struct old_sigaction __user *oact);
|
||||
long sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss);
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
#include <linux/tick.h>
|
||||
#include <linux/elfcore.h>
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <linux/syscalls.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/system.h>
|
||||
|
@ -225,13 +226,13 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long new_stackp,
|
|||
return 0;
|
||||
}
|
||||
|
||||
asmlinkage long sys_fork(void)
|
||||
SYSCALL_DEFINE0(fork)
|
||||
{
|
||||
struct pt_regs *regs = task_pt_regs(current);
|
||||
return do_fork(SIGCHLD, regs->gprs[15], regs, 0, NULL, NULL);
|
||||
}
|
||||
|
||||
asmlinkage long sys_clone(void)
|
||||
SYSCALL_DEFINE0(clone)
|
||||
{
|
||||
struct pt_regs *regs = task_pt_regs(current);
|
||||
unsigned long clone_flags;
|
||||
|
@ -258,7 +259,7 @@ asmlinkage long sys_clone(void)
|
|||
* do not have enough call-clobbered registers to hold all
|
||||
* the information you need.
|
||||
*/
|
||||
asmlinkage long sys_vfork(void)
|
||||
SYSCALL_DEFINE0(vfork)
|
||||
{
|
||||
struct pt_regs *regs = task_pt_regs(current);
|
||||
return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD,
|
||||
|
@ -278,7 +279,7 @@ asmlinkage void execve_tail(void)
|
|||
/*
|
||||
* sys_execve() executes a new program.
|
||||
*/
|
||||
asmlinkage long sys_execve(void)
|
||||
SYSCALL_DEFINE0(execve)
|
||||
{
|
||||
struct pt_regs *regs = task_pt_regs(current);
|
||||
char *filename;
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include <linux/personality.h>
|
||||
#include <linux/binfmts.h>
|
||||
#include <linux/tracehook.h>
|
||||
#include <linux/syscalls.h>
|
||||
#include <asm/ucontext.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/lowcore.h>
|
||||
|
@ -53,8 +54,7 @@ typedef struct
|
|||
/*
|
||||
* Atomically swap in the new signal mask, and wait for a signal.
|
||||
*/
|
||||
asmlinkage int
|
||||
sys_sigsuspend(int history0, int history1, old_sigset_t mask)
|
||||
SYSCALL_DEFINE3(sigsuspend, int, history0, int, history1, old_sigset_t, mask)
|
||||
{
|
||||
mask &= _BLOCKABLE;
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
|
@ -70,9 +70,8 @@ sys_sigsuspend(int history0, int history1, old_sigset_t mask)
|
|||
return -ERESTARTNOHAND;
|
||||
}
|
||||
|
||||
asmlinkage long
|
||||
sys_sigaction(int sig, const struct old_sigaction __user *act,
|
||||
struct old_sigaction __user *oact)
|
||||
SYSCALL_DEFINE3(sigaction, int, sig, const struct old_sigaction __user *, act,
|
||||
struct old_sigaction __user *, oact)
|
||||
{
|
||||
struct k_sigaction new_ka, old_ka;
|
||||
int ret;
|
||||
|
@ -102,15 +101,13 @@ sys_sigaction(int sig, const struct old_sigaction __user *act,
|
|||
return ret;
|
||||
}
|
||||
|
||||
asmlinkage long
|
||||
sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss)
|
||||
SYSCALL_DEFINE2(sigaltstack, const stack_t __user *, uss,
|
||||
stack_t __user *, uoss)
|
||||
{
|
||||
struct pt_regs *regs = task_pt_regs(current);
|
||||
return do_sigaltstack(uss, uoss, regs->gprs[15]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Returns non-zero on fault. */
|
||||
static int save_sigregs(struct pt_regs *regs, _sigregs __user *sregs)
|
||||
{
|
||||
|
@ -164,7 +161,7 @@ static int restore_sigregs(struct pt_regs *regs, _sigregs __user *sregs)
|
|||
return 0;
|
||||
}
|
||||
|
||||
asmlinkage long sys_sigreturn(void)
|
||||
SYSCALL_DEFINE0(sigreturn)
|
||||
{
|
||||
struct pt_regs *regs = task_pt_regs(current);
|
||||
sigframe __user *frame = (sigframe __user *)regs->gprs[15];
|
||||
|
@ -191,7 +188,7 @@ asmlinkage long sys_sigreturn(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
asmlinkage long sys_rt_sigreturn(void)
|
||||
SYSCALL_DEFINE0(rt_sigreturn)
|
||||
{
|
||||
struct pt_regs *regs = task_pt_regs(current);
|
||||
rt_sigframe __user *frame = (rt_sigframe __user *)regs->gprs[15];
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include <linux/personality.h>
|
||||
#include <linux/unistd.h>
|
||||
#include <linux/ipc.h>
|
||||
#include <linux/syscalls.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include "entry.h"
|
||||
|
||||
|
@ -74,7 +75,7 @@ struct mmap_arg_struct {
|
|||
unsigned long offset;
|
||||
};
|
||||
|
||||
asmlinkage long sys_mmap2(struct mmap_arg_struct __user *arg)
|
||||
SYSCALL_DEFINE1(mmap2, struct mmap_arg_struct __user *, arg)
|
||||
{
|
||||
struct mmap_arg_struct a;
|
||||
int error = -EFAULT;
|
||||
|
@ -86,7 +87,7 @@ asmlinkage long sys_mmap2(struct mmap_arg_struct __user *arg)
|
|||
return error;
|
||||
}
|
||||
|
||||
asmlinkage long old_mmap(struct mmap_arg_struct __user *arg)
|
||||
SYSCALL_DEFINE1(s390_old_mmap, struct mmap_arg_struct __user *, arg)
|
||||
{
|
||||
struct mmap_arg_struct a;
|
||||
long error = -EFAULT;
|
||||
|
@ -108,8 +109,8 @@ asmlinkage long old_mmap(struct mmap_arg_struct __user *arg)
|
|||
*
|
||||
* This is really horribly ugly.
|
||||
*/
|
||||
asmlinkage long sys_ipc(uint call, int first, unsigned long second,
|
||||
unsigned long third, void __user *ptr)
|
||||
SYSCALL_DEFINE5(ipc, uint, call, int, first, unsigned long, second,
|
||||
unsigned long, third, void __user *, ptr)
|
||||
{
|
||||
struct ipc_kludge tmp;
|
||||
int ret;
|
||||
|
@ -175,7 +176,7 @@ asmlinkage long sys_ipc(uint call, int first, unsigned long second,
|
|||
}
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
asmlinkage long s390x_newuname(struct new_utsname __user *name)
|
||||
SYSCALL_DEFINE1(s390_newuname, struct new_utsname __user *, name)
|
||||
{
|
||||
int ret = sys_newuname(name);
|
||||
|
||||
|
@ -186,7 +187,7 @@ asmlinkage long s390x_newuname(struct new_utsname __user *name)
|
|||
return ret;
|
||||
}
|
||||
|
||||
asmlinkage long s390x_personality(unsigned long personality)
|
||||
SYSCALL_DEFINE1(s390_personality, unsigned long, personality)
|
||||
{
|
||||
int ret;
|
||||
|
||||
|
@ -205,15 +206,13 @@ asmlinkage long s390x_personality(unsigned long personality)
|
|||
*/
|
||||
#ifndef CONFIG_64BIT
|
||||
|
||||
asmlinkage long
|
||||
s390_fadvise64(int fd, u32 offset_high, u32 offset_low, size_t len, int advice)
|
||||
SYSCALL_DEFINE5(s390_fadvise64, int, fd, u32, offset_high, u32, offset_low,
|
||||
size_t, len, int, advice)
|
||||
{
|
||||
return sys_fadvise64(fd, (u64) offset_high << 32 | offset_low,
|
||||
len, advice);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
struct fadvise64_64_args {
|
||||
int fd;
|
||||
long long offset;
|
||||
|
@ -221,8 +220,7 @@ struct fadvise64_64_args {
|
|||
int advice;
|
||||
};
|
||||
|
||||
asmlinkage long
|
||||
s390_fadvise64_64(struct fadvise64_64_args __user *args)
|
||||
SYSCALL_DEFINE1(s390_fadvise64_64, struct fadvise64_64_args __user *, args)
|
||||
{
|
||||
struct fadvise64_64_args a;
|
||||
|
||||
|
@ -231,7 +229,6 @@ s390_fadvise64_64(struct fadvise64_64_args __user *args)
|
|||
return sys_fadvise64_64(a.fd, a.offset, a.len, a.advice);
|
||||
}
|
||||
|
||||
#ifndef CONFIG_64BIT
|
||||
/*
|
||||
* This is a wrapper to call sys_fallocate(). For 31 bit s390 the last
|
||||
* 64 bit argument "len" is split into the upper and lower 32 bits. The
|
||||
|
@ -244,9 +241,19 @@ s390_fadvise64_64(struct fadvise64_64_args __user *args)
|
|||
* to
|
||||
* %r2: fd, %r3: mode, %r4/%r5: offset, 96(%r15)-103(%r15): len
|
||||
*/
|
||||
asmlinkage long s390_fallocate(int fd, int mode, loff_t offset,
|
||||
SYSCALL_DEFINE(s390_fallocate)(int fd, int mode, loff_t offset,
|
||||
u32 len_high, u32 len_low)
|
||||
{
|
||||
return sys_fallocate(fd, mode, offset, ((u64)len_high << 32) | len_low);
|
||||
}
|
||||
#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
|
||||
asmlinkage long SyS_s390_fallocate(long fd, long mode, loff_t offset,
|
||||
long len_high, long len_low)
|
||||
{
|
||||
return SYSC_s390_fallocate((int) fd, (int) mode, offset,
|
||||
(u32) len_high, (u32) len_low);
|
||||
}
|
||||
SYSCALL_ALIAS(sys_s390_fallocate, SyS_s390_fallocate);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
@ -98,7 +98,7 @@ SYSCALL(sys_uselib,sys_uselib,sys32_uselib_wrapper)
|
|||
SYSCALL(sys_swapon,sys_swapon,sys32_swapon_wrapper)
|
||||
SYSCALL(sys_reboot,sys_reboot,sys32_reboot_wrapper)
|
||||
SYSCALL(sys_ni_syscall,sys_ni_syscall,old32_readdir_wrapper) /* old readdir syscall */
|
||||
SYSCALL(old_mmap,old_mmap,old32_mmap_wrapper) /* 90 */
|
||||
SYSCALL(sys_s390_old_mmap,sys_s390_old_mmap,old32_mmap_wrapper) /* 90 */
|
||||
SYSCALL(sys_munmap,sys_munmap,sys32_munmap_wrapper)
|
||||
SYSCALL(sys_truncate,sys_truncate,sys32_truncate_wrapper)
|
||||
SYSCALL(sys_ftruncate,sys_ftruncate,sys32_ftruncate_wrapper)
|
||||
|
@ -130,7 +130,7 @@ SYSCALL(sys_fsync,sys_fsync,sys32_fsync_wrapper)
|
|||
SYSCALL(sys_sigreturn,sys_sigreturn,sys32_sigreturn)
|
||||
SYSCALL(sys_clone,sys_clone,sys32_clone) /* 120 */
|
||||
SYSCALL(sys_setdomainname,sys_setdomainname,sys32_setdomainname_wrapper)
|
||||
SYSCALL(sys_newuname,s390x_newuname,sys32_newuname_wrapper)
|
||||
SYSCALL(sys_newuname,sys_s390_newuname,sys32_newuname_wrapper)
|
||||
NI_SYSCALL /* modify_ldt for i386 */
|
||||
SYSCALL(sys_adjtimex,sys_adjtimex,compat_sys_adjtimex_wrapper)
|
||||
SYSCALL(sys_mprotect,sys_mprotect,sys32_mprotect_wrapper) /* 125 */
|
||||
|
@ -144,7 +144,7 @@ SYSCALL(sys_getpgid,sys_getpgid,sys32_getpgid_wrapper)
|
|||
SYSCALL(sys_fchdir,sys_fchdir,sys32_fchdir_wrapper)
|
||||
SYSCALL(sys_bdflush,sys_bdflush,sys32_bdflush_wrapper)
|
||||
SYSCALL(sys_sysfs,sys_sysfs,sys32_sysfs_wrapper) /* 135 */
|
||||
SYSCALL(sys_personality,s390x_personality,sys32_personality_wrapper)
|
||||
SYSCALL(sys_personality,sys_s390_personality,sys32_personality_wrapper)
|
||||
NI_SYSCALL /* for afs_syscall */
|
||||
SYSCALL(sys_setfsuid16,sys_ni_syscall,sys32_setfsuid16_wrapper) /* old setfsuid16 syscall */
|
||||
SYSCALL(sys_setfsgid16,sys_ni_syscall,sys32_setfsgid16_wrapper) /* old setfsgid16 syscall */
|
||||
|
@ -261,7 +261,7 @@ SYSCALL(sys_epoll_create,sys_epoll_create,sys_epoll_create_wrapper)
|
|||
SYSCALL(sys_epoll_ctl,sys_epoll_ctl,sys_epoll_ctl_wrapper) /* 250 */
|
||||
SYSCALL(sys_epoll_wait,sys_epoll_wait,sys_epoll_wait_wrapper)
|
||||
SYSCALL(sys_set_tid_address,sys_set_tid_address,sys32_set_tid_address_wrapper)
|
||||
SYSCALL(s390_fadvise64,sys_fadvise64_64,sys32_fadvise64_wrapper)
|
||||
SYSCALL(sys_s390_fadvise64,sys_fadvise64_64,sys32_fadvise64_wrapper)
|
||||
SYSCALL(sys_timer_create,sys_timer_create,sys32_timer_create_wrapper)
|
||||
SYSCALL(sys_timer_settime,sys_timer_settime,sys32_timer_settime_wrapper) /* 255 */
|
||||
SYSCALL(sys_timer_gettime,sys_timer_gettime,sys32_timer_gettime_wrapper)
|
||||
|
@ -272,7 +272,7 @@ SYSCALL(sys_clock_gettime,sys_clock_gettime,sys32_clock_gettime_wrapper) /* 260
|
|||
SYSCALL(sys_clock_getres,sys_clock_getres,sys32_clock_getres_wrapper)
|
||||
SYSCALL(sys_clock_nanosleep,sys_clock_nanosleep,sys32_clock_nanosleep_wrapper)
|
||||
NI_SYSCALL /* reserved for vserver */
|
||||
SYSCALL(s390_fadvise64_64,sys_ni_syscall,sys32_fadvise64_64_wrapper)
|
||||
SYSCALL(sys_s390_fadvise64_64,sys_ni_syscall,sys32_fadvise64_64_wrapper)
|
||||
SYSCALL(sys_statfs64,sys_statfs64,compat_sys_statfs64_wrapper)
|
||||
SYSCALL(sys_fstatfs64,sys_fstatfs64,compat_sys_fstatfs64_wrapper)
|
||||
SYSCALL(sys_remap_file_pages,sys_remap_file_pages,sys32_remap_file_pages_wrapper)
|
||||
|
@ -322,7 +322,7 @@ NI_SYSCALL /* 310 sys_move_pages */
|
|||
SYSCALL(sys_getcpu,sys_getcpu,sys_getcpu_wrapper)
|
||||
SYSCALL(sys_epoll_pwait,sys_epoll_pwait,compat_sys_epoll_pwait_wrapper)
|
||||
SYSCALL(sys_utimes,sys_utimes,compat_sys_utimes_wrapper)
|
||||
SYSCALL(s390_fallocate,sys_fallocate,sys_fallocate_wrapper)
|
||||
SYSCALL(sys_s390_fallocate,sys_fallocate,sys_fallocate_wrapper)
|
||||
SYSCALL(sys_utimensat,sys_utimensat,compat_sys_utimensat_wrapper) /* 315 */
|
||||
SYSCALL(sys_signalfd,sys_signalfd,compat_sys_signalfd_wrapper)
|
||||
NI_SYSCALL /* 317 old sys_timer_fd */
|
||||
|
|
Loading…
Reference in New Issue