diff --git a/phpseclib/Net/SFTP.php b/phpseclib/Net/SFTP.php index 8825f30c..40c5b2af 100644 --- a/phpseclib/Net/SFTP.php +++ b/phpseclib/Net/SFTP.php @@ -864,7 +864,17 @@ class SFTP extends 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->lstat($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 57524d40..5767eb9f 100644 --- a/tests/Functional/Net/SFTPUserStoryTest.php +++ b/tests/Functional/Net/SFTPUserStoryTest.php @@ -724,5 +724,31 @@ 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->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); } }