]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - arch/tile/include/asm/futex.h
futex: Remove duplicated code and fix undefined behaviour
[mirror_ubuntu-bionic-kernel.git] / arch / tile / include / asm / futex.h
index e64a1b75fc386c4786d6a4988a4f5eb71bbfbd27..83c1e639b41111049aad89164067d4dd8b587bb5 100644 (file)
        lock = __atomic_hashed_lock((int __force *)uaddr)
 #endif
 
-static inline int futex_atomic_op_inuser(int encoded_op, u32 __user *uaddr)
+static inline int arch_futex_atomic_op_inuser(int op, u32 oparg, int *oval,
+               u32 __user *uaddr)
 {
-       int op = (encoded_op >> 28) & 7;
-       int cmp = (encoded_op >> 24) & 15;
-       int oparg = (encoded_op << 8) >> 20;
-       int cmparg = (encoded_op << 20) >> 20;
        int uninitialized_var(val), ret;
 
        __futex_prolog();
@@ -119,12 +116,6 @@ static inline int futex_atomic_op_inuser(int encoded_op, u32 __user *uaddr)
        /* The 32-bit futex code makes this assumption, so validate it here. */
        BUILD_BUG_ON(sizeof(atomic_t) != sizeof(int));
 
-       if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28))
-               oparg = 1 << oparg;
-
-       if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32)))
-               return -EFAULT;
-
        pagefault_disable();
        switch (op) {
        case FUTEX_OP_SET:
@@ -148,30 +139,9 @@ static inline int futex_atomic_op_inuser(int encoded_op, u32 __user *uaddr)
        }
        pagefault_enable();
 
-       if (!ret) {
-               switch (cmp) {
-               case FUTEX_OP_CMP_EQ:
-                       ret = (val == cmparg);
-                       break;
-               case FUTEX_OP_CMP_NE:
-                       ret = (val != cmparg);
-                       break;
-               case FUTEX_OP_CMP_LT:
-                       ret = (val < cmparg);
-                       break;
-               case FUTEX_OP_CMP_GE:
-                       ret = (val >= cmparg);
-                       break;
-               case FUTEX_OP_CMP_LE:
-                       ret = (val <= cmparg);
-                       break;
-               case FUTEX_OP_CMP_GT:
-                       ret = (val > cmparg);
-                       break;
-               default:
-                       ret = -ENOSYS;
-               }
-       }
+       if (!ret)
+               *oval = val;
+
        return ret;
 }