aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/scripts
diff options
context:
space:
mode:
authorHemmo Nieminen <hemmo.nieminen@kone.com>2021-03-16 09:20:39 +0200
committerJussi Pakkanen <jpakkane@gmail.com>2021-03-24 17:51:57 +0200
commit01c6b50a77357ba19c1023eb40f54263b5b91ee8 (patch)
tree876fb2b4b83a20a4139a553f84329bbeb8d75c5c /mesonbuild/scripts
parent703fd6d1fa32e2b5e706a7b6d726de7a3791fdec (diff)
downloadmeson-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.
Diffstat (limited to 'mesonbuild/scripts')
-rw-r--r--mesonbuild/scripts/depfixer.py41
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)