From: Zac Medico Date: Tue, 14 Dec 2010 03:47:27 +0000 (-0800) Subject: apply_recursive_permissions: don't follow symlink X-Git-Tag: v2.2.0_alpha9~6 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=31e8a00dae63f956cec892cecb016a511de122fc;p=portage.git apply_recursive_permissions: don't follow symlink 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' --- diff --git a/pym/portage/util/__init__.py b/pym/portage/util/__init__.py index 4db33498c..d180f6b7d 100644 --- a/pym/portage/util/__init__.py +++ b/pym/portage/util/__init__.py @@ -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: