bpo-22831: Use "with" to avoid possible fd leaks in distutils. (GH-10921)

This commit is contained in:
Serhiy Storchaka 2018-12-20 19:00:14 +02:00 committed by GitHub
parent 71f82a2f20
commit c5d5dfdb22
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 63 additions and 67 deletions

View File

@ -166,21 +166,21 @@ def make_zipfile(base_name, base_dir, verbose=0, dry_run=0):
zip = zipfile.ZipFile(zip_filename, "w", zip = zipfile.ZipFile(zip_filename, "w",
compression=zipfile.ZIP_STORED) compression=zipfile.ZIP_STORED)
if base_dir != os.curdir: with zip:
path = os.path.normpath(os.path.join(base_dir, '')) if base_dir != os.curdir:
zip.write(path, path) path = os.path.normpath(os.path.join(base_dir, ''))
log.info("adding '%s'", path)
for dirpath, dirnames, filenames in os.walk(base_dir):
for name in dirnames:
path = os.path.normpath(os.path.join(dirpath, name, ''))
zip.write(path, path) zip.write(path, path)
log.info("adding '%s'", path) log.info("adding '%s'", path)
for name in filenames: for dirpath, dirnames, filenames in os.walk(base_dir):
path = os.path.normpath(os.path.join(dirpath, name)) for name in dirnames:
if os.path.isfile(path): path = os.path.normpath(os.path.join(dirpath, name, ''))
zip.write(path, path) zip.write(path, path)
log.info("adding '%s'", path) log.info("adding '%s'", path)
zip.close() for name in filenames:
path = os.path.normpath(os.path.join(dirpath, name))
if os.path.isfile(path):
zip.write(path, path)
log.info("adding '%s'", path)
return zip_filename return zip_filename

View File

@ -390,18 +390,18 @@ class bdist_msi(Command):
# entries for each version as the above code does # entries for each version as the above code does
if self.pre_install_script: if self.pre_install_script:
scriptfn = os.path.join(self.bdist_dir, "preinstall.bat") scriptfn = os.path.join(self.bdist_dir, "preinstall.bat")
f = open(scriptfn, "w") with open(scriptfn, "w") as f:
# The batch file will be executed with [PYTHON], so that %1 # The batch file will be executed with [PYTHON], so that %1
# is the path to the Python interpreter; %0 will be the path # is the path to the Python interpreter; %0 will be the path
# of the batch file. # of the batch file.
# rem =""" # rem ="""
# %1 %0 # %1 %0
# exit # exit
# """ # """
# <actual script> # <actual script>
f.write('rem ="""\n%1 %0\nexit\n"""\n') f.write('rem ="""\n%1 %0\nexit\n"""\n')
f.write(open(self.pre_install_script).read()) with open(self.pre_install_script) as fin:
f.close() f.write(fin.read())
add_data(self.db, "Binary", add_data(self.db, "Binary",
[("PreInstall", msilib.Binary(scriptfn)) [("PreInstall", msilib.Binary(scriptfn))
]) ])

View File

@ -106,15 +106,14 @@ class config(Command):
def _gen_temp_sourcefile(self, body, headers, lang): def _gen_temp_sourcefile(self, body, headers, lang):
filename = "_configtest" + LANG_EXT[lang] filename = "_configtest" + LANG_EXT[lang]
file = open(filename, "w") with open(filename, "w") as file:
if headers: if headers:
for header in headers: for header in headers:
file.write("#include <%s>\n" % header) file.write("#include <%s>\n" % header)
file.write("\n") file.write("\n")
file.write(body) file.write(body)
if body[-1] != "\n": if body[-1] != "\n":
file.write("\n") file.write("\n")
file.close()
return filename return filename
def _preprocess(self, body, headers, include_dirs, lang): def _preprocess(self, body, headers, include_dirs, lang):
@ -203,17 +202,16 @@ class config(Command):
if isinstance(pattern, str): if isinstance(pattern, str):
pattern = re.compile(pattern) pattern = re.compile(pattern)
file = open(out) with open(out) as file:
match = False match = False
while True: while True:
line = file.readline() line = file.readline()
if line == '': if line == '':
break break
if pattern.search(line): if pattern.search(line):
match = True match = True
break break
file.close()
self._clean() self._clean()
return match return match

View File

@ -407,14 +407,13 @@ class sdist(Command):
distribution. distribution.
""" """
log.info("reading manifest file '%s'", self.manifest) log.info("reading manifest file '%s'", self.manifest)
manifest = open(self.manifest) with open(self.manifest) as manifest:
for line in manifest: for line in manifest:
# ignore comments and blank lines # ignore comments and blank lines
line = line.strip() line = line.strip()
if line.startswith('#') or not line: if line.startswith('#') or not line:
continue continue
self.filelist.append(line) self.filelist.append(line)
manifest.close()
def make_release_tree(self, base_dir, files): def make_release_tree(self, base_dir, files):
"""Create the directory tree that will become the source """Create the directory tree that will become the source

View File

@ -378,35 +378,34 @@ def byte_compile (py_files,
else: else:
script = open(script_name, "w") script = open(script_name, "w")
script.write("""\ with script:
script.write("""\
from distutils.util import byte_compile from distutils.util import byte_compile
files = [ files = [
""") """)
# XXX would be nice to write absolute filenames, just for # XXX would be nice to write absolute filenames, just for
# safety's sake (script should be more robust in the face of # safety's sake (script should be more robust in the face of
# chdir'ing before running it). But this requires abspath'ing # chdir'ing before running it). But this requires abspath'ing
# 'prefix' as well, and that breaks the hack in build_lib's # 'prefix' as well, and that breaks the hack in build_lib's
# 'byte_compile()' method that carefully tacks on a trailing # 'byte_compile()' method that carefully tacks on a trailing
# slash (os.sep really) to make sure the prefix here is "just # slash (os.sep really) to make sure the prefix here is "just
# right". This whole prefix business is rather delicate -- the # right". This whole prefix business is rather delicate -- the
# problem is that it's really a directory, but I'm treating it # problem is that it's really a directory, but I'm treating it
# as a dumb string, so trailing slashes and so forth matter. # as a dumb string, so trailing slashes and so forth matter.
#py_files = map(os.path.abspath, py_files) #py_files = map(os.path.abspath, py_files)
#if prefix: #if prefix:
# prefix = os.path.abspath(prefix) # prefix = os.path.abspath(prefix)
script.write(",\n".join(map(repr, py_files)) + "]\n") script.write(",\n".join(map(repr, py_files)) + "]\n")
script.write(""" script.write("""
byte_compile(files, optimize=%r, force=%r, byte_compile(files, optimize=%r, force=%r,
prefix=%r, base_dir=%r, prefix=%r, base_dir=%r,
verbose=%r, dry_run=0, verbose=%r, dry_run=0,
direct=1) direct=1)
""" % (optimize, force, prefix, base_dir, verbose)) """ % (optimize, force, prefix, base_dir, verbose))
script.close()
cmd = [sys.executable] cmd = [sys.executable]
cmd.extend(subprocess._optim_args_from_interpreter_flags()) cmd.extend(subprocess._optim_args_from_interpreter_flags())
cmd.append(script_name) cmd.append(script_name)