diff options
author | Andreas Fischer <bantu@owncloud.com> | 2014-02-18 12:57:44 +0100 |
---|---|---|
committer | Andreas Fischer <bantu@owncloud.com> | 2014-05-29 16:26:02 +0200 |
commit | 0417e52134e87c379b3b4c22a53a0c06a711baef (patch) | |
tree | 6677630fd4b4e9b94f8fd02a8b399b2fea142f07 | |
parent | fb4556033a9d39698dbc15b59f3ba76ef6510e33 (diff) | |
download | nextcloud-server-0417e52134e87c379b3b4c22a53a0c06a711baef.tar.gz nextcloud-server-0417e52134e87c379b3b4c22a53a0c06a711baef.zip |
Increase file size limit from 2 GiB to 4 GiB when workarounds are unavailable.
-rw-r--r-- | lib/private/files/storage/local.php | 5 | ||||
-rw-r--r-- | lib/private/files/storage/mappedlocal.php | 5 | ||||
-rw-r--r-- | lib/private/largefilehelper.php | 23 | ||||
-rw-r--r-- | 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 f4bc5085364..e33747bbd52 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 f38b48db5de..ea4deaa66e8 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 08869d7c82a..3d15e786042 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 001f636a52a..699dd6891ad 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) + ); + } } |