From: Austin Clements Date: Wed, 17 May 2017 18:27:28 +0000 (-0400) Subject: runtime/pprof: don't produce 0 location in count profiles X-Git-Tag: go1.9beta1~235 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=c34add780b65d4c18978a9e490a2db9e4ff22d3a;p=gostls13.git runtime/pprof: don't produce 0 location in count profiles profileBuilder.locForPC returns 0 to mean "no location" because 0 is an invalid location index. However, the code to build count profiles doesn't check the result of locForPC, so this 0 location index ends up in the profile's location list. This, in turn, causes problems later when we decode the profile because it puts a nil *Location in the sample's location slice, which can later lead to a nil pointer panic. Fix this by making printCountProfile correctly discard the result of locForPC if it returns 0. This makes this call match the other two calls of locForPC. Updates #15156. Change-Id: I4492b3652b513448bc56f4cfece4e37da5e42f94 Reviewed-on: https://go-review.googlesource.com/43630 Reviewed-by: Michael Matloob Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot --- diff --git a/src/runtime/pprof/pprof.go b/src/runtime/pprof/pprof.go index b6253b1aa5..21ea25ce36 100644 --- a/src/runtime/pprof/pprof.go +++ b/src/runtime/pprof/pprof.go @@ -401,7 +401,11 @@ func printCountProfile(w io.Writer, debug int, name string, p countProfile) erro for _, addr := range p.Stack(index[k]) { // For count profiles, all stack addresses are // return PCs, which is what locForPC expects. - locs = append(locs, b.locForPC(addr)) + l := b.locForPC(addr) + if l == 0 { // runtime.goexit + continue + } + locs = append(locs, l) } b.pbSample(values, locs, nil) }