The iterator key buffer is a flexible array member placed directly
after a bool, leaving it without natural alignment for the u32/u64
loads in next_int. Copy the key via memcpy instead of dereferencing
a misaligned pointer, which traps on strict-alignment targets.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
if (!iter->has_next)
return NULL;
- if (iter->key_size == 4)
- intval = *(uint32_t *)iter->key;
- else if (iter->key_size == 8)
- intval = *(uint64_t *)iter->key;
- else
+ if (iter->key_size == 4) {
+ uint32_t val32;
+
+ memcpy(&val32, iter->key, sizeof(val32));
+ intval = val32;
+ } else if (iter->key_size == 8) {
+ memcpy(&intval, iter->key, sizeof(intval));
+ } else {
return NULL;
+ }
rv = ucv_int64_new(intval);
iter->has_next = !bpf_map_get_next_key(iter->fd, &iter->key, &iter->key);