]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: check kernel physical page size during init
authorAustin Clements <austin@google.com>
Thu, 14 Apr 2016 17:27:36 +0000 (13:27 -0400)
committerAustin Clements <austin@google.com>
Sat, 16 Apr 2016 21:42:37 +0000 (21:42 +0000)
The runtime hard-codes an assumed physical page size. If this is
smaller than the kernel's page size or not a multiple of it, sysUnused
may incorrectly release more memory to the system than intended.

Add a runtime startup check that the runtime's assumed physical page
is compatible with the kernel's physical page size.

For #9993.

Change-Id: Ida9d07f93c00ca9a95dd55fc59bf0d8a607f6728
Reviewed-on: https://go-review.googlesource.com/22064
Reviewed-by: Rick Hudson <rlh@golang.org>
src/runtime/os_linux.go

index 4645f1c33d741bd418261c4fe23cd0de0a9cadd1..35b57d8a23090dcd2b6913583f4fbc1837967b4e 100644 (file)
@@ -178,6 +178,7 @@ var failthreadcreate = []byte("runtime: failed to create new OS thread\n")
 
 const (
        _AT_NULL   = 0  // End of vector
+       _AT_PAGESZ = 6  // System physical page size
        _AT_RANDOM = 25 // introduced in 2.6.29
 )
 
@@ -201,7 +202,21 @@ func sysargs(argc int32, argv **byte) {
                        // The kernel provides a pointer to 16-bytes
                        // worth of random data.
                        startupRandomData = (*[16]byte)(unsafe.Pointer(val))[:]
+
+               case _AT_PAGESZ:
+                       // Check that the true physical page size is
+                       // compatible with the runtime's assumed
+                       // physical page size.
+                       if sys.PhysPageSize < val {
+                               print("runtime: kernel page size (", val, ") is larger than runtime page size (", sys.PhysPageSize, ")\n")
+                               exit(1)
+                       }
+                       if sys.PhysPageSize%val != 0 {
+                               print("runtime: runtime page size (", sys.PhysPageSize, ") is not a multiple of kernel page size (", val, ")\n")
+                               exit(1)
+                       }
                }
+
                archauxv(tag, val)
        }
 }