From 426dbdbfcd793758739c24f082cb0934976a63f4 Mon Sep 17 00:00:00 2001 From: Dean Sas Date: Mon, 13 Aug 2018 16:28:33 +0100 Subject: [PATCH] Ensure SFTP::rawlist gives same results regardless of statcache Previously SFTP::rawlist gave different results depending on whether the stat cache was enabled or not. With the stat cache turned off it did not treat directories correctly, as it relied on the stat cache even though it was not populated. --- phpseclib/Net/SFTP.php | 12 +++++++++- tests/Functional/Net/SFTPUserStoryTest.php | 27 ++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/phpseclib/Net/SFTP.php b/phpseclib/Net/SFTP.php index aaff793b..c613ea8c 100644 --- a/phpseclib/Net/SFTP.php +++ b/phpseclib/Net/SFTP.php @@ -919,7 +919,17 @@ class Net_SFTP extends Net_SSH2 unset($files[$key]); continue; } - if ($key != '.' && $key != '..' && is_array($this->_query_stat_cache($this->_realpath($dir . '/' . $key)))) { + $is_directory = false; + if ($key != '.' && $key != '..') { + if ($this->use_stat_cache) { + $is_directory = is_array($this->_query_stat_cache($this->_realpath($dir . '/' . $key))); + } else { + $stat = $this->stat($dir . '/' . $key); + $is_directory = $stat && $stat['type'] === NET_SFTP_TYPE_DIRECTORY; + } + } + + if ($is_directory) { $depth++; $files[$key] = $this->rawlist($dir . '/' . $key, true); $depth--; diff --git a/tests/Functional/Net/SFTPUserStoryTest.php b/tests/Functional/Net/SFTPUserStoryTest.php index 0817345e..e39cd2f9 100644 --- a/tests/Functional/Net/SFTPUserStoryTest.php +++ b/tests/Functional/Net/SFTPUserStoryTest.php @@ -722,5 +722,32 @@ class Functional_Net_SFTPUserStoryTest extends PhpseclibFunctionalTestCase $sftp->exec('ping google.com -c 5'); sleep(5); $sftp->nlist(); + + return $sftp; + } + + /** + * @depends testExecNlist + */ + public function testRawlistDisabledStatCache($sftp) + { + $this->assertTrue($sftp->chdir('unittests')); + $this->assertTrue($sftp->mkdir(self::$scratchDir)); + $this->assertTrue($sftp->chdir(self::$scratchDir)); + $this->assertTrue($sftp->put('text.txt', 'zzzzz')); + $this->assertTrue($sftp->mkdir('subdir')); + $this->assertTrue($sftp->chdir('subdir')); + $this->assertTrue($sftp->put('leaf.txt', 'yyyyy')); + $this->assertTrue($sftp->chdir('../../')); + + $list_cache_enabled = $sftp->rawlist('.', true); + + $sftp->clearStatCache(); + + $sftp->disableStatCache(); + + $list_cache_disabled = $sftp->rawlist('.', true); + + $this->assertEquals($list_cache_enabled, $list_cache_disabled, 'The files should be the same regardless of stat cache', 0.0, 10, true); } }