From cb2a6d688fd48e9f4f903df0d45bfaf184b3e08f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= Date: Mon, 4 Sep 2023 14:56:06 +0200 Subject: [PATCH] Detect aborted connection in OC\Files\View and stop writing data to the output buffer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Côme Chilliet --- lib/private/Files/View.php | 12 ++++++++++-- lib/private/legacy/OC_Files.php | 3 --- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/lib/private/Files/View.php b/lib/private/Files/View.php index 28b2cf67640..a6b802ffe85 100644 --- a/lib/private/Files/View.php +++ b/lib/private/Files/View.php @@ -428,6 +428,7 @@ class View { $chunkSize = 524288; // 512 kB chunks while (!feof($handle)) { echo fread($handle, $chunkSize); + $this->checkConnectionStatus(); flush(); } fclose($handle); @@ -480,6 +481,7 @@ class View { $len = $chunkSize; } echo fread($handle, $len); + $this->checkConnectionStatus(); flush(); } return ftell($handle) - $from; @@ -490,6 +492,14 @@ class View { return false; } + + private function checkConnectionStatus(): void { + $connectionStatus = \connection_status(); + if ($connectionStatus !== 0) { + throw new \RuntimeException("Connection lost. Status: $connectionStatus"); + } + } + /** * @param string $path * @return mixed @@ -1053,7 +1063,6 @@ class View { public function fromTmpFile($tmpFile, $path) { $this->assertPathLength($path); if (Filesystem::isValidPath($path)) { - // Get directory that the file is going into $filePath = dirname($path); @@ -1809,7 +1818,6 @@ class View { * @return boolean */ private function targetIsNotShared(IStorage $targetStorage, string $targetInternalPath) { - // note: cannot use the view because the target is already locked $fileId = (int)$targetStorage->getCache()->getId($targetInternalPath); if ($fileId === -1) { diff --git a/lib/private/legacy/OC_Files.php b/lib/private/legacy/OC_Files.php index 6a3a44d6cc0..48e36dac2ce 100644 --- a/lib/private/legacy/OC_Files.php +++ b/lib/private/legacy/OC_Files.php @@ -238,9 +238,6 @@ class OC_Files { OC::$server->getLogger()->logException($ex); $l = \OC::$server->getL10N('lib'); $hint = method_exists($ex, 'getHint') ? $ex->getHint() : ''; - if ($event && $event->getErrorMessage() !== null) { - $hint .= ' ' . $event->getErrorMessage(); - } \OC_Template::printErrorPage($l->t('Cannot download file'), $hint, 200); } }