diff options
author | Lars Gustäbel <lars@gustaebel.de> | 2015-07-06 07:23:04 (GMT) |
---|---|---|
committer | Lars Gustäbel <lars@gustaebel.de> | 2015-07-06 07:23:04 (GMT) |
commit | 518602ab11578d74df1f141fe342e4082ac99875 (patch) | |
tree | fb5a0304a086f63c6e4d03a6217a6afd511bf0e8 /Lib/tarfile.py | |
parent | e6f87fcfa1f8f4606d5ca3798e8663bacb84c2ba (diff) | |
download | cpython-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.py | 17 |
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: |