From 128ab092cad984b73a117f58fa0e9b4105051a04 Mon Sep 17 00:00:00 2001 From: Andrzej Mateja Date: Wed, 9 Feb 2022 17:19:16 +0100 Subject: [PATCH] bpo-44289: Keep argument file object's current position in tarfile.is_tarfile (GH-26488) --- Lib/tarfile.py | 2 ++ Lib/test/test_tarfile.py | 12 ++++++++++++ .../Library/2021-06-02-19-47-46.bpo-44289.xC5kuV.rst | 1 + 3 files changed, 15 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2021-06-02-19-47-46.bpo-44289.xC5kuV.rst diff --git a/Lib/tarfile.py b/Lib/tarfile.py index e187da2b199..e7951001587 100755 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -2493,7 +2493,9 @@ def is_tarfile(name): """ try: if hasattr(name, "read"): + pos = name.tell() t = open(fileobj=name) + name.seek(pos) else: t = open(name) t.close() diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index 1357df57eb1..66c19314517 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -375,6 +375,18 @@ class CommonReadTest(ReadTest): with open(self.tarname, "rb") as fobj: self.assertTrue(tarfile.is_tarfile(io.BytesIO(fobj.read()))) + def test_is_tarfile_keeps_position(self): + # Test for issue44289: tarfile.is_tarfile() modifies + # file object's current position + with open(self.tarname, "rb") as fobj: + tarfile.is_tarfile(fobj) + self.assertEqual(fobj.tell(), 0) + + with open(self.tarname, "rb") as fobj: + file_like = io.BytesIO(fobj.read()) + tarfile.is_tarfile(file_like) + self.assertEqual(file_like.tell(), 0) + def test_empty_tarfile(self): # Test for issue6123: Allow opening empty archives. # This test checks if tarfile.open() is able to open an empty tar diff --git a/Misc/NEWS.d/next/Library/2021-06-02-19-47-46.bpo-44289.xC5kuV.rst b/Misc/NEWS.d/next/Library/2021-06-02-19-47-46.bpo-44289.xC5kuV.rst new file mode 100644 index 00000000000..164138f47ae --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-06-02-19-47-46.bpo-44289.xC5kuV.rst @@ -0,0 +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`.