diff options
author | Vincent Petry <pvince81@owncloud.com> | 2013-10-25 12:09:46 +0200 |
---|---|---|
committer | Vincent Petry <pvince81@owncloud.com> | 2013-10-25 12:09:46 +0200 |
commit | d8b245490bf0e74156c66ca594977cbdb2920c4e (patch) | |
tree | cc971cb023b81d93684cc2a80a6807105ccdbaeb | |
parent | 5fd1f552a3de82c17f2ced20334888516d3fb9b7 (diff) | |
download | nextcloud-server-d8b245490bf0e74156c66ca594977cbdb2920c4e.tar.gz nextcloud-server-d8b245490bf0e74156c66ca594977cbdb2920c4e.zip |
Fixed quota stream's fseek method
- Added missing return statement
- Added missing support for SEEK_END
- Fixes #5524
-rw-r--r-- | lib/private/files/stream/quota.php | 14 | ||||
-rw-r--r-- | tests/lib/files/stream/quota.php | 72 |
2 files changed, 84 insertions, 2 deletions
diff --git a/lib/private/files/stream/quota.php b/lib/private/files/stream/quota.php index 53d8a03d30f..87301c23614 100644 --- a/lib/private/files/stream/quota.php +++ b/lib/private/files/stream/quota.php @@ -66,12 +66,22 @@ class Quota { } public function stream_seek($offset, $whence = SEEK_SET) { - if ($whence === SEEK_SET) { + if ($whence === SEEK_END){ + // go to the end to find out last position's offset + $oldOffset = $this->stream_tell(); + if (fseek($this->source, 0, $whence) !== 0){ + return false; + } + $whence = SEEK_SET; + $offset = $this->stream_tell() + $offset; + $this->limit += $oldOffset - $offset; + } + else if ($whence === SEEK_SET) { $this->limit += $this->stream_tell() - $offset; } else { $this->limit -= $offset; } - fseek($this->source, $offset, $whence); + return !fseek($this->source, $offset, $whence); } public function stream_tell() { diff --git a/tests/lib/files/stream/quota.php b/tests/lib/files/stream/quota.php index 22d3e93592c..b11f0ac74c0 100644 --- a/tests/lib/files/stream/quota.php +++ b/tests/lib/files/stream/quota.php @@ -75,4 +75,76 @@ class Quota extends \PHPUnit_Framework_TestCase { rewind($stream); $this->assertEquals('qwerty', fread($stream, 100)); } + + public function testFseekReturnsSuccess() { + $stream = $this->getStream('w+', 100); + fwrite($stream, '0123456789'); + $this->assertEquals(0, fseek($stream, 3, SEEK_SET)); + $this->assertEquals(0, fseek($stream, -1, SEEK_CUR)); + $this->assertEquals(0, fseek($stream, -4, SEEK_END)); + } + + public function testWriteAfterSeekEndWithEnoughSpace() { + $stream = $this->getStream('w+', 100); + fwrite($stream, '0123456789'); + fseek($stream, -3, SEEK_END); + $this->assertEquals(11, fwrite($stream, 'abcdefghijk')); + rewind($stream); + $this->assertEquals('0123456abcdefghijk', fread($stream, 100)); + } + + public function testWriteAfterSeekEndWithNotEnoughSpace() { + $stream = $this->getStream('w+', 13); + fwrite($stream, '0123456789'); + // seek forward first to potentially week out + // potential limit calculation errors + fseek($stream, 4, SEEK_SET); + // seek to the end + fseek($stream, -3, SEEK_END); + $this->assertEquals(6, fwrite($stream, 'abcdefghijk')); + rewind($stream); + $this->assertEquals('0123456abcdef', fread($stream, 100)); + } + + public function testWriteAfterSeekSetWithEnoughSpace() { + $stream = $this->getStream('w+', 100); + fwrite($stream, '0123456789'); + fseek($stream, 7, SEEK_SET); + $this->assertEquals(11, fwrite($stream, 'abcdefghijk')); + rewind($stream); + $this->assertEquals('0123456abcdefghijk', fread($stream, 100)); + } + + public function testWriteAfterSeekSetWithNotEnoughSpace() { + $stream = $this->getStream('w+', 13); + fwrite($stream, '0123456789'); + fseek($stream, 7, SEEK_SET); + $this->assertEquals(6, fwrite($stream, 'abcdefghijk')); + rewind($stream); + $this->assertEquals('0123456abcdef', fread($stream, 100)); + } + + public function testWriteAfterSeekCurWithEnoughSpace() { + $stream = $this->getStream('w+', 100); + fwrite($stream, '0123456789'); + rewind($stream); + fseek($stream, 3, SEEK_CUR); + fseek($stream, 5, SEEK_CUR); + fseek($stream, -1, SEEK_CUR); + $this->assertEquals(11, fwrite($stream, 'abcdefghijk')); + rewind($stream); + $this->assertEquals('0123456abcdefghijk', fread($stream, 100)); + } + + public function testWriteAfterSeekCurWithNotEnoughSpace() { + $stream = $this->getStream('w+', 13); + fwrite($stream, '0123456789'); + rewind($stream); + fseek($stream, 3, SEEK_CUR); + fseek($stream, 5, SEEK_CUR); + fseek($stream, -1, SEEK_CUR); + $this->assertEquals(6, fwrite($stream, 'abcdefghijk')); + rewind($stream); + $this->assertEquals('0123456abcdef', fread($stream, 100)); + } } |