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
This commit is contained in:
Colin Cross 2022-04-11 18:42:34 -07:00
parent 03f951d026
commit 338df53621
2 changed files with 42 additions and 3 deletions

View file

@ -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 {

View file

@ -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()
}