[Python-checkins] bpo-39430: Fix race condition in lazy imports in tarfile. (GH-18161)

Ethan Furman webhook-mailer at python.org
Fri Jan 24 12:56:13 EST 2020


https://github.com/python/cpython/commit/9017e0bd5e124ae6d2ed94b9e9cacb2e86270980
commit: 9017e0bd5e124ae6d2ed94b9e9cacb2e86270980
branch: master
author: Serhiy Storchaka <storchaka at gmail.com>
committer: Ethan Furman <ethan at stoneleaf.us>
date: 2020-01-24T09:55:52-08:00
summary:

bpo-39430: Fix race condition in lazy imports in tarfile. (GH-18161)

Use `from ... import ...` to ensure module is fully loaded before accessing its attributes.

files:
A Misc/NEWS.d/next/Library/2020-01-24-11-05-21.bpo-39430.I0UQzM.rst
M Lib/tarfile.py

diff --git a/Lib/tarfile.py b/Lib/tarfile.py
index d0b748cea1723..90a2c95b315b3 100755
--- a/Lib/tarfile.py
+++ b/Lib/tarfile.py
@@ -1655,13 +1655,12 @@ def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs):
             raise ValueError("mode must be 'r', 'w' or 'x'")
 
         try:
-            import gzip
-            gzip.GzipFile
-        except (ImportError, AttributeError):
+            from gzip import GzipFile
+        except ImportError:
             raise CompressionError("gzip module is not available")
 
         try:
-            fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj)
+            fileobj = GzipFile(name, mode + "b", compresslevel, fileobj)
         except OSError:
             if fileobj is not None and mode == 'r':
                 raise ReadError("not a gzip file")
@@ -1689,12 +1688,11 @@ def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs):
             raise ValueError("mode must be 'r', 'w' or 'x'")
 
         try:
-            import bz2
+            from bz2 import BZ2File
         except ImportError:
             raise CompressionError("bz2 module is not available")
 
-        fileobj = bz2.BZ2File(fileobj or name, mode,
-                              compresslevel=compresslevel)
+        fileobj = BZ2File(fileobj or name, mode, compresslevel=compresslevel)
 
         try:
             t = cls.taropen(name, mode, fileobj, **kwargs)
@@ -1718,15 +1716,15 @@ def xzopen(cls, name, mode="r", fileobj=None, preset=None, **kwargs):
             raise ValueError("mode must be 'r', 'w' or 'x'")
 
         try:
-            import lzma
+            from lzma import LZMAFile, LZMAError
         except ImportError:
             raise CompressionError("lzma module is not available")
 
-        fileobj = lzma.LZMAFile(fileobj or name, mode, preset=preset)
+        fileobj = LZMAFile(fileobj or name, mode, preset=preset)
 
         try:
             t = cls.taropen(name, mode, fileobj, **kwargs)
-        except (lzma.LZMAError, EOFError):
+        except (LZMAError, EOFError):
             fileobj.close()
             if mode == 'r':
                 raise ReadError("not an lzma file")
diff --git a/Misc/NEWS.d/next/Library/2020-01-24-11-05-21.bpo-39430.I0UQzM.rst b/Misc/NEWS.d/next/Library/2020-01-24-11-05-21.bpo-39430.I0UQzM.rst
new file mode 100644
index 0000000000000..712fc5d34bbe0
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2020-01-24-11-05-21.bpo-39430.I0UQzM.rst
@@ -0,0 +1 @@
+Fixed race condition in lazy imports in :mod:`tarfile`.



More information about the Python-checkins mailing list