Skip to content

Commit

Permalink
bug #22614 [Process] Fixed escaping arguments on Windows when inherit…
Browse files Browse the repository at this point in the history
…EnvironmentVariables is set to false (maryo)

This PR was merged into the 3.3 branch.

Discussion
----------

[Process]  Fixed escaping arguments on Windows when inheritEnvironmentVariables is set to false

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | no
| Fixed tickets |
| License       | MIT
| Doc PR        |

I've added a FAILING testcase on Windows. It incorrectly substitutes an argument containing a quotation mark probably assuming it's an env var needed to backup when inheritEnvironmentVariables is set to false.

Commits
-------

26032ef [Process] Fixed incorrectly escaping arguments on Windows when inheritEnvironmentVariables is set to false
  • Loading branch information
nicolas-grekas committed May 22, 2017
2 parents 1705eeb + 26032ef commit 82ec56b
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 6 deletions.
17 changes: 11 additions & 6 deletions src/Symfony/Component/Process/Process.php
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,7 @@ public function start(callable $callback = null/*, array $env = array()*/)
}
if ('\\' === DIRECTORY_SEPARATOR && $this->enhanceWindowsCompatibility) {
$this->options['bypass_shell'] = true;
$commandline = $this->prepareWindowsCommandLine($commandline, $envBackup);
$commandline = $this->prepareWindowsCommandLine($commandline, $envBackup, $env);
} elseif (!$this->useFileHandles && $this->enhanceSigchildCompatibility && $this->isSigchildEnabled()) {
// last exit code is output on the fourth pipe and caught to work around --enable-sigchild
$descriptors[3] = array('pipe', 'w');
Expand Down Expand Up @@ -1627,7 +1627,7 @@ private function doSignal($signal, $throwException)
return true;
}

private function prepareWindowsCommandLine($cmd, array &$envBackup)
private function prepareWindowsCommandLine($cmd, array &$envBackup, array &$env = null)
{
$uid = uniqid('', true);
$varCount = 0;
Expand All @@ -1640,7 +1640,7 @@ private function prepareWindowsCommandLine($cmd, array &$envBackup)
[^"%!^]*+
)++
)"/x',
function ($m) use (&$envBackup, &$varCache, &$varCount, $uid) {
function ($m) use (&$envBackup, &$env, &$varCache, &$varCount, $uid) {
if (isset($varCache[$m[0]])) {
return $varCache[$m[0]];
}
Expand All @@ -1652,10 +1652,15 @@ function ($m) use (&$envBackup, &$varCache, &$varCount, $uid) {
}

$value = str_replace(array('!LF!', '"^!"', '"^%"', '"^^"', '""'), array("\n", '!', '%', '^', '"'), $value);
$value = preg_replace('/(\\\\*)"/', '$1$1\\"', $value);

$value = '"'.preg_replace('/(\\\\*)"/', '$1$1\\"', $value).'"';
$var = $uid.++$varCount;
putenv("$var=\"$value\"");

if (null === $env) {
putenv("$var=$value");
} else {
$env[$var] = $value;
}

$envBackup[$var] = false;

return $varCache[$m[0]] = '!'.$var.'!';
Expand Down
13 changes: 13 additions & 0 deletions src/Symfony/Component/Process/Tests/ProcessTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -1465,6 +1465,19 @@ public function testEscapeArgument($arg)
$this->assertSame($arg, $p->getOutput());
}

/**
* @dataProvider provideEscapeArgument
* @group legacy
*/
public function testEscapeArgumentWhenInheritEnvDisabled($arg)
{
$p = new Process(array(self::$phpBin, '-r', 'echo $argv[1];', $arg), null, array('BAR' => 'BAZ'));
$p->inheritEnvironmentVariables(false);
$p->run();

$this->assertSame($arg, $p->getOutput());
}

public function provideEscapeArgument()
{
yield array('a"b%c%');
Expand Down

0 comments on commit 82ec56b

Please sign in to comment.