git://ftp.safe.ca
/
safe
/
jmp
/
linux-2.6
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'for-linus2' of git://git.kernel.dk/linux-2.6-block
[safe/jmp/linux-2.6]
/
kernel
/
futex_compat.c
diff --git
a/kernel/futex_compat.c
b/kernel/futex_compat.c
index
3254d4e
..
d49afb2
100644
(file)
--- a/
kernel/futex_compat.c
+++ b/
kernel/futex_compat.c
@@
-135,7
+135,7
@@
compat_sys_get_robust_list(int pid, compat_uptr_t __user *head_ptr,
{
struct compat_robust_list_head __user *head;
unsigned long ret;
{
struct compat_robust_list_head __user *head;
unsigned long ret;
-
uid_t euid = current_euid()
;
+
const struct cred *cred = current_cred(), *pcred
;
if (!futex_cmpxchg_enabled)
return -ENOSYS;
if (!futex_cmpxchg_enabled)
return -ENOSYS;
@@
-146,16
+146,18
@@
compat_sys_get_robust_list(int pid, compat_uptr_t __user *head_ptr,
struct task_struct *p;
ret = -ESRCH;
struct task_struct *p;
ret = -ESRCH;
- r
ead_lock(&tasklist_lock
);
+ r
cu_read_lock(
);
p = find_task_by_vpid(pid);
if (!p)
goto err_unlock;
ret = -EPERM;
p = find_task_by_vpid(pid);
if (!p)
goto err_unlock;
ret = -EPERM;
- if (euid != p->euid && euid != p->uid &&
- !capable(CAP_SYS_PTRACE))
+ 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;
goto err_unlock;
head = p->compat_robust_list;
- r
ead_unlock(&tasklist_lock
);
+ r
cu_read_unlock(
);
}
if (put_user(sizeof(*head), len_ptr))
}
if (put_user(sizeof(*head), len_ptr))
@@
-163,7
+165,7
@@
compat_sys_get_robust_list(int pid, compat_uptr_t __user *head_ptr,
return put_user(ptr_to_compat(head), head_ptr);
err_unlock:
return put_user(ptr_to_compat(head), head_ptr);
err_unlock:
- r
ead_unlock(&tasklist_lock
);
+ r
cu_read_unlock(
);
return ret;
}
return ret;
}
@@
-178,7
+180,8
@@
asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, u32 val,
int cmd = op & FUTEX_CMD_MASK;
if (utime && (cmd == FUTEX_WAIT || cmd == FUTEX_LOCK_PI ||
int cmd = op & FUTEX_CMD_MASK;
if (utime && (cmd == FUTEX_WAIT || cmd == FUTEX_LOCK_PI ||
- cmd == FUTEX_WAIT_BITSET)) {
+ cmd == FUTEX_WAIT_BITSET ||
+ cmd == FUTEX_WAIT_REQUEUE_PI)) {
if (get_compat_timespec(&ts, utime))
return -EFAULT;
if (!timespec_valid(&ts))
if (get_compat_timespec(&ts, utime))
return -EFAULT;
if (!timespec_valid(&ts))
@@
-189,7
+192,8
@@
asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, u32 val,
t = ktime_add_safe(ktime_get(), t);
tp = &t;
}
t = ktime_add_safe(ktime_get(), t);
tp = &t;
}
- if (cmd == FUTEX_REQUEUE || cmd == FUTEX_CMP_REQUEUE)
+ if (cmd == FUTEX_REQUEUE || cmd == FUTEX_CMP_REQUEUE ||
+ cmd == FUTEX_CMP_REQUEUE_PI || cmd == FUTEX_WAKE_OP)
val2 = (int) (unsigned long) utime;
return do_futex(uaddr, op, val, tp, uaddr2, val2, val3);
val2 = (int) (unsigned long) utime;
return do_futex(uaddr, op, val, tp, uaddr2, val2, val3);