On 04/24/2018 12:21 PM, Philippe Mathieu-Daudé wrote: > The libfdt does not guarantee than fdt_getprop() returns a pointer > aligned to the property size. > > Assuming the base of the fdt is aligned, a 32-bit property returns > a 32-bit aligned pointer. This is however not guaranteed for 64-bit > properties, where 64-bit loads might trigger unaligned access. > > Fix the 64-bit access using the ldst (host) API, which uses a local > copy on the stack, thus guaranteeing a safe aligned access. > > This fixes the following ASan warning: > > $ qemu-system-mips64el -M boston -kernel vmlinux.gz.itb -nographic > hw/core/loader-fit.c:108:17: runtime error: load of misaligned address > 0x7f95cd7e4264 for type 'fdt64_t', which requires 8 byte alignment > 0x7f95cd7e4264: note: pointer points here > 00 00 00 3e ff ff ff ff 80 7d 2a c0 00 00 00 01 68 61 73 68 40 30 00 00 > 00 00 00 03 00 00 00 14 > ^ > > Reported-by: AddressSanitizer > Suggested-by: Peter Maydell <[email protected]> > Signed-off-by: Philippe Mathieu-Daudé <[email protected]> > --- > v4: do not change the 32-bit access, use ldq_he_p() for the 64-bit access > v3: do not use memcpy(), incorrectly change ldl_he_p() > v2: do not change the 32-bit access, use memcpy(), add comments (David Gibson) > v1: use memcpy()
Reviewed-by: Richard Henderson <[email protected]> r~
