Index: pym/portage.py =================================================================== --- pym/portage.py (revision 9759) +++ pym/portage.py (revision 9760) @@ -4234,12 +4234,34 @@ 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.