apply_recursive_permissions: don't follow symlink
authorZac Medico <zmedico@gentoo.org>
Tue, 14 Dec 2010 03:47:27 +0000 (19:47 -0800)
committerZac Medico <zmedico@gentoo.org>
Tue, 14 Dec 2010 03:56:45 +0000 (19:56 -0800)
This will fix the following error, reported in bug #339670:

_ebuild_exit
    _post_phase_userpriv_perms(settings)
  File "/usr/lib64/portage/pym/portage/package/ebuild/doebuild.py", line 1207,
in _post_phase_userpriv_perms
    filemode=0o60, filemask=0)
  File "/usr/lib64/portage/pym/portage/util/__init__.py", line 1018, in
apply_recursive_permissions
    uid=uid, gid=gid, mode=filemode, mask=filemask)
  File "/usr/lib64/portage/pym/portage/util/__init__.py", line 1043, in
apply_secpass_permissions
    stat_cached = os.stat(filename)
  File "/usr/lib64/portage/pym/portage/__init__.py", line 226, in __call__
    rval = self._func(*wrapped_args, **wrapped_kwargs)
OSError: [Errno 40] Too many levels of symbolic links:
'/var/tmp/portage/dev-vcs/mercurial-1.7.2/temp/tests-2.7/child0/test-mq-symlinks.t/linka'

pym/portage/util/__init__.py

index 24beb2ef762296af6106f025c5cc55382cca3fdc..55ffcfc8a1a53c2ddf2fbae6148fe0ba5e521695 100644 (file)
@@ -954,6 +954,9 @@ def apply_recursive_permissions(top, uid=-1, gid=-1,
        Returns True if all permissions are applied and False if some are left
        unapplied."""
 
+       # Avoid issues with circular symbolic links, as in bug #339670.
+       follow_links = False
+
        if onerror is None:
                # Default behavior is to dump errors to stderr so they won't
                # go unnoticed.  Callers can pass in a quiet instance.
@@ -970,7 +973,8 @@ def apply_recursive_permissions(top, uid=-1, gid=-1,
        for dirpath, dirnames, filenames in os.walk(top):
                try:
                        applied = apply_secpass_permissions(dirpath,
-                               uid=uid, gid=gid, mode=dirmode, mask=dirmask)
+                               uid=uid, gid=gid, mode=dirmode, mask=dirmask,
+                               follow_links=follow_links)
                        if not applied:
                                all_applied = False
                except PortageException as e:
@@ -980,7 +984,8 @@ def apply_recursive_permissions(top, uid=-1, gid=-1,
                for name in filenames:
                        try:
                                applied = apply_secpass_permissions(os.path.join(dirpath, name),
-                                       uid=uid, gid=gid, mode=filemode, mask=filemask)
+                                       uid=uid, gid=gid, mode=filemode, mask=filemask,
+                                       follow_links=follow_links)
                                if not applied:
                                        all_applied = False
                        except PortageException as e: