return "", err
}
}
- nameSize := ef.ByteOrder.Uint32(note)
- valSize := ef.ByteOrder.Uint32(note[4:])
- tag := ef.ByteOrder.Uint32(note[8:])
- name := note[12:16]
- if nameSize != 4 || 16+valSize > uint32(len(note)) || tag != elfGoBuildIDTag || !bytes.Equal(name, elfGoNote) {
- continue
- }
- return string(note[16 : 16+valSize]), nil
+ filesz := p.Filesz
+ for filesz >= 16 {
+ nameSize := ef.ByteOrder.Uint32(note)
+ valSize := ef.ByteOrder.Uint32(note[4:])
+ tag := ef.ByteOrder.Uint32(note[8:])
+ name := note[12:16]
+ if nameSize == 4 && 16+valSize <= uint32(len(note)) && tag == elfGoBuildIDTag && bytes.Equal(name, elfGoNote) {
+ return string(note[16 : 16+valSize]), nil
+ }
+
+ nameSize = (nameSize + 3) &^ 3
+ valSize = (valSize + 3) &^ 3
+ notesz := uint64(12 + nameSize + valSize)
+ if filesz <= notesz {
+ break
+ }
+ filesz -= notesz
+ note = note[notesz:]
+ }
}
// No note. Treat as successful but build ID empty.
}
func testNoteReading(t *testing.T) {
- if runtime.GOOS == "dragonfly" {
- t.Skipf("TestNoteReading is broken on dragonfly - golang.org/issue/13364", runtime.GOOS)
- }
tg := testgo(t)
defer tg.cleanup()
tg.tempFile("hello.go", `package main; func main() { print("hello, world\n") }`)