]> Cypherpunks.ru repositories - gostls13.git/commitdiff
debug/gosym: skip non-real functions in LineToPC lookup
authorCherry Mui <cherryyz@google.com>
Wed, 23 Mar 2022 16:02:36 +0000 (12:02 -0400)
committerCherry Mui <cherryyz@google.com>
Wed, 23 Mar 2022 17:12:00 +0000 (17:12 +0000)
The code iterates through the func table to find a function with
a given file and line number. The code panics if it sees a non-
real function (e.g. go.buildid), because its CU offset is -1,
which causes an index-out-of-bounds error. The debug/gosym package
recovers the panic and returns "not found", without looping
through the rest of the entries.

Skip the non-real functions. They cannot be looked up by line
number anyway.

Fixes #51890.

Change-Id: I96f64c17b4a53ffdce047c8244b35a402a0d39ac
Reviewed-on: https://go-review.googlesource.com/c/go/+/395074
Trust: Cherry Mui <cherryyz@google.com>
Run-TryBot: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Jeremy Faller <jeremy@golang.org>
src/debug/gosym/pclntab.go

index d9ae8b73a93bc89cd722a076cd7a5cd6372dc24b..2ceea3d46f3fa6ac2fb19e7baf0e254a19e91d52 100644 (file)
@@ -627,6 +627,10 @@ func (t *LineTable) go12LineToPC(file string, line int) (pc uint64) {
                filetab := f.pcfile()
                linetab := f.pcln()
                if t.version == ver116 || t.version == ver118 {
+                       if f.cuOffset() == ^uint32(0) {
+                               // skip functions without compilation unit (not real function, or linker generated)
+                               continue
+                       }
                        cutab = t.cutab[f.cuOffset()*4:]
                }
                pc := t.findFileLine(entry, filetab, linetab, int32(filenum), int32(line), cutab)