Content-Length: 548799 | pFad | http://github.com/symfony/process/commit/1f07ae60a23f12edec74a58d91c509f73ce0c00e

56 [Process] Support finding executables independently of open_basedir · symfony/process@1f07ae6 · GitHub
Skip to content

Commit 1f07ae6

Browse files
BlackbitDevsnicolas-grekas
authored andcommitted
[Process] Support finding executables independently of open_basedir
1 parent 1276cfe commit 1f07ae6

File tree

4 files changed

+21
-38
lines changed

4 files changed

+21
-38
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ CHANGELOG
55
---
66

77
* Add `RunProcessMessage` and `RunProcessMessageHandler`
8+
* Support using `Process::findExecutable()` independently of `open_basedir`
89

910
5.2.0
1011
-----

ExecutableFinder.php

+13-19
Original file line numberDiff line numberDiff line change
@@ -50,25 +50,10 @@ public function addSuffix(string $suffix)
5050
*/
5151
public function find(string $name, string $default = null, array $extraDirs = []): ?string
5252
{
53-
if (\ini_get('open_basedir')) {
54-
$searchPath = array_merge(explode(\PATH_SEPARATOR, \ini_get('open_basedir')), $extraDirs);
55-
$dirs = [];
56-
foreach ($searchPath as $path) {
57-
// Silencing against https://bugs.php.net/69240
58-
if (@is_dir($path)) {
59-
$dirs[] = $path;
60-
} else {
61-
if (basename($path) == $name && @is_executable($path)) {
62-
return $path;
63-
}
64-
}
65-
}
66-
} else {
67-
$dirs = array_merge(
68-
explode(\PATH_SEPARATOR, getenv('PATH') ?: getenv('Path')),
69-
$extraDirs
70-
);
71-
}
53+
$dirs = array_merge(
54+
explode(\PATH_SEPARATOR, getenv('PATH') ?: getenv('Path')),
55+
$extraDirs
56+
);
7257

7358
$suffixes = [''];
7459
if ('\\' === \DIRECTORY_SEPARATOR) {
@@ -80,9 +65,18 @@ public function find(string $name, string $default = null, array $extraDirs = []
8065
if (@is_file($file = $dir.\DIRECTORY_SEPARATOR.$name.$suffix) && ('\\' === \DIRECTORY_SEPARATOR || @is_executable($file))) {
8166
return $file;
8267
}
68+
69+
if (!@is_dir($dir) && basename($dir) === $name.$suffix && @is_executable($dir)) {
70+
return $dir;
71+
}
8372
}
8473
}
8574

75+
$command = '\\' === \DIRECTORY_SEPARATOR ? 'where' : 'command -v';
76+
if (\function_exists('exec') && ($executablePath = strtok(@exec($command.' '.escapeshellarg($name)), \PHP_EOL)) && is_executable($executablePath)) {
77+
return $executablePath;
78+
}
79+
8680
return $default;
8781
}
8882
}

PhpExecutableFinder.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public function find(bool $includeArgs = true): string|false
3434
if ($php = getenv('PHP_BINARY')) {
3535
if (!is_executable($php)) {
3636
$command = '\\' === \DIRECTORY_SEPARATOR ? 'where' : 'command -v';
37-
if ($php = strtok(exec($command.' '.escapeshellarg($php)), \PHP_EOL)) {
37+
if (\function_exists('exec') && $php = strtok(exec($command.' '.escapeshellarg($php)), \PHP_EOL)) {
3838
if (!is_executable($php)) {
3939
return false;
4040
}

Tests/ExecutableFinderTest.php

+6-18
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,9 @@
1919
*/
2020
class ExecutableFinderTest extends TestCase
2121
{
22-
private string|false $path = false;
23-
2422
protected function tearDown(): void
2523
{
26-
if ($this->path) {
27-
// Restore path if it was changed.
28-
putenv('PATH='.$this->path);
29-
}
30-
}
31-
32-
private function setPath($path)
33-
{
34-
$this->path = getenv('PATH');
35-
putenv('PATH='.$path);
24+
putenv('PATH='.($_SERVER['PATH'] ?? $_SERVER['Path']));
3625
}
3726

3827
public function testFind()
@@ -41,7 +30,7 @@ public function testFind()
4130
$this->markTestSkipped('Cannot test when open_basedir is set');
4231
}
4332

44-
$this->setPath(\dirname(\PHP_BINARY));
33+
putenv('PATH='.\dirname(\PHP_BINARY));
4534

4635
$finder = new ExecutableFinder();
4736
$result = $finder->find($this->getPhpBinaryName());
@@ -57,7 +46,7 @@ public function testFindWithDefault()
5746

5847
$expected = 'defaultValue';
5948

60-
$this->setPath('');
49+
putenv('PATH=');
6150

6251
$finder = new ExecutableFinder();
6352
$result = $finder->find('foo', $expected);
@@ -71,7 +60,7 @@ public function testFindWithNullAsDefault()
7160
$this->markTestSkipped('Cannot test when open_basedir is set');
7261
}
7362

74-
$this->setPath('');
63+
putenv('PATH=');
7564

7665
$finder = new ExecutableFinder();
7766

@@ -86,7 +75,7 @@ public function testFindWithExtraDirs()
8675
$this->markTestSkipped('Cannot test when open_basedir is set');
8776
}
8877

89-
$this->setPath('');
78+
putenv('PATH=');
9079

9180
$extraDirs = [\dirname(\PHP_BINARY)];
9281

@@ -129,7 +118,6 @@ public function testFindProcessInOpenBasedir()
129118
$this->markTestSkipped('Cannot run test on windows');
130119
}
131120

132-
$this->setPath('');
133121
$this->iniSet('open_basedir', \PHP_BINARY.\PATH_SEPARATOR.'/');
134122

135123
$finder = new ExecutableFinder();
@@ -154,7 +142,7 @@ public function testFindBatchExecutableOnWindows()
154142

155143
$this->assertFalse(is_executable($target));
156144

157-
$this->setPath(sys_get_temp_dir());
145+
putenv('PATH='.sys_get_temp_dir());
158146

159147
$finder = new ExecutableFinder();
160148
$result = $finder->find(basename($target), false);

0 commit comments

Comments
 (0)








ApplySandwichStrip

pFad - (p)hone/(F)rame/(a)nonymizer/(d)eclutterfier!      Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

Fetched URL: http://github.com/symfony/process/commit/1f07ae60a23f12edec74a58d91c509f73ce0c00e

Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy