From 1544c14c57f4e77df2a8dcc27bc7eaaba8bbb833 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Thu, 12 Mar 2020 00:31:18 +0100 Subject: [PATCH] BUG/MEDIUM: random: align the state on 2*64 bits for ARM64 x86_64 and ARM64 do support the double-word atomic CAS. However on ARM it must be done only on aligned data. The random generator makes use of such double-word atomic CAS when available but didn't enforce alignment, which causes ARM64 to crash early in the startup since commit 52bf839 ("BUG/MEDIUM: random: implement a thread-safe and process-safe PRNG"). This commit just unconditionally aligns the arrays. It must be backported to all branches where the commit above is backported (likely till 2.0). --- src/standard.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/standard.c b/src/standard.c index d16eebfea..3afaf5a99 100644 --- a/src/standard.c +++ b/src/standard.c @@ -4530,7 +4530,7 @@ int varint_bytes(uint64_t v) /* Random number generator state, see below */ -static uint64_t ha_random_state[2]; +static uint64_t ha_random_state[2] ALIGNED(2*sizeof(uint64_t)); /* This is a thread-safe implementation of xoroshiro128** described below: * http://prng.di.unimi.it/ @@ -4542,8 +4542,8 @@ static uint64_t ha_random_state[2]; uint64_t ha_random64() { uint64_t result; - uint64_t old[2]; - uint64_t new[2]; + uint64_t old[2] ALIGNED(2*sizeof(uint64_t)); + uint64_t new[2] ALIGNED(2*sizeof(uint64_t)); #if defined(USE_THREAD) && (!defined(HA_CAS_IS_8B) || !defined(HA_HAVE_CAS_DW)) static HA_SPINLOCK_T rand_lock;