Patch #1338314, Bug #1336623: fix tarfile so it can extract

REGTYPE directories from tarfiles written by old programs.

Will backport.
This commit is contained in:
Neal Norwitz 2005-10-28 05:52:22 +00:00
parent 466e5b336e
commit f339654280
3 changed files with 39 additions and 5 deletions

View File

@ -739,6 +739,11 @@ class TarInfo(object):
tarinfo.devmajor = tarinfo.devmajor = 0
tarinfo.prefix = buf[345:500]
# Some old tar programs represent a directory as a regular
# file with a trailing slash.
if tarinfo.isreg() and tarinfo.name.endswith("/"):
tarinfo.type = DIRTYPE
# The prefix field is used for filenames > 100 in
# the POSIX standard.
# name = prefix + '/' + name
@ -746,7 +751,7 @@ class TarInfo(object):
tarinfo.name = normpath(os.path.join(nts(tarinfo.prefix), tarinfo.name))
# Directory names should have a '/' at the end.
if tarinfo.isdir() and tarinfo.name[-1:] != "/":
if tarinfo.isdir():
tarinfo.name += "/"
return tarinfo
@ -1716,10 +1721,6 @@ class TarFile(object):
# Skip the following data blocks.
self.offset += self._block(tarinfo.size)
if tarinfo.isreg() and tarinfo.name[:-1] == "/":
# some old tar programs don't know DIRTYPE
tarinfo.type = DIRTYPE
self.members.append(tarinfo)
return tarinfo

View File

@ -144,6 +144,36 @@ class ReadTest(BaseTest):
"readlines() after seek failed")
fobj.close()
def test_old_dirtype(self):
"""Test old style dirtype member (bug #1336623).
"""
# Old tars create directory members using a REGTYPE
# header with a "/" appended to the filename field.
# Create an old tar style directory entry.
filename = tmpname()
tarinfo = tarfile.TarInfo("directory/")
tarinfo.type = tarfile.REGTYPE
fobj = file(filename, "w")
fobj.write(tarinfo.tobuf())
fobj.close()
try:
# Test if it is still a directory entry when
# read back.
tar = tarfile.open(filename)
tarinfo = tar.getmembers()[0]
tar.close()
self.assert_(tarinfo.type == tarfile.DIRTYPE)
self.assert_(tarinfo.name.endswith("/"))
finally:
try:
os.unlink(filename)
except:
pass
class ReadStreamTest(ReadTest):
sep = "|"

View File

@ -177,6 +177,9 @@ Core and builtins
Extension Modules
-----------------
- Patch #1338314, Bug #1336623: fix tarfile so it can extract
REGTYPE directories from tarfiles written by old programs.
- Get bsddb module to build with BSD DB version 3.2
- Patch #1309009, Fix segfault in pyexpat when the XML document is in latin_1,