closes bpo-34540: Convert shutil._call_external_zip to use subprocess rather than distutils.spawn. (GH-8985)
This commit is contained in:
parent
491740f116
commit
d8b103b8b3
|
@ -413,17 +413,21 @@ def _make_tarball(base_name, base_dir, compress="gzip", verbose=0, dry_run=0,
|
|||
|
||||
return archive_name
|
||||
|
||||
def _call_external_zip(base_dir, zip_filename, verbose=False, dry_run=False):
|
||||
def _call_external_zip(base_dir, zip_filename, verbose, dry_run, logger):
|
||||
# XXX see if we want to keep an external call here
|
||||
if verbose:
|
||||
zipoptions = "-r"
|
||||
else:
|
||||
zipoptions = "-rq"
|
||||
from distutils.errors import DistutilsExecError
|
||||
from distutils.spawn import spawn
|
||||
cmd = ["zip", zipoptions, zip_filename, base_dir]
|
||||
if logger is not None:
|
||||
logger.info(' '.join(cmd))
|
||||
if dry_run:
|
||||
return
|
||||
import subprocess
|
||||
try:
|
||||
spawn(["zip", zipoptions, zip_filename, base_dir], dry_run=dry_run)
|
||||
except DistutilsExecError:
|
||||
subprocess.check_call(cmd)
|
||||
except subprocess.CalledProcessError:
|
||||
# XXX really should distinguish between "couldn't find
|
||||
# external 'zip' command" and "zip failed".
|
||||
raise ExecError, \
|
||||
|
@ -458,7 +462,7 @@ def _make_zipfile(base_name, base_dir, verbose=0, dry_run=0, logger=None):
|
|||
zipfile = None
|
||||
|
||||
if zipfile is None:
|
||||
_call_external_zip(base_dir, zip_filename, verbose, dry_run)
|
||||
_call_external_zip(base_dir, zip_filename, verbose, dry_run, logger)
|
||||
else:
|
||||
if logger is not None:
|
||||
logger.info("creating '%s' and adding '%s' to it",
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
When ``shutil.make_archive`` falls back to the external ``zip`` problem, it
|
||||
uses :mod:`subprocess` to invoke it rather than :mod:`distutils.spawn`. This
|
||||
closes a possible shell injection vector.
|
Loading…
Reference in New Issue