Skip to content

Commit

Permalink
bpo-22831: Use "with" to avoid possible fd leaks in distutils. (GH-10921
Browse files Browse the repository at this point in the history
)
  • Loading branch information
serhiy-storchaka committed Dec 20, 2018
1 parent 71f82a2 commit c5d5dfd
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 69 deletions.
22 changes: 11 additions & 11 deletions Lib/distutils/archive_util.py
Expand Up @@ -166,21 +166,21 @@ def make_zipfile(base_name, base_dir, verbose=0, dry_run=0):
zip = zipfile.ZipFile(zip_filename, "w",
compression=zipfile.ZIP_STORED)

if base_dir != os.curdir:
path = os.path.normpath(os.path.join(base_dir, ''))
zip.write(path, path)
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, ''))
with zip:
if base_dir != os.curdir:
path = os.path.normpath(os.path.join(base_dir, ''))
zip.write(path, path)
log.info("adding '%s'", path)
for name in filenames:
path = os.path.normpath(os.path.join(dirpath, name))
if os.path.isfile(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)
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

Expand Down
24 changes: 12 additions & 12 deletions Lib/distutils/command/bdist_msi.py
Expand Up @@ -390,18 +390,18 @@ def add_scripts(self):
# entries for each version as the above code does
if self.pre_install_script:
scriptfn = os.path.join(self.bdist_dir, "preinstall.bat")
f = open(scriptfn, "w")
# The batch file will be executed with [PYTHON], so that %1
# is the path to the Python interpreter; %0 will be the path
# of the batch file.
# rem ="""
# %1 %0
# exit
# """
# <actual script>
f.write('rem ="""\n%1 %0\nexit\n"""\n')
f.write(open(self.pre_install_script).read())
f.close()
with open(scriptfn, "w") as f:
# The batch file will be executed with [PYTHON], so that %1
# is the path to the Python interpreter; %0 will be the path
# of the batch file.
# rem ="""
# %1 %0
# exit
# """
# <actual script>
f.write('rem ="""\n%1 %0\nexit\n"""\n')
with open(self.pre_install_script) as fin:
f.write(fin.read())
add_data(self.db, "Binary",
[("PreInstall", msilib.Binary(scriptfn))
])
Expand Down
36 changes: 17 additions & 19 deletions Lib/distutils/command/config.py
Expand Up @@ -106,15 +106,14 @@ def _check_compiler(self):

def _gen_temp_sourcefile(self, body, headers, lang):
filename = "_configtest" + LANG_EXT[lang]
file = open(filename, "w")
if headers:
for header in headers:
file.write("#include <%s>\n" % header)
file.write("\n")
file.write(body)
if body[-1] != "\n":
file.write("\n")
file.close()
with open(filename, "w") as file:
if headers:
for header in headers:
file.write("#include <%s>\n" % header)
file.write("\n")
file.write(body)
if body[-1] != "\n":
file.write("\n")
return filename

def _preprocess(self, body, headers, include_dirs, lang):
Expand Down Expand Up @@ -203,17 +202,16 @@ def search_cpp(self, pattern, body=None, headers=None, include_dirs=None,
if isinstance(pattern, str):
pattern = re.compile(pattern)

file = open(out)
match = False
while True:
line = file.readline()
if line == '':
break
if pattern.search(line):
match = True
break
with open(out) as file:
match = False
while True:
line = file.readline()
if line == '':
break
if pattern.search(line):
match = True
break

file.close()
self._clean()
return match

Expand Down
15 changes: 7 additions & 8 deletions Lib/distutils/command/sdist.py
Expand Up @@ -407,14 +407,13 @@ def read_manifest(self):
distribution.
"""
log.info("reading manifest file '%s'", self.manifest)
manifest = open(self.manifest)
for line in manifest:
# ignore comments and blank lines
line = line.strip()
if line.startswith('#') or not line:
continue
self.filelist.append(line)
manifest.close()
with open(self.manifest) as manifest:
for line in manifest:
# ignore comments and blank lines
line = line.strip()
if line.startswith('#') or not line:
continue
self.filelist.append(line)

def make_release_tree(self, base_dir, files):
"""Create the directory tree that will become the source
Expand Down
37 changes: 18 additions & 19 deletions Lib/distutils/util.py
Expand Up @@ -378,35 +378,34 @@ def byte_compile (py_files,
else:
script = open(script_name, "w")

script.write("""\
with script:
script.write("""\
from distutils.util import byte_compile
files = [
""")

# XXX would be nice to write absolute filenames, just for
# safety's sake (script should be more robust in the face of
# chdir'ing before running it). But this requires abspath'ing
# 'prefix' as well, and that breaks the hack in build_lib's
# 'byte_compile()' method that carefully tacks on a trailing
# slash (os.sep really) to make sure the prefix here is "just
# right". This whole prefix business is rather delicate -- the
# problem is that it's really a directory, but I'm treating it
# as a dumb string, so trailing slashes and so forth matter.

#py_files = map(os.path.abspath, py_files)
#if prefix:
# prefix = os.path.abspath(prefix)

script.write(",\n".join(map(repr, py_files)) + "]\n")
script.write("""
# XXX would be nice to write absolute filenames, just for
# safety's sake (script should be more robust in the face of
# chdir'ing before running it). But this requires abspath'ing
# 'prefix' as well, and that breaks the hack in build_lib's
# 'byte_compile()' method that carefully tacks on a trailing
# slash (os.sep really) to make sure the prefix here is "just
# right". This whole prefix business is rather delicate -- the
# problem is that it's really a directory, but I'm treating it
# as a dumb string, so trailing slashes and so forth matter.

#py_files = map(os.path.abspath, py_files)
#if prefix:
# prefix = os.path.abspath(prefix)

script.write(",\n".join(map(repr, py_files)) + "]\n")
script.write("""
byte_compile(files, optimize=%r, force=%r,
prefix=%r, base_dir=%r,
verbose=%r, dry_run=0,
direct=1)
""" % (optimize, force, prefix, base_dir, verbose))

script.close()

cmd = [sys.executable]
cmd.extend(subprocess._optim_args_from_interpreter_flags())
cmd.append(script_name)
Expand Down

0 comments on commit c5d5dfd

Please sign in to comment.