Skip to content

Commit ea4a61f

Browse files
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. (cherry picked from commit 9017e0b) Co-authored-by: Serhiy Storchaka <[email protected]>
1 parent 0ea7309 commit ea4a61f

File tree

2 files changed

+9
-10
lines changed

2 files changed

+9
-10
lines changed

Lib/tarfile.py

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1655,13 +1655,12 @@ def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs):
16551655
raise ValueError("mode must be 'r', 'w' or 'x'")
16561656

16571657
try:
1658-
import gzip
1659-
gzip.GzipFile
1660-
except (ImportError, AttributeError):
1658+
from gzip import GzipFile
1659+
except ImportError:
16611660
raise CompressionError("gzip module is not available")
16621661

16631662
try:
1664-
fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj)
1663+
fileobj = GzipFile(name, mode + "b", compresslevel, fileobj)
16651664
except OSError:
16661665
if fileobj is not None and mode == 'r':
16671666
raise ReadError("not a gzip file")
@@ -1689,12 +1688,11 @@ def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs):
16891688
raise ValueError("mode must be 'r', 'w' or 'x'")
16901689

16911690
try:
1692-
import bz2
1691+
from bz2 import BZ2File
16931692
except ImportError:
16941693
raise CompressionError("bz2 module is not available")
16951694

1696-
fileobj = bz2.BZ2File(fileobj or name, mode,
1697-
compresslevel=compresslevel)
1695+
fileobj = BZ2File(fileobj or name, mode, compresslevel=compresslevel)
16981696

16991697
try:
17001698
t = cls.taropen(name, mode, fileobj, **kwargs)
@@ -1718,15 +1716,15 @@ def xzopen(cls, name, mode="r", fileobj=None, preset=None, **kwargs):
17181716
raise ValueError("mode must be 'r', 'w' or 'x'")
17191717

17201718
try:
1721-
import lzma
1719+
from lzma import LZMAFile, LZMAError
17221720
except ImportError:
17231721
raise CompressionError("lzma module is not available")
17241722

1725-
fileobj = lzma.LZMAFile(fileobj or name, mode, preset=preset)
1723+
fileobj = LZMAFile(fileobj or name, mode, preset=preset)
17261724

17271725
try:
17281726
t = cls.taropen(name, mode, fileobj, **kwargs)
1729-
except (lzma.LZMAError, EOFError):
1727+
except (LZMAError, EOFError):
17301728
fileobj.close()
17311729
if mode == 'r':
17321730
raise ReadError("not an lzma file")
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fixed race condition in lazy imports in :mod:`tarfile`.

0 commit comments

Comments
 (0)