]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.cc] runtime: fix bus error accessing auxv random data on arm5
authorDave Cheney <dave@cheney.net>
Fri, 14 Nov 2014 22:57:02 +0000 (09:57 +1100)
committerDave Cheney <dave@cheney.net>
Fri, 14 Nov 2014 22:57:02 +0000 (09:57 +1100)
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

src/runtime/os_linux_arm.go

index 9b0ade614801b74800c2c813e41b2c9881a77db1..d5b37d6ab5b315082503447a32391d52cc56cb4a 100644 (file)
@@ -50,9 +50,12 @@ func setup_auxv(argc int32, argv **byte) {
 
        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