diff options
Diffstat (limited to 'pym/portage/__init__.py')
-rw-r--r-- | pym/portage/__init__.py | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index b629ae128..dbe02fba4 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -4240,12 +4240,34 @@ def prepare_build_dirs(myroot, mysettings, cleanup): if droppriv: st = os.stat(mydir) if st.st_gid != portage_gid or \ - not stat.S_IMODE(st.st_mode) & dirmode: + not dirmode == (stat.S_IMODE(st.st_mode) & dirmode): droppriv_fix = True + if not droppriv_fix: + # Check permissions of files in the directory. + for filename in os.listdir(mydir): + try: + subdir_st = os.lstat( + os.path.join(mydir, filename)) + except OSError: + continue + if subdir_st.st_gid != portage_gid or \ + ((stat.S_ISDIR(subdir_st.st_mode) and \ + not dirmode == (stat.S_IMODE(subdir_st.st_mode) & dirmode)) or \ + (not stat.S_ISDIR(subdir_st.st_mode) and \ + not filemode == (stat.S_IMODE(subdir_st.st_mode) & filemode))): + droppriv_fix = True + break + if droppriv_fix: + writemsg(colorize("WARN", " * ") + \ + "Adjusting permissions " + \ + "for FEATURES=userpriv: '%s'\n" % mydir, + noiselevel=-1) + elif modified: + writemsg(colorize("WARN", " * ") + \ + "Adjusting permissions " + \ + "for FEATURES=%s: '%s'\n" % (myfeature, mydir), + noiselevel=-1) if modified or kwargs["always_recurse"] or droppriv_fix: - if modified: - writemsg("Adjusting permissions recursively: '%s'\n" % mydir, - noiselevel=-1) def onerror(e): raise # The feature is disabled if a single error # occurs during permissions adjustment. |