Skip to content

Commit 128ab09

Browse files
authored
bpo-44289: Keep argument file object's current position in tarfile.is_tarfile (GH-26488)
1 parent d2d1d49 commit 128ab09

File tree

3 files changed

+15
-0
lines changed

3 files changed

+15
-0
lines changed

Lib/tarfile.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2493,7 +2493,9 @@ def is_tarfile(name):
24932493
"""
24942494
try:
24952495
if hasattr(name, "read"):
2496+
pos = name.tell()
24962497
t = open(fileobj=name)
2498+
name.seek(pos)
24972499
else:
24982500
t = open(name)
24992501
t.close()

Lib/test/test_tarfile.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,18 @@ def test_is_tarfile_valid(self):
375375
with open(self.tarname, "rb") as fobj:
376376
self.assertTrue(tarfile.is_tarfile(io.BytesIO(fobj.read())))
377377

378+
def test_is_tarfile_keeps_position(self):
379+
# Test for issue44289: tarfile.is_tarfile() modifies
380+
# file object's current position
381+
with open(self.tarname, "rb") as fobj:
382+
tarfile.is_tarfile(fobj)
383+
self.assertEqual(fobj.tell(), 0)
384+
385+
with open(self.tarname, "rb") as fobj:
386+
file_like = io.BytesIO(fobj.read())
387+
tarfile.is_tarfile(file_like)
388+
self.assertEqual(file_like.tell(), 0)
389+
378390
def test_empty_tarfile(self):
379391
# Test for issue6123: Allow opening empty archives.
380392
# This test checks if tarfile.open() is able to open an empty tar
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix an issue with :meth:`~tarfile.is_tarfile` method when using *fileobj* argument: position in the *fileobj* was advanced forward which made it unreadable with :meth:`tarfile.TarFile.open`.

0 commit comments

Comments
 (0)