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)
|
||||
{
|
||||
uint32_t len = 0;
|
||||
uint32_t blocksize = 4;
|
||||
uint8_t *udst = dst;
|
||||
uint32_t blocksize;
|
||||
uint32_t ret;
|
||||
uint32_t *udst = (uint32_t *)dst;
|
||||
|
||||
while (len < outlen) {
|
||||
while (outlen) {
|
||||
ret = sys_rand32_get();
|
||||
if ((outlen-len) < sizeof(ret)) {
|
||||
blocksize = len;
|
||||
(void)memcpy(udst, &ret, blocksize);
|
||||
} else {
|
||||
(*udst++) = ret;
|
||||
}
|
||||
len += blocksize;
|
||||
blocksize = MIN(outlen, sizeof(ret));
|
||||
(void)memcpy((void *)udst, &ret, blocksize);
|
||||
udst += blocksize;
|
||||
outlen -= blocksize;
|
||||
}
|
||||
}
|
||||
#endif /* __GNUC__ */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue