diff options
Diffstat (limited to 'kernel/futex_compat.c')
| -rw-r--r-- | kernel/futex_compat.c | 51 | 
1 files changed, 26 insertions, 25 deletions
diff --git a/kernel/futex_compat.c b/kernel/futex_compat.c index 06da4dfc339..55c8c9349cf 100644 --- a/kernel/futex_compat.c +++ b/kernel/futex_compat.c @@ -10,6 +10,8 @@  #include <linux/compat.h>  #include <linux/nsproxy.h>  #include <linux/futex.h> +#include <linux/ptrace.h> +#include <linux/syscalls.h>  #include <asm/uaccess.h> @@ -49,7 +51,8 @@ void compat_exit_robust_list(struct task_struct *curr)  {  	struct compat_robust_list_head __user *head = curr->compat_robust_list;  	struct robust_list __user *entry, *next_entry, *pending; -	unsigned int limit = ROBUST_LIST_LIMIT, pi, next_pi, pip; +	unsigned int limit = ROBUST_LIST_LIMIT, pi, pip; +	unsigned int uninitialized_var(next_pi);  	compat_uptr_t uentry, next_uentry, upending;  	compat_long_t futex_offset;  	int rc; @@ -114,9 +117,9 @@ void compat_exit_robust_list(struct task_struct *curr)  	}  } -asmlinkage long -compat_sys_set_robust_list(struct compat_robust_list_head __user *head, -			   compat_size_t len) +COMPAT_SYSCALL_DEFINE2(set_robust_list, +		struct compat_robust_list_head __user *, head, +		compat_size_t, len)  {  	if (!futex_cmpxchg_enabled)  		return -ENOSYS; @@ -129,37 +132,35 @@ compat_sys_set_robust_list(struct compat_robust_list_head __user *head,  	return 0;  } -asmlinkage long -compat_sys_get_robust_list(int pid, compat_uptr_t __user *head_ptr, -			   compat_size_t __user *len_ptr) +COMPAT_SYSCALL_DEFINE3(get_robust_list, int, pid, +			compat_uptr_t __user *, head_ptr, +			compat_size_t __user *, len_ptr)  {  	struct compat_robust_list_head __user *head;  	unsigned long ret; -	const struct cred *cred = current_cred(), *pcred; +	struct task_struct *p;  	if (!futex_cmpxchg_enabled)  		return -ENOSYS; +	rcu_read_lock(); + +	ret = -ESRCH;  	if (!pid) -		head = current->compat_robust_list; +		p = current;  	else { -		struct task_struct *p; - -		ret = -ESRCH; -		rcu_read_lock();  		p = find_task_by_vpid(pid);  		if (!p)  			goto err_unlock; -		ret = -EPERM; -		pcred = __task_cred(p); -		if (cred->euid != pcred->euid && -		    cred->euid != pcred->uid && -		    !capable(CAP_SYS_PTRACE)) -			goto err_unlock; -		head = p->compat_robust_list; -		rcu_read_unlock();  	} +	ret = -EPERM; +	if (!ptrace_may_access(p, PTRACE_MODE_READ)) +		goto err_unlock; + +	head = p->compat_robust_list; +	rcu_read_unlock(); +  	if (put_user(sizeof(*head), len_ptr))  		return -EFAULT;  	return put_user(ptr_to_compat(head), head_ptr); @@ -170,9 +171,9 @@ err_unlock:  	return ret;  } -asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, u32 val, -		struct compat_timespec __user *utime, u32 __user *uaddr2, -		u32 val3) +COMPAT_SYSCALL_DEFINE6(futex, u32 __user *, uaddr, int, op, u32, val, +		struct compat_timespec __user *, utime, u32 __user *, uaddr2, +		u32, val3)  {  	struct timespec ts;  	ktime_t t, *tp = NULL; @@ -182,7 +183,7 @@ asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, u32 val,  	if (utime && (cmd == FUTEX_WAIT || cmd == FUTEX_LOCK_PI ||  		      cmd == FUTEX_WAIT_BITSET ||  		      cmd == FUTEX_WAIT_REQUEUE_PI)) { -		if (get_compat_timespec(&ts, utime)) +		if (compat_get_timespec(&ts, utime))  			return -EFAULT;  		if (!timespec_valid(&ts))  			return -EINVAL;  | 
