From: Morris Jobke Date: Thu, 26 Oct 2017 14:47:54 +0000 (+0200) Subject: Fix seeking on object storage X-Git-Tag: v12.0.4RC1~29^2 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=d459351ce28b57cce188c8000d970a43b9c14530;p=nextcloud-server.git Fix seeking on object storage Seeking is not needed if the $from is 0, because then the pointer is already at the correct position. Additionally another fallback is added, that if the fseek fails it just uses an fread to skip the beginning of the file until it is at the correct position. This skipping is done with a chunked fread. Signed-off-by: Morris Jobke --- diff --git a/lib/private/Files/View.php b/lib/private/Files/View.php index da1c67471ab..659f747a9c5 100644 --- a/lib/private/Files/View.php +++ b/lib/private/Files/View.php @@ -456,8 +456,28 @@ class View { @ob_end_clean(); $handle = $this->fopen($path, 'rb'); if ($handle) { - if (fseek($handle, $from) === 0) { - $chunkSize = 8192; // 8 kB chunks + $chunkSize = 8192; // 8 kB chunks + $startReading = true; + + if ($from !== 0 && $from !== '0' && fseek($handle, $from) !== 0) { + // forward file handle via chunked fread because fseek seem to have failed + + $end = $from + 1; + while (!feof($handle) && ftell($handle) < $end) { + $len = $from - ftell($handle); + if ($len > $chunkSize) { + $len = $chunkSize; + } + $result = fread($handle, $len); + + if ($result === false) { + $startReading = false; + break; + } + } + } + + if ($startReading) { $end = $to + 1; while (!feof($handle) && ftell($handle) < $end) { $len = $end - ftell($handle);