]> Cypherpunks repositories - gostls13.git/commitdiff
internal/bisect: adjust stack PCs relative to Callers[2]
authorDavid Chase <drchase@google.com>
Tue, 9 May 2023 19:03:48 +0000 (15:03 -0400)
committerDavid Chase <drchase@google.com>
Tue, 9 May 2023 19:55:24 +0000 (19:55 +0000)
This is necessary to make hashes be consistent across runs,
otherwise ASLR messes up search.

Change-Id: Icf668dfe4c2008709f7767397b6700d0d5439287
Reviewed-on: https://go-review.googlesource.com/c/go/+/493857
Reviewed-by: Bryan Mills <bcmills@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: David Chase <drchase@google.com>

src/internal/bisect/bisect.go

index 1a3658a23837883eeedeed9cf0494c86a9a9a02a..21e825eab94b8586c1956b4c305d145fe3dd039f 100644 (file)
@@ -412,11 +412,18 @@ func (m *Matcher) Stack(w Writer) bool {
 func (m *Matcher) stack(w Writer) bool {
        const maxStack = 16
        var stk [maxStack]uintptr
-       n := runtime.Callers(3, stk[:])
-       if n == 0 {
+       n := runtime.Callers(2, stk[:])
+       // caller #2 is not for printing; need it to normalize PCs if ASLR.
+       if n <= 1 {
                return false
        }
 
+       base := stk[0]
+       // normalize PCs
+       for i := range stk[:n] {
+               stk[i] -= base
+       }
+
        h := Hash(stk[:n])
        if m.ShouldPrint(h) {
                var d *dedup
@@ -437,7 +444,11 @@ func (m *Matcher) stack(w Writer) bool {
                        }
                } else {
                        if !d.seen(h) {
-                               printStack(w, h, stk[:n])
+                               // Restore PCs in stack for printing
+                               for i := range stk[:n] {
+                                       stk[i] += base
+                               }
+                               printStack(w, h, stk[1:n])
                        }
                }
        }