Skip to content

Commit

Permalink
gh-122356: restore the position of a file-like object after `zipfile.…
Browse files Browse the repository at this point in the history
…is_zipfile` (#122397)
  • Loading branch information
picnixz authored Nov 24, 2024
1 parent 3d8ac48 commit e0ef08f
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 2 deletions.
10 changes: 8 additions & 2 deletions Lib/test/test_zipfile/test_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -1969,10 +1969,16 @@ def test_is_zip_valid_file(self):
zip_contents = fp.read()
# - passing a file-like object
fp = io.BytesIO()
fp.write(zip_contents)
end = fp.write(zip_contents)
self.assertEqual(fp.tell(), end)
mid = end // 2
fp.seek(mid, 0)
self.assertTrue(zipfile.is_zipfile(fp))
fp.seek(0, 0)
# check that the position is left unchanged after the call
# see: https://github.com/python/cpython/issues/122356
self.assertEqual(fp.tell(), mid)
self.assertTrue(zipfile.is_zipfile(fp))
self.assertEqual(fp.tell(), mid)

def test_non_existent_file_raises_OSError(self):
# make sure we don't raise an AttributeError when a partially-constructed
Expand Down
2 changes: 2 additions & 0 deletions Lib/zipfile/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,9 @@ def is_zipfile(filename):
result = False
try:
if hasattr(filename, "read"):
pos = filename.tell()
result = _check_zipfile(fp=filename)
filename.seek(pos)
else:
with open(filename, "rb") as fp:
result = _check_zipfile(fp)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Guarantee that the position of a file-like object passed to
:func:`zipfile.is_zipfile` is left untouched after the call.
Patch by Bénédikt Tran.

0 comments on commit e0ef08f

Please sign in to comment.