Bug #80660 [Com]: FilesystemIterator foreach-loop fails on fuse filesystems
| From: | staffan at njoy dot fi | Date: | Thu, 25 Aug 2022 05:38:42 +0000 |
| Subject: | Bug #80660 [Com]: FilesystemIterator foreach-loop fails on fuse filesystems | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-242305@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=80660&edit=1
ID: 80660
Comment by: staffan at njoy dot fi
Reported by: shop1 at mokraemer dot de
Summary: FilesystemIterator foreach-loop fails on fuse
filesystems
Status: Open
Type: Bug
Package: *Directory/Filesystem functions
Operating System: linux
PHP Version: 7.4.14
Block user comment: N
Private report: N
New Comment:
I think this is what I'm seeing in docker on windows, I'm using the php:7-fpm-alpine image
and it's currently at 7.4.30.
I'm only seeing it if the directory that's being scanned has more than about 50 entries
though. It puzzled me greatly why Drupal would fail to identify its modules if the modules directory
had a lot of modules but be fine if I moved them around so that no modules directory had more than
that. I've only seen this when the modules were on a bind mounted volume.
Previous Comments:
------------------------------------------------------------------------
[2021-04-30 02:19:18] marcelo at ofload dot com
I'm having a similar issue.
In your example, if you don't rewind() it works.
i.e.
- create the iterator
- while()
- foreach()
But I can also see an issue where if you rewind() before while() it fails.
i.e.
- create the iterator
- rewind()
- while()
Also, if we do foreach() before while() it fails:
i.e.
- create the iterator
- foreach()
- rewind()
- while()
In summary, depending if you call rewind() or not calling rewind() it fails for foreach() or while()
too.
This is a very awkward bug that is happening in a Docker container with Windows as a Host.
------------------------------------------------------------------------
[2021-01-22 13:53:36] shop1 at mokraemer dot de
Description:
------------
As for my testing, FilesystemIterator fails with the foreach loop while the while-next loop works as
expected.
Test script:
---------------
<?php
$iterator = new \FilesystemIterator(
'/fuse-filesystem',
\FilesystemIterator::CURRENT_AS_SELF
| \FilesystemIterator::SKIP_DOTS
);
echo "--while\n";
while($iterator->valid()) {
echo $iterator->current()."\n";
$iterator->next();
}
$iterator->rewind();
echo "--for\n";
foreach ($iterator as $entry) {
echo $entry->getFilename()."\n";
}
Expected result:
----------------
--while
.hg
file1.class.php
file2.class.php
--for
.hg
file1.class.php
file2.class.php
Actual result:
--------------
--while
.hg
file1.class.php
file2.class.php
--for
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=80660&edit=1