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:
parent
286d9c22cd
commit
f86e8a66d8
1 changed files with 7 additions and 11 deletions
|
@ -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__ */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue