Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 338df536 authored by Colin Cross's avatar Colin Cross
Browse files

symbols_map: allow unexpected EOF in ELF files

Some of the prebuilt ELF files used for bionic heads cause an
unexpected EOF error, ignore unexpected EOF the same way we do
for EOF.

Test: not yet
Change-Id: I267d11b4d12b83ecebedc72a565e148c5e53af6d
parent 03f951d0
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -38,13 +38,13 @@ func elfIdentifier(filename string, allowMissing bool) (string, error) {
	return elfIdentifierFromReaderAt(f, filename, allowMissing)
}

// elfIdentifier extracts the elf build ID from a ReaderAt.  If allowMissing is true it returns
// an empty identifier if the file exists but the build ID note does not.
// elfIdentifierFromReaderAt extracts the elf build ID from a ReaderAt.  If allowMissing is true it
// returns an empty identifier if the file exists but the build ID note does not.
func elfIdentifierFromReaderAt(r io.ReaderAt, filename string, allowMissing bool) (string, error) {
	f, err := elf.NewFile(r)
	if err != nil {
		if allowMissing {
			if errors.Is(err, io.EOF) {
			if errors.Is(err, io.EOF) || errors.Is(err, io.ErrUnexpectedEOF) {
				return "", nil
			}
			if _, ok := err.(*elf.FormatError); ok {
+39 −0
Original line number Diff line number Diff line
@@ -39,6 +39,10 @@ func Test_elfIdentifierFromReaderAt_BadElfFile(t *testing.T) {
			name:     "empty elf",
			contents: emptyElfFile(),
		},
		{
			name:     "short section header",
			contents: shortSectionHeaderElfFile(),
		},
	}

	for _, tt := range tests {
@@ -111,3 +115,38 @@ func emptyElfFile() string {
	binary.Write(buf, binary.LittleEndian, header)
	return buf.String()
}

// shortSectionHeader returns an elf file header with a section header that extends past the end of
// the file.
func shortSectionHeaderElfFile() string {
	ident := [elf.EI_NIDENT]byte{}
	identBuf := bytes.NewBuffer(ident[0:0:elf.EI_NIDENT])
	binary.Write(identBuf, binary.LittleEndian, []byte("\x7fELF"))
	binary.Write(identBuf, binary.LittleEndian, elf.ELFCLASS64)
	binary.Write(identBuf, binary.LittleEndian, elf.ELFDATA2LSB)
	binary.Write(identBuf, binary.LittleEndian, elf.EV_CURRENT)
	binary.Write(identBuf, binary.LittleEndian, elf.ELFOSABI_LINUX)
	binary.Write(identBuf, binary.LittleEndian, make([]byte, 8))

	header := elf.Header64{
		Ident:     ident,
		Type:      uint16(elf.ET_EXEC),
		Machine:   uint16(elf.EM_X86_64),
		Version:   uint32(elf.EV_CURRENT),
		Entry:     0,
		Phoff:     uint64(binary.Size(elf.Header64{})),
		Shoff:     uint64(binary.Size(elf.Header64{})),
		Flags:     0,
		Ehsize:    uint16(binary.Size(elf.Header64{})),
		Phentsize: 0x38,
		Phnum:     0,
		Shentsize: 0x40,
		Shnum:     1,
		Shstrndx:  0,
	}

	buf := &bytes.Buffer{}
	binary.Write(buf, binary.LittleEndian, header)
	binary.Write(buf, binary.LittleEndian, []byte{0})
	return buf.String()
}