diff options
| author | Heiko Carstens <heiko.carstens@de.ibm.com> | 2009-01-14 14:14:36 +0100 | 
|---|---|---|
| committer | Heiko Carstens <heiko.carstens@de.ibm.com> | 2009-01-14 14:15:32 +0100 | 
| commit | 26689452f5ca201add63b1b1ff0dbcf82d6885e7 (patch) | |
| tree | 04fd8fa7b9dec6154166b0b8fcb962d05b067a45 | |
| parent | 2b66421995d2e93c9d1a0111acf2581f8529c6e5 (diff) | |
[CVE-2009-0029] s390 specific system call wrappers
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
| -rw-r--r-- | arch/s390/kernel/compat_wrapper.S | 4 | ||||
| -rw-r--r-- | arch/s390/kernel/entry.h | 15 | ||||
| -rw-r--r-- | arch/s390/kernel/process.c | 9 | ||||
| -rw-r--r-- | arch/s390/kernel/signal.c | 19 | ||||
| -rw-r--r-- | arch/s390/kernel/sys_s390.c | 35 | ||||
| -rw-r--r-- | arch/s390/kernel/syscalls.S | 12 | 
6 files changed, 50 insertions, 44 deletions
diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S index fc2c97197a53..6035cd20c7a7 100644 --- a/arch/s390/kernel/compat_wrapper.S +++ b/arch/s390/kernel/compat_wrapper.S @@ -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: diff --git a/arch/s390/kernel/entry.h b/arch/s390/kernel/entry.h index 5c9b5b37004e..950c59c6688b 100644 --- a/arch/s390/kernel/entry.h +++ b/arch/s390/kernel/entry.h @@ -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); diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c index b6110bdf8dc2..5cd38a90e64d 100644 --- a/arch/s390/kernel/process.c +++ b/arch/s390/kernel/process.c @@ -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; diff --git a/arch/s390/kernel/signal.c b/arch/s390/kernel/signal.c index 8e6812a22670..3cf74c3ccb69 100644 --- a/arch/s390/kernel/signal.c +++ b/arch/s390/kernel/signal.c @@ -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 @@ badframe:  	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]; diff --git a/arch/s390/kernel/sys_s390.c b/arch/s390/kernel/sys_s390.c index c34be4568b80..c7ae4b17e0e3 100644 --- a/arch/s390/kernel/sys_s390.c +++ b/arch/s390/kernel/sys_s390.c @@ -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 @@ out:  	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 @@ out:   *   * 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 diff --git a/arch/s390/kernel/syscalls.S b/arch/s390/kernel/syscalls.S index 2d61787949d5..76d16e0140bb 100644 --- a/arch/s390/kernel/syscalls.S +++ b/arch/s390/kernel/syscalls.S @@ -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 */  | 
