diff options
Diffstat (limited to 'ipc/compat.c')
| -rw-r--r-- | ipc/compat.c | 60 | 
1 files changed, 26 insertions, 34 deletions
diff --git a/ipc/compat.c b/ipc/compat.c index 892f6585dd6..b5ef4f7946d 100644 --- a/ipc/compat.c +++ b/ipc/compat.c @@ -30,7 +30,7 @@  #include <linux/ptrace.h>  #include <linux/mutex.h> -#include <asm/uaccess.h> +#include <linux/uaccess.h>  #include "util.h" @@ -113,9 +113,6 @@ struct compat_shm_info {  	compat_ulong_t swap_attempts, swap_successes;  }; -extern int sem_ctls[]; -#define sc_semopm	(sem_ctls[2]) -  static inline int compat_ipc_parse_version(int *cmd)  {  #ifdef	CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION @@ -197,7 +194,7 @@ static inline int __put_compat_ipc_perm(struct ipc64_perm *p,  static inline int get_compat_semid64_ds(struct semid64_ds *s64,  					struct compat_semid64_ds __user *up64)  { -	if (!access_ok (VERIFY_READ, up64, sizeof(*up64))) +	if (!access_ok(VERIFY_READ, up64, sizeof(*up64)))  		return -EFAULT;  	return __get_compat_ipc64_perm(&s64->sem_perm, &up64->sem_perm);  } @@ -205,7 +202,7 @@ static inline int get_compat_semid64_ds(struct semid64_ds *s64,  static inline int get_compat_semid_ds(struct semid64_ds *s,  				      struct compat_semid_ds __user *up)  { -	if (!access_ok (VERIFY_READ, up, sizeof(*up))) +	if (!access_ok(VERIFY_READ, up, sizeof(*up)))  		return -EFAULT;  	return __get_compat_ipc_perm(&s->sem_perm, &up->sem_perm);  } @@ -215,7 +212,7 @@ static inline int put_compat_semid64_ds(struct semid64_ds *s64,  {  	int err; -	if (!access_ok (VERIFY_WRITE, up64, sizeof(*up64))) +	if (!access_ok(VERIFY_WRITE, up64, sizeof(*up64)))  		return -EFAULT;  	err  = __put_compat_ipc64_perm(&s64->sem_perm, &up64->sem_perm);  	err |= __put_user(s64->sem_otime, &up64->sem_otime); @@ -229,7 +226,7 @@ static inline int put_compat_semid_ds(struct semid64_ds *s,  {  	int err; -	if (!access_ok (VERIFY_WRITE, up, sizeof(*up))) +	if (!access_ok(VERIFY_WRITE, up, sizeof(*up)))  		return -EFAULT;  	err  = __put_compat_ipc_perm(&s->sem_perm, &up->sem_perm);  	err |= __put_user(s->sem_otime, &up->sem_otime); @@ -288,11 +285,11 @@ static long do_compat_semctl(int first, int second, int third, u32 pad)  		break;  	case IPC_SET: -		if (version == IPC_64) { +		if (version == IPC_64)  			err = get_compat_semid64_ds(&s64, compat_ptr(pad)); -		} else { +		else  			err = get_compat_semid_ds(&s64, compat_ptr(pad)); -		} +  		up64 = compat_alloc_user_space(sizeof(s64));  		if (copy_to_user(up64, &s64, sizeof(s64)))  			err = -EFAULT; @@ -376,12 +373,12 @@ COMPAT_SYSCALL_DEFINE6(ipc, u32, call, int, first, int, second,  			struct compat_ipc_kludge ipck;  			if (!uptr)  				return -EINVAL; -			if (copy_from_user (&ipck, uptr, sizeof(ipck))) +			if (copy_from_user(&ipck, uptr, sizeof(ipck)))  				return -EFAULT;  			uptr = compat_ptr(ipck.msgp);  			fifth = ipck.msgtyp;  		} -		return do_msgrcv(first, uptr, second, fifth, third, +		return do_msgrcv(first, uptr, second, (s32)fifth, third,  				 compat_do_msg_fill);  	}  	case MSGGET: @@ -430,9 +427,9 @@ COMPAT_SYSCALL_DEFINE4(msgsnd, int, msqid, compat_uptr_t, msgp,  }  COMPAT_SYSCALL_DEFINE5(msgrcv, int, msqid, compat_uptr_t, msgp, -		       compat_ssize_t, msgsz, long, msgtyp, int, msgflg) +		       compat_ssize_t, msgsz, compat_long_t, msgtyp, int, msgflg)  { -	return do_msgrcv(msqid, compat_ptr(msgp), (ssize_t)msgsz, msgtyp, +	return do_msgrcv(msqid, compat_ptr(msgp), (ssize_t)msgsz, (long)msgtyp,  			 msgflg, compat_do_msg_fill);  } @@ -498,7 +495,7 @@ static inline int put_compat_msqid_ds(struct msqid64_ds *m,  	return err;  } -long compat_sys_msgctl(int first, int second, void __user *uptr) +COMPAT_SYSCALL_DEFINE3(msgctl, int, first, int, second, void __user *, uptr)  {  	int err, err2;  	struct msqid64_ds m64; @@ -515,11 +512,11 @@ long compat_sys_msgctl(int first, int second, void __user *uptr)  		break;  	case IPC_SET: -		if (version == IPC_64) { +		if (version == IPC_64)  			err = get_compat_msqid64(&m64, uptr); -		} else { +		else  			err = get_compat_msqid(&m64, uptr); -		} +  		if (err)  			break;  		p = compat_alloc_user_space(sizeof(m64)); @@ -668,7 +665,7 @@ static inline int put_compat_shm_info(struct shm_info __user *ip,  	return err;  } -long compat_sys_shmctl(int first, int second, void __user *uptr) +COMPAT_SYSCALL_DEFINE3(shmctl, int, first, int, second, void __user *, uptr)  {  	void __user *p;  	struct shmid64_ds s64; @@ -702,11 +699,11 @@ long compat_sys_shmctl(int first, int second, void __user *uptr)  	case IPC_SET: -		if (version == IPC_64) { +		if (version == IPC_64)  			err = get_compat_shmid64_ds(&s64, uptr); -		} else { +		else  			err = get_compat_shmid_ds(&s64, uptr); -		} +  		if (err)  			break;  		p = compat_alloc_user_space(sizeof(s64)); @@ -749,17 +746,12 @@ long compat_sys_shmctl(int first, int second, void __user *uptr)  	return err;  } -long compat_sys_semtimedop(int semid, struct sembuf __user *tsems, -		unsigned nsops, const struct compat_timespec __user *timeout) +COMPAT_SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsems, +		       unsigned, nsops, +		       const struct compat_timespec __user *, timeout)  { -	struct timespec __user *ts64 = NULL; -	if (timeout) { -		struct timespec ts; -		ts64 = compat_alloc_user_space(sizeof(*ts64)); -		if (get_compat_timespec(&ts, timeout)) -			return -EFAULT; -		if (copy_to_user(ts64, &ts, sizeof(ts))) -			return -EFAULT; -	} +	struct timespec __user *ts64; +	if (compat_convert_timespec(&ts64, timeout)) +		return -EFAULT;  	return sys_semtimedop(semid, tsems, nsops, ts64);  }  | 
