diff options
Diffstat (limited to 'kernel/futex.c')
-rw-r--r-- | kernel/futex.c | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/kernel/futex.c b/kernel/futex.c index 054105854e0e..be3bff2315ff 100644 --- a/kernel/futex.c +++ b/kernel/futex.c | |||
@@ -481,13 +481,18 @@ static void drop_futex_key_refs(union futex_key *key) | |||
481 | } | 481 | } |
482 | } | 482 | } |
483 | 483 | ||
484 | enum futex_access { | ||
485 | FUTEX_READ, | ||
486 | FUTEX_WRITE | ||
487 | }; | ||
488 | |||
484 | /** | 489 | /** |
485 | * get_futex_key() - Get parameters which are the keys for a futex | 490 | * get_futex_key() - Get parameters which are the keys for a futex |
486 | * @uaddr: virtual address of the futex | 491 | * @uaddr: virtual address of the futex |
487 | * @fshared: 0 for a PROCESS_PRIVATE futex, 1 for PROCESS_SHARED | 492 | * @fshared: 0 for a PROCESS_PRIVATE futex, 1 for PROCESS_SHARED |
488 | * @key: address where result is stored. | 493 | * @key: address where result is stored. |
489 | * @rw: mapping needs to be read/write (values: VERIFY_READ, | 494 | * @rw: mapping needs to be read/write (values: FUTEX_READ, |
490 | * VERIFY_WRITE) | 495 | * FUTEX_WRITE) |
491 | * | 496 | * |
492 | * Return: a negative error code or 0 | 497 | * Return: a negative error code or 0 |
493 | * | 498 | * |
@@ -500,7 +505,7 @@ static void drop_futex_key_refs(union futex_key *key) | |||
500 | * lock_page() might sleep, the caller should not hold a spinlock. | 505 | * lock_page() might sleep, the caller should not hold a spinlock. |
501 | */ | 506 | */ |
502 | static int | 507 | static int |
503 | get_futex_key(u32 __user *uaddr, int fshared, union futex_key *key, int rw) | 508 | get_futex_key(u32 __user *uaddr, int fshared, union futex_key *key, enum futex_access rw) |
504 | { | 509 | { |
505 | unsigned long address = (unsigned long)uaddr; | 510 | unsigned long address = (unsigned long)uaddr; |
506 | struct mm_struct *mm = current->mm; | 511 | struct mm_struct *mm = current->mm; |
@@ -516,7 +521,7 @@ get_futex_key(u32 __user *uaddr, int fshared, union futex_key *key, int rw) | |||
516 | return -EINVAL; | 521 | return -EINVAL; |
517 | address -= key->both.offset; | 522 | address -= key->both.offset; |
518 | 523 | ||
519 | if (unlikely(!access_ok(rw, uaddr, sizeof(u32)))) | 524 | if (unlikely(!access_ok(uaddr, sizeof(u32)))) |
520 | return -EFAULT; | 525 | return -EFAULT; |
521 | 526 | ||
522 | if (unlikely(should_fail_futex(fshared))) | 527 | if (unlikely(should_fail_futex(fshared))) |
@@ -546,7 +551,7 @@ again: | |||
546 | * If write access is not required (eg. FUTEX_WAIT), try | 551 | * If write access is not required (eg. FUTEX_WAIT), try |
547 | * and get read-only access. | 552 | * and get read-only access. |
548 | */ | 553 | */ |
549 | if (err == -EFAULT && rw == VERIFY_READ) { | 554 | if (err == -EFAULT && rw == FUTEX_READ) { |
550 | err = get_user_pages_fast(address, 1, 0, &page); | 555 | err = get_user_pages_fast(address, 1, 0, &page); |
551 | ro = 1; | 556 | ro = 1; |
552 | } | 557 | } |
@@ -1583,7 +1588,7 @@ futex_wake(u32 __user *uaddr, unsigned int flags, int nr_wake, u32 bitset) | |||
1583 | if (!bitset) | 1588 | if (!bitset) |
1584 | return -EINVAL; | 1589 | return -EINVAL; |
1585 | 1590 | ||
1586 | ret = get_futex_key(uaddr, flags & FLAGS_SHARED, &key, VERIFY_READ); | 1591 | ret = get_futex_key(uaddr, flags & FLAGS_SHARED, &key, FUTEX_READ); |
1587 | if (unlikely(ret != 0)) | 1592 | if (unlikely(ret != 0)) |
1588 | goto out; | 1593 | goto out; |
1589 | 1594 | ||
@@ -1642,7 +1647,7 @@ static int futex_atomic_op_inuser(unsigned int encoded_op, u32 __user *uaddr) | |||
1642 | oparg = 1 << oparg; | 1647 | oparg = 1 << oparg; |
1643 | } | 1648 | } |
1644 | 1649 | ||
1645 | if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32))) | 1650 | if (!access_ok(uaddr, sizeof(u32))) |
1646 | return -EFAULT; | 1651 | return -EFAULT; |
1647 | 1652 | ||
1648 | ret = arch_futex_atomic_op_inuser(op, oparg, &oldval, uaddr); | 1653 | ret = arch_futex_atomic_op_inuser(op, oparg, &oldval, uaddr); |
@@ -1682,10 +1687,10 @@ futex_wake_op(u32 __user *uaddr1, unsigned int flags, u32 __user *uaddr2, | |||
1682 | DEFINE_WAKE_Q(wake_q); | 1687 | DEFINE_WAKE_Q(wake_q); |
1683 | 1688 | ||
1684 | retry: | 1689 | retry: |
1685 | ret = get_futex_key(uaddr1, flags & FLAGS_SHARED, &key1, VERIFY_READ); | 1690 | ret = get_futex_key(uaddr1, flags & FLAGS_SHARED, &key1, FUTEX_READ); |
1686 | if (unlikely(ret != 0)) | 1691 | if (unlikely(ret != 0)) |
1687 | goto out; | 1692 | goto out; |
1688 | ret = get_futex_key(uaddr2, flags & FLAGS_SHARED, &key2, VERIFY_WRITE); | 1693 | ret = get_futex_key(uaddr2, flags & FLAGS_SHARED, &key2, FUTEX_WRITE); |
1689 | if (unlikely(ret != 0)) | 1694 | if (unlikely(ret != 0)) |
1690 | goto out_put_key1; | 1695 | goto out_put_key1; |
1691 | 1696 | ||
@@ -1961,11 +1966,11 @@ static int futex_requeue(u32 __user *uaddr1, unsigned int flags, | |||
1961 | } | 1966 | } |
1962 | 1967 | ||
1963 | retry: | 1968 | retry: |
1964 | ret = get_futex_key(uaddr1, flags & FLAGS_SHARED, &key1, VERIFY_READ); | 1969 | ret = get_futex_key(uaddr1, flags & FLAGS_SHARED, &key1, FUTEX_READ); |
1965 | if (unlikely(ret != 0)) | 1970 | if (unlikely(ret != 0)) |
1966 | goto out; | 1971 | goto out; |
1967 | ret = get_futex_key(uaddr2, flags & FLAGS_SHARED, &key2, | 1972 | ret = get_futex_key(uaddr2, flags & FLAGS_SHARED, &key2, |
1968 | requeue_pi ? VERIFY_WRITE : VERIFY_READ); | 1973 | requeue_pi ? FUTEX_WRITE : FUTEX_READ); |
1969 | if (unlikely(ret != 0)) | 1974 | if (unlikely(ret != 0)) |
1970 | goto out_put_key1; | 1975 | goto out_put_key1; |
1971 | 1976 | ||
@@ -2634,7 +2639,7 @@ static int futex_wait_setup(u32 __user *uaddr, u32 val, unsigned int flags, | |||
2634 | * while the syscall executes. | 2639 | * while the syscall executes. |
2635 | */ | 2640 | */ |
2636 | retry: | 2641 | retry: |
2637 | ret = get_futex_key(uaddr, flags & FLAGS_SHARED, &q->key, VERIFY_READ); | 2642 | ret = get_futex_key(uaddr, flags & FLAGS_SHARED, &q->key, FUTEX_READ); |
2638 | if (unlikely(ret != 0)) | 2643 | if (unlikely(ret != 0)) |
2639 | return ret; | 2644 | return ret; |
2640 | 2645 | ||
@@ -2793,7 +2798,7 @@ static int futex_lock_pi(u32 __user *uaddr, unsigned int flags, | |||
2793 | } | 2798 | } |
2794 | 2799 | ||
2795 | retry: | 2800 | retry: |
2796 | ret = get_futex_key(uaddr, flags & FLAGS_SHARED, &q.key, VERIFY_WRITE); | 2801 | ret = get_futex_key(uaddr, flags & FLAGS_SHARED, &q.key, FUTEX_WRITE); |
2797 | if (unlikely(ret != 0)) | 2802 | if (unlikely(ret != 0)) |
2798 | goto out; | 2803 | goto out; |
2799 | 2804 | ||
@@ -2972,7 +2977,7 @@ retry: | |||
2972 | if ((uval & FUTEX_TID_MASK) != vpid) | 2977 | if ((uval & FUTEX_TID_MASK) != vpid) |
2973 | return -EPERM; | 2978 | return -EPERM; |
2974 | 2979 | ||
2975 | ret = get_futex_key(uaddr, flags & FLAGS_SHARED, &key, VERIFY_WRITE); | 2980 | ret = get_futex_key(uaddr, flags & FLAGS_SHARED, &key, FUTEX_WRITE); |
2976 | if (ret) | 2981 | if (ret) |
2977 | return ret; | 2982 | return ret; |
2978 | 2983 | ||
@@ -3199,7 +3204,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, | |||
3199 | */ | 3204 | */ |
3200 | rt_mutex_init_waiter(&rt_waiter); | 3205 | rt_mutex_init_waiter(&rt_waiter); |
3201 | 3206 | ||
3202 | ret = get_futex_key(uaddr2, flags & FLAGS_SHARED, &key2, VERIFY_WRITE); | 3207 | ret = get_futex_key(uaddr2, flags & FLAGS_SHARED, &key2, FUTEX_WRITE); |
3203 | if (unlikely(ret != 0)) | 3208 | if (unlikely(ret != 0)) |
3204 | goto out; | 3209 | goto out; |
3205 | 3210 | ||