Skip to content

Commit b285bb7

Browse files
author
Francesco Lavra
committed
FUTEX_WAKE_OP: use atomic read-modify-write memory access
In a FUTEX_WAKE_OP futex operation, the kernel modifies the memory pointed to by the 'uaddr2' argument; according to the Linux ABI, this modification must be done using atomic machine instructions.
1 parent 732802d commit b285bb7

File tree

1 file changed

+5
-6
lines changed

1 file changed

+5
-6
lines changed

src/unix/futex.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -252,14 +252,13 @@ sysreturn futex(int *uaddr, int futex_op, int val,
252252
ret = -EFAULT;
253253
goto wake_op_done;
254254
}
255-
oldval = *(int *) uaddr2;
256255

257256
switch (op) {
258-
case FUTEX_OP_SET: *uaddr2 = oparg; break;
259-
case FUTEX_OP_ADD: *uaddr2 += oparg; break;
260-
case FUTEX_OP_OR: *uaddr2 |= oparg; break;
261-
case FUTEX_OP_ANDN: *uaddr2 &= ~oparg; break;
262-
case FUTEX_OP_XOR: *uaddr2 ^= oparg; break;
257+
case FUTEX_OP_SET: oldval = __atomic_exchange_n(uaddr2, oparg, __ATOMIC_RELAXED); break;
258+
case FUTEX_OP_ADD: oldval = __atomic_fetch_add(uaddr2, oparg, __ATOMIC_RELAXED); break;
259+
case FUTEX_OP_OR: oldval = __atomic_fetch_or(uaddr2, oparg, __ATOMIC_RELAXED); break;
260+
case FUTEX_OP_ANDN: oldval = __atomic_fetch_and(uaddr2, ~oparg, __ATOMIC_RELAXED); break;
261+
case FUTEX_OP_XOR: oldval = __atomic_fetch_xor(uaddr2, oparg, __ATOMIC_RELAXED); break;
263262
default: ret = -ENOSYS; break;
264263
}
265264
context_clear_err(ctx);

0 commit comments

Comments
 (0)