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:47:27 +0000 (19:47 -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 4db33498cc93e096ffe5d5a138ab89925b822645..d180f6b7dae37185dc5f35c5d19bdad32babf2d0 100644 (file)
@@ -989,6 +989,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.
@@ -1005,7 +1008,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:
@@ -1015,7 +1019,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: