Skip to content

Commit

Permalink
Issue python#2304: Add additional quotes when using cmd shell on Wind…
Browse files Browse the repository at this point in the history
…ows. Original patch from Gabriel Genellina
  • Loading branch information
tjguk committed Aug 8, 2010
1 parent ab1280c commit 818afb5
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 5 deletions.
2 changes: 1 addition & 1 deletion Lib/subprocess.py
Original file line number Diff line number Diff line change
Expand Up @@ -829,7 +829,7 @@ def _execute_child(self, args, executable, preexec_fn, close_fds,
startupinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW
startupinfo.wShowWindow = _subprocess.SW_HIDE
comspec = os.environ.get("COMSPEC", "cmd.exe")
args = comspec + " /c " + args
args = comspec + " /c " + '"%s"' % args
if (_subprocess.GetVersion() >= 0x80000000 or
os.path.basename(comspec).lower() == "command.com"):
# Win9x, or using command.com on NT. We need to
Expand Down
54 changes: 50 additions & 4 deletions Lib/test/test_subprocess.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ def remove_stderr_debug_decorations(stderr):
return re.sub("\[\d+ refs\]\r?\n?$", "", stderr.decode()).encode()
#return re.sub(r"\[\d+ refs\]\r?\n?$", "", stderr)

class ProcessTestCase(unittest.TestCase):
class BaseTestCase(unittest.TestCase):
def setUp(self):
# Try to minimize the number of children we have so this test
# doesn't crash on some buildbots (Alphas in particular).
Expand All @@ -41,14 +41,15 @@ def tearDown(self):
if hasattr(support, "reap_children"):
support.reap_children()

def mkstemp(self):
def mkstemp(self, *args, **kwargs):
"""wrapper for mkstemp, calling mktemp if mkstemp is not available"""
if hasattr(tempfile, "mkstemp"):
return tempfile.mkstemp()
return tempfile.mkstemp(*args, **kwargs)
else:
fname = tempfile.mktemp()
fname = tempfile.mktemp(*args, **kwargs)
return os.open(fname, os.O_RDWR|os.O_CREAT), fname

class ProcessTestCase(BaseTestCase):
#
# Generic tests
#
Expand Down Expand Up @@ -863,6 +864,7 @@ def DISABLED_test_terminate(self):
p.terminate()
self.assertNotEqual(p.wait(), 0)


class CommandTests(unittest.TestCase):
# The module says:
# "NB This only works (and is only relevant) for UNIX."
Expand Down Expand Up @@ -893,6 +895,50 @@ def test_getoutput(self):

unit_tests = [ProcessTestCase, CommandTests]

if mswindows:
class CommandsWithSpaces (BaseTestCase):

def setUp(self):
super().setUp()
f, fname = self.mkstemp(".py", "te st")
self.fname = fname.lower ()
os.write(f, b"import sys;"
b"sys.stdout.write('%d %s' % (len(sys.argv), [a.lower () for a in sys.argv]))"
)
os.close(f)

def tearDown(self):
os.remove(self.fname)
super().tearDown()

def with_spaces(self, *args, **kwargs):
kwargs['stdout'] = subprocess.PIPE
p = subprocess.Popen(*args, **kwargs)
self.assertEqual(
p.stdout.read ().decode("mbcs"),
"2 [%r, 'ab cd']" % self.fname
)

def test_shell_string_with_spaces(self):
# call() function with string argument with spaces on Windows
self.with_spaces('"%s" "%s"' % (self.fname, "ab cd"), shell=1)

def test_shell_sequence_with_spaces(self):
# call() function with sequence argument with spaces on Windows
self.with_spaces([self.fname, "ab cd"], shell=1)

def test_noshell_string_with_spaces(self):
# call() function with string argument with spaces on Windows
self.with_spaces('"%s" "%s" "%s"' % (sys.executable, self.fname,
"ab cd"))

def test_noshell_sequence_with_spaces(self):
# call() function with sequence argument with spaces on Windows
self.with_spaces([sys.executable, self.fname, "ab cd"])

unit_tests.append(CommandsWithSpaces)


if getattr(subprocess, '_has_poll', False):
class ProcessTestCaseNoPoll(ProcessTestCase):
def setUp(self):
Expand Down

0 comments on commit 818afb5

Please sign in to comment.