Skip to content
This repository was archived by the owner on Nov 25, 2020. It is now read-only.

Commit 76892b8

Browse files
committed
Hunting while(!feof(..)) calls missing a test on the resource: can trigger an infinite read and a CPU hog.
1 parent c8d2c2f commit 76892b8

File tree

11 files changed

+43
-19
lines changed

11 files changed

+43
-19
lines changed

core/src/plugins/access.fs/class.fsAccessDriver.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1317,6 +1317,9 @@ protected function appendUploadedData($folder, $source, $target){
13171317

13181318
public function readFile($filePathOrData, $headerType="plain", $localName="", $data=false, $gzip=null, $realfileSystem=false, $byteOffset=-1, $byteLength=-1)
13191319
{
1320+
if(!$data && !$gzip && !file_exists($filePathOrData)){
1321+
throw new Exception("File $filePathOrData not found!");
1322+
}
13201323
if ($gzip === null) {
13211324
$gzip = ConfService::getCoreConf("GZIP_COMPRESSION");
13221325
}
@@ -1394,6 +1397,9 @@ public function readFile($filePathOrData, $headerType="plain", $localName="", $d
13941397

13951398
header("Content-Length: ". $length);
13961399
$file = fopen($filePathOrData, 'rb');
1400+
if(!is_resource($file)){
1401+
throw new Exception("Failed opening file ".$filePathOrData);
1402+
}
13971403
fseek($file, 0);
13981404
$relOffset = $offset;
13991405
while ($relOffset > 2.0E9) {
@@ -1466,6 +1472,9 @@ public function readFile($filePathOrData, $headerType="plain", $localName="", $d
14661472
if ($realfileSystem) {
14671473
$this->logDebug("realFS!", array("file"=>$filePathOrData));
14681474
$fp = fopen($filePathOrData, "rb");
1475+
if(!is_resource($fp)){
1476+
throw new Exception("Failed opening file ".$filePathOrData);
1477+
}
14691478
if ($byteOffset != -1) {
14701479
fseek($fp, $byteOffset);
14711480
}

core/src/plugins/access.fs/class.fsAccessWrapper.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ public static function isRemote()
244244
public static function copyFileInStream($path, $stream)
245245
{
246246
$fp = fopen(self::getRealFSReference($path), "rb");
247+
if(!is_resource($fp)) return;
247248
while (!feof($fp)) {
248249
if(!ini_get("safe_mode")) @set_time_limit(60);
249250
$data = fread($fp, 4096);

core/src/plugins/access.smb/class.smbAccessWrapper.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ public static function isRemote()
169169
public static function copyFileInStream($path, $stream)
170170
{
171171
$fp = fopen(self::getRealFSReference($path), "rb");
172+
if(!is_resource($fp)) return;
172173
while (!feof($fp)) {
173174
$data = fread($fp, 4096);
174175
fwrite($stream, $data, strlen($data));

core/src/plugins/access.swift/class.swiftAccessWrapper.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ public static function isRemote()
240240
public static function copyFileInStream($path, $stream)
241241
{
242242
$fp = fopen($path, "r", null, self::$cloudContext);
243+
if(!is_resource($fp)) return;
243244
while (!feof($fp)) {
244245
$data = fread($fp, 4096);
245246
fwrite($stream, $data, strlen($data));

core/src/plugins/access.webdav/class.webdavAccessWrapper.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ public static function isRemote()
210210
public static function copyFileInStream($path, $stream)
211211
{
212212
$fp = fopen(self::getRealFSReference($path), "rb");
213+
if(!is_resource($fp)) return;
213214
while (!feof($fp)) {
214215
$data = fread($fp, 4096);
215216
fwrite($stream, $data, strlen($data));

core/src/plugins/core.access/class.AbstractAccessDriver.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -316,15 +316,15 @@ protected function filecopy($srcFile, $destFile, $srcWrapperName, $destWrapperNa
316316
if (call_user_func(array($srcWrapperName, "isRemote")) || call_user_func(array($destWrapperName, "isRemote")) || $srcWrapperName != $destWrapperName) {
317317
$src = fopen($srcFile, "r");
318318
$dest = fopen($destFile, "w");
319-
if ($dest !== false) {
319+
if (is_resource($src) && is_resource($dest)) {
320320
while (!feof($src)) {
321321
//stream_copy_to_stream($src, $dest, 4096);
322322
$count = stream_copy_to_stream($src, $dest, 4096);
323323
if ($count == 0) break;
324324
}
325-
fclose($dest);
326325
}
327-
fclose($src);
326+
if(is_resource($dest)) fclose($dest);
327+
if(is_resource($src)) fclose($src);
328328
} else {
329329
copy($srcFile, $destFile);
330330
}

core/src/plugins/editor.diaporama/PThumb.lib.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -921,10 +921,12 @@ function retrieve_remote_file($url,$skip_checks=false,$refresh=false, $force_met
921921

922922
$data = "";
923923
$fp = fopen($url, "r");
924-
while (!feof($fp)) {
925-
$data .= fread($fp, 4096);
924+
if(is_resource($fp)){
925+
while (!feof($fp)) {
926+
$data .= fread($fp, 4096);
927+
}
928+
fclose($fp);
926929
}
927-
fclose($fp);
928930
//$data = @implode("",file($url));
929931
if (strlen($data) > 0){
930932
$this -> data_cache[sha1($url)] = $data;

core/src/plugins/editor.pixlr/class.PixlrEditor.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,11 +113,13 @@ public function switchAction($action, $httpVars, $filesVars)
113113

114114
$orig = fopen($image, "r");
115115
$target = fopen($destStreamURL.$file, "w");
116-
while (!feof($orig)) {
117-
fwrite($target, fread($orig, 4096));
116+
if(is_resource($orig) && is_resource($target)){
117+
while (!feof($orig)) {
118+
fwrite($target, fread($orig, 4096));
119+
}
120+
fclose($orig);
121+
fclose($target);
118122
}
119-
fclose($orig);
120-
fclose($target);
121123
clearstatcache(true, $node->getUrl());
122124
$node->loadNodeInfo(true);
123125
AJXP_Controller::applyHook("node.change", array(&$node, &$node));

core/src/plugins/editor.video/class.VideoReader.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ public function switchAction($action, $httpVars, $filesVars)
8080
header('Accept-Ranges:bytes');
8181
header("Content-Length: ". $length);
8282
$file = fopen($filename, 'rb');
83+
if(!is_resource($file)) throw new Exception("Cannot open file $file!");
8384
fseek($file, 0);
8485
$relOffset = $offset;
8586
while ($relOffset > 2.0E9) {

core/src/plugins/uploader.html/class.SimpleUploadProcessor.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,10 +143,12 @@ public function unifyChunks($action, $httpVars, $fileVars)
143143
$newDest = fopen($destStreamURL.$filename, "w");
144144
for ($i = 0; $i < count($chunks) ; $i++) {
145145
$part = fopen($destStreamURL.$chunks[$i], "r");
146-
while (!feof($part)) {
147-
fwrite($newDest, fread($part, 4096));
146+
if(is_resource($part)){
147+
while (!feof($part)) {
148+
fwrite($newDest, fread($part, 4096));
149+
}
150+
fclose($part);
148151
}
149-
fclose($part);
150152
unlink($destStreamURL.$chunks[$i]);
151153
}
152154
fclose($newDest);

0 commit comments

Comments
 (0)