Issue 23056: tarfile raises an exception when reading an empty tar in streaming mode (original) (raw)

$ cat >test.py <<EOF import tarfile import sys

with tarfile.open(sys.argv[1], mode="r|*") as f: while True: info = f.next() if not info: break EOF $ tar cf test.tar -T /dev/null $ python2.7 test.py test.tar Traceback (most recent call last): File "test.py", line 6, in info = f.next() File "/usr/lib/python2.7/tarfile.py", line 2319, in next self.fileobj.seek(self.offset) File "/usr/lib/python2.7/tarfile.py", line 555, in seek raise StreamError("seeking backwards is not allowed") tarfile.StreamError: seeking backwards is not allowed $ python3.4 test.py test.tar Traceback (most recent call last): File "test.py", line 6, in info = f.next() File "/usr/lib/python3.4/tarfile.py", line 2244, in next self.fileobj.seek(self.offset) File "/usr/lib/python3.4/tarfile.py", line 518, in seek raise StreamError("seeking backwards is not allowed") tarfile.StreamError: seeking backwards is not allowed

I have reconfirmed that the above still happens using a top of tree 2.7.9+ build.

2232 def next(self): 2233 """Return the next member of the archive as a TarInfo object, when 2234 TarFile is opened for reading. Return None if there is no more 2235 available. 2236 """ 2237 self._check("ra") 2238 if self.firstmember is not None: 2239 m = self.firstmember 2240 self.firstmember = None 2241 return m 2242 2243 # Read the next block. 2244 self.fileobj.seek(self.offset) 2245 tarinfo = None

raise a StreamError at #2244, It should catch this Error and return None. I would like to post a patch to fix it.