Hello,

Please see attached tarkill.tar.gz and buildout profile.

This tarball containts dead link:
ls -l tarkill
lrwxrwxrwx 1 luke users 4 2010-11-18 19:56 kill -> kill

After running attached buildout profile and having python shell
setuptools will enter infinite loop:

>>> import sys
>>> sys.version_info
sys.version_info(major=2, minor=7, micro=0, releaselevel='final', serial=0)
>>> import tempfile
>>> import setuptools.archive_util
>>> tempdir = tempfile.mkdtemp()
>>> setuptools.archive_util.unpack_archive('tarkill.tar.gz', tempdir)
^CTraceback (most recent call last):
  File "<console>", line 1, in <module>
  File 
"/srv/home/luke/python2.7/setup/eggs/setuptools-0.6c12dev_r85381-py2.7.egg/setuptools/archive_util.py",
line 67, in unpack_archive
    driver(filename, extract_dir, progress_filter)
  File 
"/srv/home/luke/python2.7/setup/eggs/setuptools-0.6c12dev_r85381-py2.7.egg/setuptools/archive_util.py",
line 190, in unpack_tarfile
    member = tarobj._getmember(linkpath)
  File "/srv/home/luke/python2.7/parts/python2.7/lib/python2.7/tarfile.py",
line 2357, in _getmember
    members = self.getmembers()
  File "/srv/home/luke/python2.7/parts/python2.7/lib/python2.7/tarfile.py",
line 1801, in getmembers
    self._check()
KeyboardInterrupt

Attached workaround which breaks the loop, but I think that such
deadlink shall be created, just like tar does it.

Regards,
Luke
-- 
Łukasz Nowak IT Specialist [email protected] http://lnowak.com/
Skype: Shufla jid: [email protected] gg: 1157726
``Use the Source, Luke...''

Attachment: buildout.cfg
Description: Binary data

diff -ur setuptools-0.6c12dev_r85381-py2.7.egg.orig/setuptools/archive_util.py setuptools-0.6c12dev_r85381-py2.7.egg/setuptools/archive_util.py
--- setuptools-0.6c12dev_r85381-py2.7.egg.orig/setuptools/archive_util.py	2010-11-18 19:54:36.978922115 +0000
+++ setuptools-0.6c12dev_r85381-py2.7.egg/setuptools/archive_util.py	2010-11-18 20:04:41.523054803 +0000
@@ -187,6 +187,10 @@
                     if member.issym():
                         linkpath = posixpath.join(posixpath.dirname(member.name), linkpath)
                         linkpath = posixpath.normpath(linkpath)
+                        if member.name == linkpath:
+                            # *BAD* workaround for bad archives with deadlinks file -> file
+                            member = None
+                            break
                     member = tarobj._getmember(linkpath)
     
                 if member is not None and (member.isfile() or member.isdir()):
Files setuptools-0.6c12dev_r85381-py2.7.egg.orig/setuptools/archive_util.pyc and setuptools-0.6c12dev_r85381-py2.7.egg/setuptools/archive_util.pyc differ

Attachment: tarkill.tar.gz
Description: GNU Zip compressed data

_______________________________________________
Distutils-SIG maillist  -  [email protected]
http://mail.python.org/mailman/listinfo/distutils-sig

Reply via email to