snapcraft prime fails if it finds an invalid ELF file

Bug #1838098 reported by Tiago Stürmer Daitx
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
Snapcraft
Fix Released
Medium
Chris Patterson

Bug Description

While priming a proprietary testsuite snapcraft bailed out when it got an exception due to an invalid ELF file.

This is the traceback:
Traceback (most recent call last):
  File "/snap/snapcraft/3059/bin/snapcraft", line 11, in <module>
    load_entry_point('snapcraft==3.6', 'console_scripts', 'snapcraft')()
  File "/snap/snapcraft/3059/lib/python3.5/site-packages/click/core.py", line 722, in __call__
    return self.main(*args, **kwargs)
  File "/snap/snapcraft/3059/lib/python3.5/site-packages/click/core.py", line 697, in main
    rv = self.invoke(ctx)
  File "/snap/snapcraft/3059/lib/python3.5/site-packages/click/core.py", line 1066, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/snap/snapcraft/3059/lib/python3.5/site-packages/snapcraft/cli/_command.py", line 82, in invoke
    return super().invoke(ctx)
  File "/snap/snapcraft/3059/lib/python3.5/site-packages/click/core.py", line 895, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/snap/snapcraft/3059/lib/python3.5/site-packages/click/core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "/snap/snapcraft/3059/lib/python3.5/site-packages/snapcraft/cli/lifecycle.py", line 274, in snap
    _execute(steps.PRIME, parts=[], pack_project=True, output=output, **kwargs)
  File "/snap/snapcraft/3059/lib/python3.5/site-packages/snapcraft/cli/lifecycle.py", line 79, in _execute
    lifecycle.execute(step, project_config, parts)
  File "/snap/snapcraft/3059/lib/python3.5/site-packages/snapcraft/internal/lifecycle/_runner.py", line 94, in execute
    executor.run(step, part_names)
  File "/snap/snapcraft/3059/lib/python3.5/site-packages/snapcraft/internal/lifecycle/_runner.py", line 148, in run
    self._handle_step(part_names, part, step, current_step, cli_config)
  File "/snap/snapcraft/3059/lib/python3.5/site-packages/snapcraft/internal/lifecycle/_runner.py", line 162, in _handle_step
    getattr(self, "_run_{}".format(current_step.name))(part)
  File "/snap/snapcraft/3059/lib/python3.5/site-packages/snapcraft/internal/lifecycle/_runner.py", line 237, in _run_prime
    self._run_step(step=steps.PRIME, part=part, progress="Priming")
  File "/snap/snapcraft/3059/lib/python3.5/site-packages/snapcraft/internal/lifecycle/_runner.py", line 281, in _run_step
    getattr(part, step.name)()
  File "/snap/snapcraft/3059/lib/python3.5/site-packages/snapcraft/internal/pluginhandler/__init__.py", line 778, in prime
    self._runner.prime()
  File "/snap/snapcraft/3059/lib/python3.5/site-packages/snapcraft/internal/pluginhandler/_runner.py", line 91, in prime
    "override-prime", self._override_prime_scriptlet, self._primedir
  File "/snap/snapcraft/3059/lib/python3.5/site-packages/snapcraft/internal/pluginhandler/_runner.py", line 137, in _run_scriptlet
    scriptlet_name, function_call.strip()
  File "/snap/snapcraft/3059/lib/python3.5/site-packages/snapcraft/internal/pluginhandler/_runner.py", line 193, in _handle_builtin_function
    function(**function_args)
  File "/snap/snapcraft/3059/lib/python3.5/site-packages/snapcraft/internal/pluginhandler/__init__.py", line 790, in _do_prime
    dependency_paths = self._handle_elf(snap_files)
  File "/snap/snapcraft/3059/lib/python3.5/site-packages/snapcraft/internal/pluginhandler/__init__.py", line 797, in _handle_elf
    elf_files = elf.get_elf_files(self.primedir, snap_files)
  File "/snap/snapcraft/3059/lib/python3.5/site-packages/snapcraft/internal/elf.py", line 571, in get_elf_files
    elf_file = ElfFile(path=path)
  File "/snap/snapcraft/3059/lib/python3.5/site-packages/snapcraft/internal/elf.py", line 218, in __init__
    elf_data = self._extract(path)
  File "/snap/snapcraft/3059/lib/python3.5/site-packages/snapcraft/internal/elf.py", line 234, in _extract
    elf = elftools.elf.elffile.ELFFile(fp)
  File "/snap/snapcraft/3059/lib/python3.5/site-packages/elftools/elf/elffile.py", line 61, in __init__
    self._identify_file()
  File "/snap/snapcraft/3059/lib/python3.5/site-packages/elftools/elf/elffile.py", line 237, in _identify_file
    raise ELFError('Invalid EI_CLASS %s' % repr(ei_class))
elftools.common.exceptions.ELFError: Invalid EI_CLASS b'\x00'

The file header has an invalid class for an ELF file (it is not supposed to be valid, this is to be used by a testsuite):
$ od -An -tx1 -N5 <offending file>
 7f 45 4c 46 00

Expected result:
snapcraft should ignore the ELFError as this is not a valid ELF file.

https://github.com/snapcore/snapcraft/blob/master/snapcraft/internal/elf.py#L571 should be modified to catch the ELFError and continue processing the next file on the list.

Changed in snapcraft:
importance: Undecided → Medium
assignee: nobody → Chris Patterson (cjp256)
status: New → Triaged
Revision history for this message
Chris Patterson (cjp256) wrote :
Changed in snapcraft:
status: Triaged → In Progress
Changed in snapcraft:
status: In Progress → Fix Committed
Changed in snapcraft:
status: Fix Committed → Fix Released
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.