]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fix possible nil deref added in CL 270943
authorDavid Chase <drchase@google.com>
Mon, 3 May 2021 17:24:27 +0000 (13:24 -0400)
committerDavid Chase <drchase@google.com>
Mon, 3 May 2021 18:17:42 +0000 (18:17 +0000)
In the event allocSpan returned a nil, this would crash.
Cleaned up the code and comments slightly, too.

Change-Id: I6231d4b4c14218e6956b4a97a205adc3206f59ec
Reviewed-on: https://go-review.googlesource.com/c/go/+/316429
Trust: David Chase <drchase@google.com>
Run-TryBot: David Chase <drchase@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
src/runtime/mheap.go

index 952c0b21b0469d377f08cfd4b32bc8c0f2c81dc0..84c00ce8f85cd1e13047f4fae9536b67bdae08d3 100644 (file)
@@ -897,7 +897,8 @@ func (s spanAllocType) manual() bool {
 // spanclass indicates the span's size class and scannability.
 //
 // If needzero is true, the memory for the returned span will be zeroed.
-// The boolean returned indicates whether the returned span is zeroed.
+// The boolean returned indicates whether the returned span contains zeroes,
+// either because this was requested, or because it was already zeroed.
 func (h *mheap) alloc(npages uintptr, spanclass spanClass, needzero bool) (*mspan, bool) {
        // Don't do any operations that lock the heap on the G stack.
        // It might trigger stack growth, and the stack growth code needs
@@ -912,14 +913,15 @@ func (h *mheap) alloc(npages uintptr, spanclass spanClass, needzero bool) (*mspa
                s = h.allocSpan(npages, spanAllocHeap, spanclass)
        })
 
+       if s == nil {
+               return nil, false
+       }
        isZeroed := s.needzero == 0
-       if s != nil {
-               if needzero && s.needzero != 0 {
-                       memclrNoHeapPointers(unsafe.Pointer(s.base()), s.npages<<_PageShift)
-                       isZeroed = true
-               }
-               s.needzero = 0
+       if needzero && !isZeroed {
+               memclrNoHeapPointers(unsafe.Pointer(s.base()), s.npages<<_PageShift)
+               isZeroed = true
        }
+       s.needzero = 0
        return s, isZeroed
 }