diff options
author | Aurelien Jarno <aurelien@aurel32.net> | 2017-05-02 13:00:12 +0000 |
---|---|---|
committer | Rich Felker <dalias@libc.org> | 2018-04-12 19:47:50 -0400 |
commit | 9b7e30ab975334448dc4c82941a48a3685a7642b (patch) | |
tree | 9f200fb4ccd0436507a3abed99141828ff9f5c97 /arch/sh/include/asm | |
parent | 0adb32858b0bddf4ada5f364a84ed60b196dbcda (diff) | |
download | linux-9b7e30ab975334448dc4c82941a48a3685a7642b.tar.gz linux-9b7e30ab975334448dc4c82941a48a3685a7642b.tar.bz2 linux-9b7e30ab975334448dc4c82941a48a3685a7642b.zip |
sh: fix futex FUTEX_OP_SET op on userspace addresses
Commit 00b73d8d1b71 ("sh: add working futex atomic ops on userspace
addresses for smp") changed the futex_atomic_op_inuser function to
use a loop. In case of the FUTEX_OP_SET op with a userspace address
containing a value different of 0, this loop is an endless loop.
Fix that by loading the value of oldval from the userspace before doing
the cmpxchg op, also for the FUTEX_OP_SET case.
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
Signed-off-by: Rich Felker <dalias@libc.org>
Diffstat (limited to 'arch/sh/include/asm')
-rw-r--r-- | arch/sh/include/asm/futex.h | 5 |
1 files changed, 1 insertions, 4 deletions
diff --git a/arch/sh/include/asm/futex.h b/arch/sh/include/asm/futex.h index 15bf07bfa96b..6d192f4908a7 100644 --- a/arch/sh/include/asm/futex.h +++ b/arch/sh/include/asm/futex.h @@ -37,10 +37,7 @@ static inline int arch_futex_atomic_op_inuser(int op, u32 oparg, int *oval, pagefault_disable(); do { - if (op == FUTEX_OP_SET) - ret = oldval = 0; - else - ret = get_user(oldval, uaddr); + ret = get_user(oldval, uaddr); if (ret) break; |