From a91d25dca65cdc6ddf87cff3a2e1f6a927d36a36 Mon Sep 17 00:00:00 2001 From: Jan Tojnar Date: Fri, 31 Dec 2021 23:40:32 +0100 Subject: [PATCH 1/3] Console: close tty detection process --- src/Symfony/Component/Console/Cursor.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Console/Cursor.php b/src/Symfony/Component/Console/Cursor.php index dcb5b5ad39854..b9e2341829657 100644 --- a/src/Symfony/Component/Console/Cursor.php +++ b/src/Symfony/Component/Console/Cursor.php @@ -145,7 +145,14 @@ public function getCurrentPosition(): array static $isTtySupported; if (null === $isTtySupported && \function_exists('proc_open')) { - $isTtySupported = (bool) @proc_open('echo 1 >/dev/null', [['file', '/dev/tty', 'r'], ['file', '/dev/tty', 'w'], ['file', '/dev/tty', 'w']], $pipes); + $handle = @proc_open('echo 1 >/dev/null', [['file', '/dev/tty', 'r'], ['file', '/dev/tty', 'w'], ['file', '/dev/tty', 'w']], $pipes); + $isTtySupported = (bool) $handle; + if (false !== $handle) { + fclose($pipes[0]); + fclose($pipes[1]); + fclose($pipes[2]); + proc_close($handle); + } } if (!$isTtySupported) { From 38c35835c90620ec413e831f16e3b73b92d2007b Mon Sep 17 00:00:00 2001 From: Jan Tojnar Date: Fri, 31 Dec 2021 23:42:13 +0100 Subject: [PATCH 2/3] Console: close php://input handle --- src/Symfony/Component/Console/Cursor.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Console/Cursor.php b/src/Symfony/Component/Console/Cursor.php index b9e2341829657..776f44c2be5ba 100644 --- a/src/Symfony/Component/Console/Cursor.php +++ b/src/Symfony/Component/Console/Cursor.php @@ -20,11 +20,12 @@ final class Cursor { private $output; private $input; + private $inputResource = null; public function __construct(OutputInterface $output, $input = null) { $this->output = $output; - $this->input = $input ?? (\defined('STDIN') ? \STDIN : fopen('php://input', 'r+')); + $this->input = $input ?? (\defined('STDIN') ? \STDIN : $this->inputResource = fopen('php://input', 'r+')); } public function moveUp(int $lines = 1): self @@ -172,4 +173,11 @@ public function getCurrentPosition(): array return [$col, $row]; } + + public function __destruct() + { + if (null !== $this->inputResource) { + fclose($this->inputResource); + } + } } From 454ce55d26393833b824549c46cfb4a376d4536d Mon Sep 17 00:00:00 2001 From: Jan Tojnar Date: Sat, 1 Jan 2022 00:10:44 +0100 Subject: [PATCH 3/3] Process: close process handles --- src/Symfony/Component/Process/Process.php | 26 ++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Component/Process/Process.php b/src/Symfony/Component/Process/Process.php index 952cae2afc453..ad6e16b84cec4 100644 --- a/src/Symfony/Component/Process/Process.php +++ b/src/Symfony/Component/Process/Process.php @@ -1255,7 +1255,14 @@ public static function isTtySupported(): bool static $isTtySupported; if (null === $isTtySupported) { - $isTtySupported = (bool) @proc_open('echo 1 >/dev/null', [['file', '/dev/tty', 'r'], ['file', '/dev/tty', 'w'], ['file', '/dev/tty', 'w']], $pipes); + $handle = @proc_open('echo 1 >/dev/null', [['file', '/dev/tty', 'r'], ['file', '/dev/tty', 'w'], ['file', '/dev/tty', 'w']], $pipes); + $isTtySupported = (bool) $handle; + if (false !== $handle) { + fclose($pipes[0]); + fclose($pipes[1]); + fclose($pipes[2]); + proc_close($handle); + } } return $isTtySupported; @@ -1278,7 +1285,16 @@ public static function isPtySupported() return $result = false; } - return $result = (bool) @proc_open('echo 1 >/dev/null', [['pty'], ['pty'], ['pty']], $pipes); + $handle = @proc_open('echo 1 >/dev/null', [['pty'], ['pty'], ['pty']], $pipes); + $result = (bool) $handle; + if (false !== $handle) { + fclose($pipes[0]); + fclose($pipes[1]); + fclose($pipes[2]); + proc_close($handle); + } + + return $result; } /** @@ -1517,8 +1533,12 @@ private function doSignal(int $signal, bool $throwException): bool $ok = @proc_terminate($this->process, $signal); } elseif (\function_exists('posix_kill')) { $ok = @posix_kill($pid, $signal); - } elseif ($ok = proc_open(sprintf('kill -%d %d', $signal, $pid), [2 => ['pipe', 'w']], $pipes)) { + } elseif ($handle = proc_open(sprintf('kill -%d %d', $signal, $pid), [2 => ['pipe', 'w']], $pipes)) { $ok = false === fgets($pipes[2]); + fclose($pipes[2]); + proc_close($handle); + } else { + $ok = false; } if (!$ok) { if ($throwException) {