diff options
author | Hemmo Nieminen <hemmo.nieminen@kone.com> | 2021-03-16 09:20:39 +0200 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2021-03-24 17:51:57 +0200 |
commit | 01c6b50a77357ba19c1023eb40f54263b5b91ee8 (patch) | |
tree | 876fb2b4b83a20a4139a553f84329bbeb8d75c5c | |
parent | 703fd6d1fa32e2b5e706a7b6d726de7a3791fdec (diff) | |
download | meson-01c6b50a77357ba19c1023eb40f54263b5b91ee8.zip meson-01c6b50a77357ba19c1023eb40f54263b5b91ee8.tar.gz meson-01c6b50a77357ba19c1023eb40f54263b5b91ee8.tar.bz2 |
depfixer: temporarily modify file permissions
If the installed files don't have suitable file permissions depfixer
will fail to process it. Temporarily lax file permissions to work around
this.
-rw-r--r-- | mesonbuild/scripts/depfixer.py | 41 |
1 files changed, 33 insertions, 8 deletions
diff --git a/mesonbuild/scripts/depfixer.py b/mesonbuild/scripts/depfixer.py index 8ce74ee..c215749 100644 --- a/mesonbuild/scripts/depfixer.py +++ b/mesonbuild/scripts/depfixer.py @@ -13,8 +13,12 @@ # limitations under the License. -import sys, struct -import shutil, subprocess +import sys +import os +import stat +import struct +import shutil +import subprocess import typing as T from ..mesonlib import OrderedSet @@ -120,9 +124,9 @@ class Elf(DataSizes): def __init__(self, bfile: str, verbose: bool = True) -> None: self.bfile = bfile self.verbose = verbose - self.bf = open(bfile, 'r+b') self.sections = [] # type: T.List[SectionHeader] self.dynamic = [] # type: T.List[DynamicEntry] + self.open_bf(bfile) try: (self.ptrsize, self.is_le) = self.detect_elf_type() super().__init__(self.ptrsize, self.is_le) @@ -130,19 +134,40 @@ class Elf(DataSizes): self.parse_sections() self.parse_dynamic() except (struct.error, RuntimeError): - self.bf.close() + self.close_bf() raise + def open_bf(self, bfile: str) -> None: + self.bf = None + self.bf_perms = None + try: + self.bf = open(bfile, 'r+b') + except PermissionError as e: + self.bf_perms = stat.S_IMODE(os.lstat(bfile).st_mode) + os.chmod(bfile, stat.S_IREAD | stat.S_IWRITE | stat.S_IEXEC) + try: + self.bf = open(bfile, 'r+b') + except Exception: + os.chmod(bfile, self.bf_perms) + self.bf_perms = None + raise e + + def close_bf(self) -> None: + if self.bf is not None: + if self.bf_perms is not None: + os.fchmod(self.bf.fileno(), self.bf_perms) + self.bf_perms = None + self.bf.close() + self.bf = None + def __enter__(self) -> 'Elf': return self def __del__(self) -> None: - if self.bf: - self.bf.close() + self.close_bf() def __exit__(self, exc_type: T.Any, exc_value: T.Any, traceback: T.Any) -> None: - self.bf.close() - self.bf = None + self.close_bf() def detect_elf_type(self) -> T.Tuple[int, bool]: data = self.bf.read(6) |