]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: common handling of _AT_RANDOM auxv
authorAustin Clements <austin@google.com>
Thu, 14 Apr 2016 16:32:28 +0000 (12:32 -0400)
committerAustin Clements <austin@google.com>
Sat, 16 Apr 2016 21:42:31 +0000 (21:42 +0000)
The Linux kernel provides 16 bytes of random data via the auxv vector
at startup. Currently we consume this separately on 386, amd64, arm,
and arm64. Now that we have a common auxv parser, handle _AT_RANDOM in
the common path.

Change-Id: Ib69549a1d37e2d07a351cf0f44007bcd24f0d20d
Reviewed-on: https://go-review.googlesource.com/22062
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/runtime/os_linux.go
src/runtime/os_linux_386.go
src/runtime/os_linux_arm.go
src/runtime/os_linux_arm64.go
src/runtime/vdso_linux_amd64.go

index eeb30c7dd93c51728e1be6f938797bfa298af9eb..4645f1c33d741bd418261c4fe23cd0de0a9cadd1 100644 (file)
@@ -177,7 +177,8 @@ var failallocatestack = []byte("runtime: failed to allocate stack for the new OS
 var failthreadcreate = []byte("runtime: failed to create new OS thread\n")
 
 const (
-       _AT_NULL = 0 // End of vector
+       _AT_NULL   = 0  // End of vector
+       _AT_RANDOM = 25 // introduced in 2.6.29
 )
 
 func sysargs(argc int32, argv **byte) {
@@ -195,6 +196,12 @@ func sysargs(argc int32, argv **byte) {
        auxv := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*sys.PtrSize))
        for i := 0; auxv[i] != _AT_NULL; i += 2 {
                tag, val := auxv[i], auxv[i+1]
+               switch tag {
+               case _AT_RANDOM:
+                       // The kernel provides a pointer to 16-bytes
+                       // worth of random data.
+                       startupRandomData = (*[16]byte)(unsafe.Pointer(val))[:]
+               }
                archauxv(tag, val)
        }
 }
index 2383d962b2971c943bf233ecc5b80e810b5ab671..cf031afe45cd492dcf035a473d1c29caea104b64 100644 (file)
@@ -4,16 +4,9 @@
 
 package runtime
 
-import "unsafe"
-
 const (
-       _AT_RANDOM  = 25
        _AT_SYSINFO = 32
 )
 
 func archauxv(tag, val uintptr) {
-       switch tag {
-       case _AT_RANDOM:
-               startupRandomData = (*[16]byte)(unsafe.Pointer(val))[:]
-       }
 }
index a61be916b6ded9a3327d44f6cde32908228ff613..8e2765a4133ec7c189bea28fb17ac734f7089ced 100644 (file)
@@ -9,7 +9,6 @@ import "unsafe"
 const (
        _AT_PLATFORM = 15 //  introduced in at least 2.6.11
        _AT_HWCAP    = 16 // introduced in at least 2.6.11
-       _AT_RANDOM   = 25 // introduced in 2.6.29
 
        _HWCAP_VFP   = 1 << 6  // introduced in at least 2.6.11
        _HWCAP_VFPv3 = 1 << 13 // introduced in 2.6.30
@@ -34,10 +33,10 @@ func checkgoarm() {
 
 func archauxv(tag, val uintptr) {
        switch tag {
-       case _AT_RANDOM: // kernel provides a pointer to 16-bytes worth of random data
-               startupRandomData = (*[16]byte)(unsafe.Pointer(val))[:]
-               // the pointer provided may not be word aligned, so we must treat it
-               // as a byte array.
+       case _AT_RANDOM:
+               // sysargs filled in startupRandomData, but that
+               // pointer may not be word aligned, so we must treat
+               // it as a byte array.
                randomNumber = uint32(startupRandomData[4]) | uint32(startupRandomData[5])<<8 |
                        uint32(startupRandomData[6])<<16 | uint32(startupRandomData[7])<<24
 
index aa9d4d9885b13aa129cc2c2207672c577afe72e5..43262aea1435132d064120fcb72698b21660d961 100644 (file)
@@ -4,20 +4,14 @@
 
 package runtime
 
-import "unsafe"
-
-const (
-       _AT_RANDOM = 25 // introduced in 2.6.29
-)
-
 var randomNumber uint32
 
 func archauxv(tag, val uintptr) {
        switch tag {
-       case _AT_RANDOM: // kernel provides a pointer to 16-bytes worth of random data
-               startupRandomData = (*[16]byte)(unsafe.Pointer(val))[:]
-               // the pointer provided may not be word aligned, so we must treat it
-               // as a byte array.
+       case _AT_RANDOM:
+               // sysargs filled in startupRandomData, but that
+               // pointer may not be word aligned, so we must treat
+               // it as a byte array.
                randomNumber = uint32(startupRandomData[4]) | uint32(startupRandomData[5])<<8 |
                        uint32(startupRandomData[6])<<16 | uint32(startupRandomData[7])<<24
        }
index 1aae9b65703f4fe7756b10e07374da5a8838fb76..8a970dfbe6d631f2101af112b2b473cd9213f593 100644 (file)
@@ -18,7 +18,6 @@ import "unsafe"
 // http://refspecs.linuxfoundation.org/LSB_3.2.0/LSB-Core-generic/LSB-Core-generic/symversion.html
 
 const (
-       _AT_RANDOM       = 25
        _AT_SYSINFO_EHDR = 33
 
        _PT_LOAD    = 1 /* Loadable program segment */
@@ -303,8 +302,5 @@ func archauxv(tag, val uintptr) {
                info1 := (*vdso_info)(noescape(unsafe.Pointer(&info)))
                vdso_init_from_sysinfo_ehdr(info1, (*elf64Ehdr)(unsafe.Pointer(val)))
                vdso_parse_symbols(info1, vdso_find_version(info1, &linux26))
-
-       case _AT_RANDOM:
-               startupRandomData = (*[16]byte)(unsafe.Pointer(val))[:]
        }
 }