diff options
Diffstat (limited to 'kernel/futex.c')
| -rw-r--r-- | kernel/futex.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/kernel/futex.c b/kernel/futex.c index c3a1a55a5214..f6ff0191ecf7 100644 --- a/kernel/futex.c +++ b/kernel/futex.c | |||
| @@ -66,7 +66,7 @@ | |||
| 66 | 66 | ||
| 67 | #include <asm/futex.h> | 67 | #include <asm/futex.h> |
| 68 | 68 | ||
| 69 | #include "rtmutex_common.h" | 69 | #include "locking/rtmutex_common.h" |
| 70 | 70 | ||
| 71 | int __read_mostly futex_cmpxchg_enabled; | 71 | int __read_mostly futex_cmpxchg_enabled; |
| 72 | 72 | ||
| @@ -251,6 +251,9 @@ get_futex_key(u32 __user *uaddr, int fshared, union futex_key *key, int rw) | |||
| 251 | return -EINVAL; | 251 | return -EINVAL; |
| 252 | address -= key->both.offset; | 252 | address -= key->both.offset; |
| 253 | 253 | ||
| 254 | if (unlikely(!access_ok(rw, uaddr, sizeof(u32)))) | ||
| 255 | return -EFAULT; | ||
| 256 | |||
| 254 | /* | 257 | /* |
| 255 | * PROCESS_PRIVATE futexes are fast. | 258 | * PROCESS_PRIVATE futexes are fast. |
| 256 | * As the mm cannot disappear under us and the 'key' only needs | 259 | * As the mm cannot disappear under us and the 'key' only needs |
| @@ -259,8 +262,6 @@ get_futex_key(u32 __user *uaddr, int fshared, union futex_key *key, int rw) | |||
| 259 | * but access_ok() should be faster than find_vma() | 262 | * but access_ok() should be faster than find_vma() |
| 260 | */ | 263 | */ |
| 261 | if (!fshared) { | 264 | if (!fshared) { |
| 262 | if (unlikely(!access_ok(VERIFY_WRITE, uaddr, sizeof(u32)))) | ||
| 263 | return -EFAULT; | ||
| 264 | key->private.mm = mm; | 265 | key->private.mm = mm; |
| 265 | key->private.address = address; | 266 | key->private.address = address; |
| 266 | get_futex_key_refs(key); | 267 | get_futex_key_refs(key); |
| @@ -288,7 +289,7 @@ again: | |||
| 288 | put_page(page); | 289 | put_page(page); |
| 289 | /* serialize against __split_huge_page_splitting() */ | 290 | /* serialize against __split_huge_page_splitting() */ |
| 290 | local_irq_disable(); | 291 | local_irq_disable(); |
| 291 | if (likely(__get_user_pages_fast(address, 1, 1, &page) == 1)) { | 292 | if (likely(__get_user_pages_fast(address, 1, !ro, &page) == 1)) { |
| 292 | page_head = compound_head(page); | 293 | page_head = compound_head(page); |
| 293 | /* | 294 | /* |
| 294 | * page_head is valid pointer but we must pin | 295 | * page_head is valid pointer but we must pin |
