It's rather unsporting of the kernel to give us a pointer to unaligned memory.
This fixes one crash, the next crash occurs in the soft float emulation.
LGTM=minux, rsc, austin
R=minux, rsc, austin
CC=golang-codereviews
https://golang.org/cl/
177730043
for i := 0; auxv[i] != _AT_NULL; i += 2 {
switch auxv[i] {
- case _AT_RANDOM: // kernel provided 16-byte worth of random data
+ case _AT_RANDOM: // kernel provides a pointer to 16-bytes worth of random data
if auxv[i+1] != 0 {
- randomNumber = *(*uint32)(unsafe.Pointer(uintptr(auxv[i+1])))
+ // the pointer provided may not be word alined, so we must to treat it
+ // as a byte array.
+ rnd := (*[16]byte)(unsafe.Pointer(uintptr(auxv[i+1])))
+ randomNumber = uint32(rnd[0]) | uint32(rnd[1])<<8 | uint32(rnd[2])<<16 | uint32(rnd[3])<<24
}
case _AT_PLATFORM: // v5l, v6l, v7l