From 0417e52134e87c379b3b4c22a53a0c06a711baef Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Tue, 18 Feb 2014 12:57:44 +0100 Subject: [PATCH] Increase file size limit from 2 GiB to 4 GiB when workarounds are unavailable. --- lib/private/files/storage/local.php | 5 +---- lib/private/files/storage/mappedlocal.php | 5 +---- lib/private/largefilehelper.php | 23 ++++++++++++++++++++++- tests/lib/largefilehelpergetfilesize.php | 7 +++++++ 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/lib/private/files/storage/local.php b/lib/private/files/storage/local.php index f4bc508536..e33747bbd5 100644 --- a/lib/private/files/storage/local.php +++ b/lib/private/files/storage/local.php @@ -112,10 +112,7 @@ if (\OC_Util::runningOnWindows()) { $fullPath = $this->datadir . $path; if (PHP_INT_SIZE === 4) { $helper = new \OC\LargeFileHelper; - $filesize = $helper->getFilesize($fullPath); - if (!is_null($filesize)) { - return $filesize; - } + return $helper->getFilesize($fullPath); } return filesize($fullPath); } diff --git a/lib/private/files/storage/mappedlocal.php b/lib/private/files/storage/mappedlocal.php index f38b48db5d..ea4deaa66e 100644 --- a/lib/private/files/storage/mappedlocal.php +++ b/lib/private/files/storage/mappedlocal.php @@ -134,10 +134,7 @@ class MappedLocal extends \OC\Files\Storage\Common { $fullPath = $this->buildPath($path); if (PHP_INT_SIZE === 4) { $helper = new \OC\LargeFileHelper; - $filesize = $helper->getFilesize($fullPath); - if (!is_null($filesize)) { - return $filesize; - } + return $helper->getFilesize($fullPath); } return filesize($fullPath); } diff --git a/lib/private/largefilehelper.php b/lib/private/largefilehelper.php index 08869d7c82..3d15e78604 100644 --- a/lib/private/largefilehelper.php +++ b/lib/private/largefilehelper.php @@ -83,7 +83,7 @@ class LargeFileHelper { if (!is_null($filesize)) { return $filesize; } - return null; + return $this->getFilesizeNative($filename); } /** @@ -159,6 +159,27 @@ class LargeFileHelper { return null; } + /** + * @brief Gets the filesize via a filesize() call and converts negative + * signed int to positive float. As the result of filesize() will + * wrap around after a filesize of 2^32 bytes = 4 GiB, this should + * only be used as a last resort. + * + * @param string $filename Path to the file. + * + * @return int|float Number of bytes as number (float or int). + */ + public function getFilesizeNative($filename) { + $result = filesize($filename); + if ($result < 0) { + // For filesizes between 2 GiB and 4 GiB, filesize() will return a + // negative int, as the PHP data type int is signed. Interpret the + // returned int as an unsigned integer and put it into a float. + return (float) sprintf('%u', $result); + } + return $result; + } + protected function exec($cmd) { $result = trim(exec($cmd)); return ctype_digit($result) ? 0 + $result : null; diff --git a/tests/lib/largefilehelpergetfilesize.php b/tests/lib/largefilehelpergetfilesize.php index 001f636a52..699dd6891a 100644 --- a/tests/lib/largefilehelpergetfilesize.php +++ b/tests/lib/largefilehelpergetfilesize.php @@ -59,4 +59,11 @@ class LargeFileHelperGetFilesize extends \PHPUnit_Framework_TestCase { $this->helper->getFilesizeViaExec($this->filename) ); } + + public function testGetFilesizeNative() { + $this->assertSame( + $this->filesize, + $this->helper->getFilesizeNative($this->filename) + ); + } }