]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-44289: Keep argument file object's current position in tarfile.is_tarfile (GH...
authorAndrzej Mateja <mateja.and@gmail.com>
Wed, 9 Feb 2022 16:19:16 +0000 (17:19 +0100)
committerGitHub <noreply@github.com>
Wed, 9 Feb 2022 16:19:16 +0000 (08:19 -0800)
Lib/tarfile.py
Lib/test/test_tarfile.py
Misc/NEWS.d/next/Library/2021-06-02-19-47-46.bpo-44289.xC5kuV.rst [new file with mode: 0644]

index e187da2b1994a6b65c3c73e851319135f5ce8cf8..e795100158748f81b59f73066c7fac6fd4efba0f 100755 (executable)
@@ -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()
index 1357df57eb1797d9789cede9500efbdff4bb35a2..66c1931451748d294912a43c084cb4cee4846c11 100644 (file)
@@ -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 (file)
index 0000000..164138f
--- /dev/null
@@ -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`.