]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: check for findmoduledatap returning nil
authorIan Lance Taylor <iant@golang.org>
Sat, 18 Jul 2015 20:35:12 +0000 (13:35 -0700)
committerIan Lance Taylor <iant@golang.org>
Sat, 18 Jul 2015 21:26:59 +0000 (21:26 +0000)
The findmoduledatap function will not return nil in ordinary use, but
check for nil to try to avoid crashing when we are already crashing.

Update #11783.

Change-Id: If7b1adb51efab13b4c1a37b6f3c9ad22641a0b56
Reviewed-on: https://go-review.googlesource.com/12391
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/runtime/symtab.go

index 44d08e0e7adbbc115ec09875fd93e15a22cf0ae7..82e6f9ffedcc570e00234ca1b5cf615b3b9cf295 100644 (file)
@@ -223,6 +223,13 @@ func pcvalue(f *_func, off int32, targetpc uintptr, strict bool) int32 {
                return -1
        }
        datap := findmoduledatap(f.entry) // inefficient
+       if datap == nil {
+               if strict && panicking == 0 {
+                       print("runtime: no module data for ", hex(f.entry), "\n")
+                       throw("no module data")
+               }
+               return -1
+       }
        p := datap.pclntable[off:]
        pc := f.entry
        val := int32(-1)
@@ -266,6 +273,9 @@ func cfuncname(f *_func) *byte {
                return nil
        }
        datap := findmoduledatap(f.entry) // inefficient
+       if datap == nil {
+               return nil
+       }
        return (*byte)(unsafe.Pointer(&datap.pclntable[f.nameoff]))
 }
 
@@ -275,6 +285,9 @@ func funcname(f *_func) string {
 
 func funcline1(f *_func, targetpc uintptr, strict bool) (file string, line int32) {
        datap := findmoduledatap(f.entry) // inefficient
+       if datap == nil {
+               return "?", 0
+       }
        fileno := int(pcvalue(f, f.pcfile, targetpc, strict))
        line = pcvalue(f, f.pcln, targetpc, strict)
        if fileno == -1 || line == -1 || fileno >= len(datap.filetab) {