summaryrefslogtreecommitdiffstats
path: root/Lib/tarfile.py
diff options
context:
space:
mode:
authorLars Gustäbel <lars@gustaebel.de>2015-07-06 07:23:04 (GMT)
committerLars Gustäbel <lars@gustaebel.de>2015-07-06 07:23:04 (GMT)
commit518602ab11578d74df1f141fe342e4082ac99875 (patch)
treefb5a0304a086f63c6e4d03a6217a6afd511bf0e8 /Lib/tarfile.py
parente6f87fcfa1f8f4606d5ca3798e8663bacb84c2ba (diff)
downloadcpython-518602ab11578d74df1f141fe342e4082ac99875.zip
cpython-518602ab11578d74df1f141fe342e4082ac99875.tar.gz
cpython-518602ab11578d74df1f141fe342e4082ac99875.tar.bz2
Issue #24259: tarfile now raises a ReadError if an archive is truncated inside a data segment.
Diffstat (limited to 'Lib/tarfile.py')
-rw-r--r--Lib/tarfile.py17
1 files changed, 14 insertions, 3 deletions
diff --git a/Lib/tarfile.py b/Lib/tarfile.py
index d7c1500..66e5393 100644
--- a/Lib/tarfile.py
+++ b/Lib/tarfile.py
@@ -744,12 +744,18 @@ class _FileInFile(object):
else:
return self.readsparse(size)
+ def __read(self, size):
+ buf = self.fileobj.read(size)
+ if len(buf) != size:
+ raise ReadError("unexpected end of data")
+ return buf
+
def readnormal(self, size):
"""Read operation for regular files.
"""
self.fileobj.seek(self.offset + self.position)
self.position += size
- return self.fileobj.read(size)
+ return self.__read(size)
def readsparse(self, size):
"""Read operation for sparse files.
@@ -777,7 +783,7 @@ class _FileInFile(object):
realpos = section.realpos + self.position - section.offset
self.fileobj.seek(self.offset + realpos)
self.position += size
- return self.fileobj.read(size)
+ return self.__read(size)
else:
self.position += size
return NUL * size
@@ -2336,8 +2342,13 @@ class TarFile(object):
self.firstmember = None
return m
+ # Advance the file pointer.
+ if self.offset != self.fileobj.tell():
+ self.fileobj.seek(self.offset - 1)
+ if not self.fileobj.read(1):
+ raise ReadError("unexpected end of data")
+
# Read the next block.
- self.fileobj.seek(self.offset)
tarinfo = None
while True:
try: