aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/minstall.py
diff options
context:
space:
mode:
authorMarco Trevisan (Treviño) <mail@3v1n0.net>2018-08-16 04:19:16 +0200
committerMarco Trevisan (Treviño) <mail@3v1n0.net>2018-08-17 16:41:09 +0200
commit5de2a7910aafb39940789f5dbed244c230624917 (patch)
tree460ebcef609ca69a240f87a126860842d98a26ae /mesonbuild/minstall.py
parent2d010727ed6657cb53d5043032417e0a9035e117 (diff)
downloadmeson-5de2a7910aafb39940789f5dbed244c230624917.zip
meson-5de2a7910aafb39940789f5dbed244c230624917.tar.gz
meson-5de2a7910aafb39940789f5dbed244c230624917.tar.bz2
minstall: never follow symlinks when setting ownership
Since we're supposed to call this for each installed path, we only should go through what we've installed and not what this point to, as it might be outside our scope or not existent. To do this, since shutil.chown doesn't expose the follow_symlink that os.chown has, we can temporarily replace os.chown with a lambda that acutually passes all the values as we want them, and then restore it to the built-in functions. Not the nicest way, but fixes the issue without having to reimplement what shutil does. Fixes #3914
Diffstat (limited to 'mesonbuild/minstall.py')
-rw-r--r--mesonbuild/minstall.py20
1 files changed, 19 insertions, 1 deletions
diff --git a/mesonbuild/minstall.py b/mesonbuild/minstall.py
index 5ac1279..3ae1199 100644
--- a/mesonbuild/minstall.py
+++ b/mesonbuild/minstall.py
@@ -79,6 +79,24 @@ def append_to_log(lf, line):
lf.write('\n')
lf.flush()
+def set_chown(path, user=None, group=None, dir_fd=None, follow_symlinks=True):
+ # shutil.chown will call os.chown without passing all the parameters
+ # and particularly follow_symlinks, thus we replace it temporary
+ # with a lambda with all the parameters so that follow_symlinks will
+ # be actually passed properly.
+ # Not nice, but better than actually rewriting shutil.chown until
+ # this python bug is fixed: https://bugs.python.org/issue18108
+ real_os_chown = os.chown
+ try:
+ os.chown = lambda p, u, g: real_os_chown(p, u, g,
+ dir_fd=dir_fd,
+ follow_symlinks=follow_symlinks)
+ shutil.chown(path, user, group)
+ except:
+ raise
+ finally:
+ os.chown = real_os_chown
+
def set_chmod(path, mode, dir_fd=None, follow_symlinks=True):
try:
os.chmod(path, mode, dir_fd=dir_fd, follow_symlinks=follow_symlinks)
@@ -105,7 +123,7 @@ def set_mode(path, mode, default_umask):
# No chown() on Windows, and must set one of owner/group
if not is_windows() and (mode.owner or mode.group) is not None:
try:
- shutil.chown(path, mode.owner, mode.group)
+ set_chown(path, mode.owner, mode.group, follow_symlinks=False)
except PermissionError as e:
msg = '{!r}: Unable to set owner {!r} and group {!r}: {}, ignoring...'
print(msg.format(path, mode.owner, mode.group, e.strerror))