Skip to content

Commit 1a27435

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 61b3484 commit 1a27435

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
@@ -1629,13 +1629,12 @@ def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs):
16291629
raise ValueError("mode must be 'r', 'w' or 'x'")
16301630

16311631
try:
1632-
import gzip
1633-
gzip.GzipFile
1634-
except (ImportError, AttributeError):
1632+
from gzip import GzipFile
1633+
except ImportError:
16351634
raise CompressionError("gzip module is not available")
16361635

16371636
try:
1638-
fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj)
1637+
fileobj = GzipFile(name, mode + "b", compresslevel, fileobj)
16391638
except OSError:
16401639
if fileobj is not None and mode == 'r':
16411640
raise ReadError("not a gzip file")
@@ -1663,12 +1662,11 @@ def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs):
16631662
raise ValueError("mode must be 'r', 'w' or 'x'")
16641663

16651664
try:
1666-
import bz2
1665+
from bz2 import BZ2File
16671666
except ImportError:
16681667
raise CompressionError("bz2 module is not available")
16691668

1670-
fileobj = bz2.BZ2File(fileobj or name, mode,
1671-
compresslevel=compresslevel)
1669+
fileobj = BZ2File(fileobj or name, mode, compresslevel=compresslevel)
16721670

16731671
try:
16741672
t = cls.taropen(name, mode, fileobj, **kwargs)
@@ -1692,15 +1690,15 @@ def xzopen(cls, name, mode="r", fileobj=None, preset=None, **kwargs):
16921690
raise ValueError("mode must be 'r', 'w' or 'x'")
16931691

16941692
try:
1695-
import lzma
1693+
from lzma import LZMAFile, LZMAError
16961694
except ImportError:
16971695
raise CompressionError("lzma module is not available")
16981696

1699-
fileobj = lzma.LZMAFile(fileobj or name, mode, preset=preset)
1697+
fileobj = LZMAFile(fileobj or name, mode, preset=preset)
17001698

17011699
try:
17021700
t = cls.taropen(name, mode, fileobj, **kwargs)
1703-
except (lzma.LZMAError, EOFError):
1701+
except (LZMAError, EOFError):
17041702
fileobj.close()
17051703
if mode == 'r':
17061704
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)