Bug #162542 - When checking permissions inside CCACHE_DIR for compatibility
authorZac Medico <zmedico@gentoo.org>
Tue, 8 Apr 2008 22:31:23 +0000 (22:31 -0000)
committerZac Medico <zmedico@gentoo.org>
Tue, 8 Apr 2008 22:31:23 +0000 (22:31 -0000)
with FEATURES=userpriv, check the permissions on files inside the directory
to decide whether to fix the permissions.

svn path=/main/trunk/; revision=9759

pym/portage/__init__.py

index b629ae128849b333f4259606788e231fca9484b6..dbe02fba403463c5523f555265f1f7e45ebb692e 100644 (file)
@@ -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.