diff options
| author | Xavier Claessens <xavier.claessens@collabora.com> | 2021-10-31 16:16:10 -0400 |
|---|---|---|
| committer | Eli Schwartz <eschwartz93@gmail.com> | 2022-06-16 17:06:25 -0400 |
| commit | 2e3ac3eec00f32dabcfc470cd4c1090303d08e58 (patch) | |
| tree | 1c7c1b51798a99a5566c99233b5a6d2b713292c8 /mesonbuild/coredata.py | |
| parent | 7229443738482db2183d048cf8b8b8e6bd11fa6d (diff) | |
| download | meson-2e3ac3eec00f32dabcfc470cd4c1090303d08e58.tar.gz | |
minstall: Add more safety checks when unpickling installdata
When need to catch exceptions just like we do in coredata.load() to
print proper error message instead of backtrace when user mix meson
versions.
This happens frequently when user has a newer version of meson installed
in their HOME and then "sudo meson install" uses the system version of
meson.
Diffstat (limited to 'mesonbuild/coredata.py')
| -rw-r--r-- | mesonbuild/coredata.py | 19 |
1 files changed, 4 insertions, 15 deletions
diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py index 569fe3917..a55d674c5 100644 --- a/mesonbuild/coredata.py +++ b/mesonbuild/coredata.py @@ -23,6 +23,7 @@ from .mesonlib import ( MesonException, EnvironmentException, MachineChoice, PerMachine, PerMachineDefaultable, default_libdir, default_libexecdir, default_prefix, split_args, OptionKey, OptionType, stringlistify, + pickle_load ) from .wrap import WrapMode import ast @@ -1047,23 +1048,11 @@ def major_versions_differ(v1: str, v2: str) -> bool: def load(build_dir: str) -> CoreData: filename = os.path.join(build_dir, 'meson-private', 'coredata.dat') - load_fail_msg = f'Coredata file {filename!r} is corrupted. Try with a fresh build tree.' - try: - with open(filename, 'rb') as f: - obj = pickle.load(f) - except (pickle.UnpicklingError, EOFError): - raise MesonException(load_fail_msg) - except (TypeError, ModuleNotFoundError, AttributeError): - raise MesonException( - f"Coredata file {filename!r} references functions or classes that don't " - "exist. This probably means that it was generated with an old " - "version of meson.") - if not isinstance(obj, CoreData): - raise MesonException(load_fail_msg) - if major_versions_differ(obj.version, version): - raise MesonVersionMismatchException(obj.version, version) + obj = pickle_load(filename, 'Coredata', CoreData) + assert isinstance(obj, CoreData), 'for mypy' return obj + def save(obj: CoreData, build_dir: str) -> str: filename = os.path.join(build_dir, 'meson-private', 'coredata.dat') prev_filename = filename + '.prev' |
