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.
Fix PR'd at https:/ /github. com/snapcore/ snapcraft/ pull/2663/ files