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.
This commit is contained in:
Serhiy Storchaka 2020-01-24 19:55:52 +02:00 committed by Ethan Furman
parent 656c45ec9a
commit 9017e0bd5e
2 changed files with 9 additions and 10 deletions

View File

@ -1655,13 +1655,12 @@ class TarFile(object):
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 @@ class TarFile(object):
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 @@ class TarFile(object):
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")

View File

@ -0,0 +1 @@
Fixed race condition in lazy imports in :mod:`tarfile`.