diff options
author | Robin Appelman <icewind@owncloud.com> | 2012-04-17 23:10:14 +0200 |
---|---|---|
committer | Robin Appelman <icewind@owncloud.com> | 2012-04-18 20:54:28 +0200 |
commit | b39c3d4c4edbb9a7fd2be22e2d2684e4185ca0e5 (patch) | |
tree | 7261719c0d1106bc10a260bea1df32696868ea1b /apps/files_encryption/lib/cryptstream.php | |
parent | 26e9a0dd139a94d6876df0be49a8d40b8976d65a (diff) | |
download | nextcloud-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.php | 38 |
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); |