random: rand32_timer: Avoid alignment faults by using memcpy

The previous implementation assumed that the dst pointer was always
aligned to a 4-byte boundary in platforms that require alignment for
storage of 32-bit integers. Since this is required for certain platforms
(eg. Arm Cortex-M0), use memcpy() instead, which always takes
alignment into account.

Fixes #33969.

Signed-off-by: Carles Cufi <carles.cufi@nordicsemi.no>
This commit is contained in:
Carles Cufi 2021-04-09 17:52:14 +02:00 committed by Anas Nashif
commit f86e8a66d8

View file

@ -62,20 +62,16 @@ uint32_t z_impl_sys_rand32_get(void)
void z_impl_sys_rand_get(void *dst, size_t outlen) void z_impl_sys_rand_get(void *dst, size_t outlen)
{ {
uint32_t len = 0; uint8_t *udst = dst;
uint32_t blocksize = 4; uint32_t blocksize;
uint32_t ret; uint32_t ret;
uint32_t *udst = (uint32_t *)dst;
while (len < outlen) { while (outlen) {
ret = sys_rand32_get(); ret = sys_rand32_get();
if ((outlen-len) < sizeof(ret)) { blocksize = MIN(outlen, sizeof(ret));
blocksize = len; (void)memcpy((void *)udst, &ret, blocksize);
(void)memcpy(udst, &ret, blocksize); udst += blocksize;
} else { outlen -= blocksize;
(*udst++) = ret;
}
len += blocksize;
} }
} }
#endif /* __GNUC__ */ #endif /* __GNUC__ */