aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files_encryption/lib/cryptstream.php
diff options
context:
space:
mode:
authorRobin Appelman <icewind@owncloud.com>2012-04-17 23:10:14 +0200
committerRobin Appelman <icewind@owncloud.com>2012-04-18 20:54:28 +0200
commitb39c3d4c4edbb9a7fd2be22e2d2684e4185ca0e5 (patch)
tree7261719c0d1106bc10a260bea1df32696868ea1b /apps/files_encryption/lib/cryptstream.php
parent26e9a0dd139a94d6876df0be49a8d40b8976d65a (diff)
downloadnextcloud-server-b39c3d4c4edbb9a7fd2be22e2d2684e4185ca0e5.tar.gz
nextcloud-server-b39c3d4c4edbb9a7fd2be22e2d2684e4185ca0e5.zip
make use of the fact that stream_read will always read 8192 bytes for encryption stream
https://bugs.php.net/bug.php?id=21641
Diffstat (limited to 'apps/files_encryption/lib/cryptstream.php')
-rw-r--r--apps/files_encryption/lib/cryptstream.php38
1 files changed, 15 insertions, 23 deletions
diff --git a/apps/files_encryption/lib/cryptstream.php b/apps/files_encryption/lib/cryptstream.php
index 86583096f1d..21fa38e4b59 100644
--- a/apps/files_encryption/lib/cryptstream.php
+++ b/apps/files_encryption/lib/cryptstream.php
@@ -64,29 +64,19 @@ class OC_CryptStream{
}
public function stream_read($count){
- $pos=0;
- $currentPos=ftell($this->source);
- $offset=$currentPos%8192;
- $result='';
- if($offset>0){
- if($this->meta['seekable']){
- fseek($this->source,-$offset,SEEK_CUR);//if seeking isnt supported the internal read buffer will be used
- }else{
- $pos=strlen($this->readBuffer);
- $result=$this->readBuffer;
- }
+ //$count will always be 8192 https://bugs.php.net/bug.php?id=21641
+ //This makes this function a lot simpler but will breake everything the moment it's fixed
+ if($count!=8192){
+ OC_Log::write('files_encryption','php bug 21641 no longer holds, decryption will not work',OC_Log::FATAL);
+ die();
}
- while($count>$pos){
- $data=fread($this->source,8192);
- $pos+=8192;
- if(strlen($data)){
- $result.=OC_Crypt::decrypt($data);
- }
- }
- if(!$this->meta['seekable']){
- $this->readBuffer=substr($result,$count);
+ $data=fread($this->source,8192);
+ if(strlen($data)){
+ $result=OC_Crypt::decrypt($data);
+ }else{
+ $result='';
}
- return substr($result,0,$count);
+ return $result;
}
public function stream_write($data){
@@ -107,8 +97,10 @@ class OC_CryptStream{
$oldPos=ftell($this->source);
$encryptedBlock=fread($this->source,8192);
fseek($this->source,$oldPos);
- $block=OC_Crypt::decrypt($encryptedBlock);
- $data.=substr($block,strlen($data));
+ if($encryptedBlock){
+ $block=OC_Crypt::decrypt($encryptedBlock);
+ $data.=substr($block,strlen($data));
+ }
}
$encrypted=OC_Crypt::encrypt(substr($data,0,8192));
fwrite($this->source,$encrypted);