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
fbdev: bf54x-lq043fb: fix unused warnings with backlight code
[safe/jmp/linux-2.6]
/
kernel
/
futex_compat.c
diff --git
a/kernel/futex_compat.c
b/kernel/futex_compat.c
index
0a43def
..
d49afb2
100644
(file)
--- a/
kernel/futex_compat.c
+++ b/
kernel/futex_compat.c
@@
-30,7
+30,7
@@
fetch_robust_entry(compat_uptr_t *uentry, struct robust_list __user **entry,
return 0;
}
return 0;
}
-static void __user *futex_uaddr(struct robust_list *entry,
+static void __user *futex_uaddr(struct robust_list
__user
*entry,
compat_long_t futex_offset)
{
compat_uptr_t base = ptr_to_compat(entry);
compat_long_t futex_offset)
{
compat_uptr_t base = ptr_to_compat(entry);
@@
-54,6
+54,9
@@
void compat_exit_robust_list(struct task_struct *curr)
compat_long_t futex_offset;
int rc;
compat_long_t futex_offset;
int rc;
+ if (!futex_cmpxchg_enabled)
+ return;
+
/*
* Fetch the list head (which was registered earlier, via
* sys_set_robust_list()):
/*
* Fetch the list head (which was registered earlier, via
* sys_set_robust_list()):
@@
-115,6
+118,9
@@
asmlinkage long
compat_sys_set_robust_list(struct compat_robust_list_head __user *head,
compat_size_t len)
{
compat_sys_set_robust_list(struct compat_robust_list_head __user *head,
compat_size_t len)
{
+ if (!futex_cmpxchg_enabled)
+ return -ENOSYS;
+
if (unlikely(len != sizeof(*head)))
return -EINVAL;
if (unlikely(len != sizeof(*head)))
return -EINVAL;
@@
-129,6
+135,10
@@
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;
+ const struct cred *cred = current_cred(), *pcred;
+
+ if (!futex_cmpxchg_enabled)
+ return -ENOSYS;
if (!pid)
head = current->compat_robust_list;
if (!pid)
head = current->compat_robust_list;
@@
-136,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 ((current->euid != p->euid) && (current->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))
@@
-153,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;
}
@@
-167,7
+179,9
@@
asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, u32 val,
int val2 = 0;
int cmd = op & FUTEX_CMD_MASK;
int val2 = 0;
int cmd = op & FUTEX_CMD_MASK;
- if (utime && (cmd == FUTEX_WAIT || cmd == FUTEX_LOCK_PI)) {
+ if (utime && (cmd == FUTEX_WAIT || cmd == FUTEX_LOCK_PI ||
+ 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))
@@
-175,10
+189,11
@@
asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, u32 val,
t = timespec_to_ktime(ts);
if (cmd == FUTEX_WAIT)
t = timespec_to_ktime(ts);
if (cmd == FUTEX_WAIT)
- t = ktime_add(ktime_get(), t);
+ t = ktime_add
_safe
(ktime_get(), t);
tp = &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);