MCPcopy Create free account
hub / github.com/google/pprof / parseNotes

Function parseNotes

internal/elfexec/elfexec.go:39–115  ·  view source on GitHub ↗

parseNotes returns the notes from a SHT_NOTE section or PT_NOTE segment.

(reader io.Reader, alignment int, order binary.ByteOrder)

Source from the content-addressed store, hash-verified

37
38// parseNotes returns the notes from a SHT_NOTE section or PT_NOTE segment.
39func parseNotes(reader io.Reader, alignment int, order binary.ByteOrder) ([]elfNote, error) {
40 r := bufio.NewReader(reader)
41
42 // padding returns the number of bytes required to pad the given size to an
43 // alignment boundary.
44 padding := func(size int) int {
45 return ((size + (alignment - 1)) &^ (alignment - 1)) - size
46 }
47
48 var notes []elfNote
49 for {
50 noteHeader := make([]byte, 12) // 3 4-byte words
51 if _, err := io.ReadFull(r, noteHeader); err == io.EOF {
52 break
53 } else if err != nil {
54 return nil, err
55 }
56 namesz := order.Uint32(noteHeader[0:4])
57 descsz := order.Uint32(noteHeader[4:8])
58 typ := order.Uint32(noteHeader[8:12])
59
60 if uint64(namesz) > uint64(maxNoteSize) {
61 return nil, fmt.Errorf("note name too long (%d bytes)", namesz)
62 }
63 var name string
64 if namesz > 0 {
65 // Documentation differs as to whether namesz is meant to include the
66 // trailing zero, but everyone agrees that name is null-terminated.
67 // So we'll just determine the actual length after the fact.
68 var err error
69 name, err = r.ReadString('\x00')
70 if err == io.EOF {
71 return nil, fmt.Errorf("missing note name (want %d bytes)", namesz)
72 } else if err != nil {
73 return nil, err
74 }
75 namesz = uint32(len(name))
76 name = name[:len(name)-1]
77 }
78
79 // Drop padding bytes until the desc field.
80 for n := padding(len(noteHeader) + int(namesz)); n > 0; n-- {
81 if _, err := r.ReadByte(); err == io.EOF {
82 return nil, fmt.Errorf(
83 "missing %d bytes of padding after note name", n)
84 } else if err != nil {
85 return nil, err
86 }
87 }
88
89 if uint64(descsz) > uint64(maxNoteSize) {
90 return nil, fmt.Errorf("note desc too long (%d bytes)", descsz)
91 }
92 desc := make([]byte, int(descsz))
93 if _, err := io.ReadFull(r, desc); err == io.EOF {
94 return nil, fmt.Errorf("missing desc (want %d bytes)", len(desc))
95 } else if err != nil {
96 return nil, err

Callers 1

GetBuildIDFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…