SF #857297 and 916874, improve handling of hard links when extracting
This commit is contained in:
parent
0662f8a5ea
commit
a4f651a2ae
|
@ -1294,6 +1294,10 @@ class TarFile(object):
|
|||
else:
|
||||
tarinfo = self.getmember(member)
|
||||
|
||||
# Prepare the link target for makelink().
|
||||
if tarinfo.islnk():
|
||||
tarinfo._link_target = os.path.join(path, tarinfo.linkname)
|
||||
|
||||
try:
|
||||
self._extract_member(tarinfo, os.path.join(path, tarinfo.name))
|
||||
except EnvironmentError, e:
|
||||
|
@ -1466,7 +1470,8 @@ class TarFile(object):
|
|||
if tarinfo.issym():
|
||||
os.symlink(linkpath, targetpath)
|
||||
else:
|
||||
os.link(linkpath, targetpath)
|
||||
# See extract().
|
||||
os.link(tarinfo._link_target, targetpath)
|
||||
except AttributeError:
|
||||
if tarinfo.issym():
|
||||
linkpath = os.path.join(os.path.dirname(tarinfo.name),
|
||||
|
|
|
@ -293,6 +293,24 @@ class WriteGNULongTest(unittest.TestCase):
|
|||
self._test(("longnam/" * 127) + "longname_",
|
||||
("longlnk/" * 127) + "longlink_")
|
||||
|
||||
class ExtractHardlinkTest(BaseTest):
|
||||
|
||||
def test_hardlink(self):
|
||||
"""Test hardlink extraction (bug #857297)
|
||||
"""
|
||||
# Prevent errors from being caught
|
||||
self.tar.errorlevel = 1
|
||||
|
||||
self.tar.extract("0-REGTYPE", dirname())
|
||||
try:
|
||||
# Extract 1-LNKTYPE which is a hardlink to 0-REGTYPE
|
||||
self.tar.extract("1-LNKTYPE", dirname())
|
||||
except EnvironmentError, e:
|
||||
import errno
|
||||
if e.errno == errno.ENOENT:
|
||||
self.fail("hardlink not extracted properly")
|
||||
|
||||
|
||||
# Gzip TestCases
|
||||
class ReadTestGzip(ReadTest):
|
||||
comp = "gz"
|
||||
|
@ -337,6 +355,9 @@ def test_main():
|
|||
WriteGNULongTest,
|
||||
]
|
||||
|
||||
if hasattr(os, "link"):
|
||||
tests.append(ExtractHardlinkTest)
|
||||
|
||||
if gzip:
|
||||
tests.extend([
|
||||
ReadTestGzip, ReadStreamTestGzip,
|
||||
|
|
Loading…
Reference in New Issue