Re: PHP 7 : Cannot use stream wrappers during MINIT
| From: | Dmitry Stogov | Date: | Mon, 09 Nov 2015 07:51:23 +0000 |
| Subject: | Re: PHP 7 : Cannot use stream wrappers during MINIT | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-89116@lists.php.net to get a copy of this message | ||
On Fri, Nov 6, 2015 at 3:08 AM, François Laupretre <francois@php.net> wrote:
> Hi,
>
> First, I don't know if this must be considered as a bug, because a lot of
> features are not available during MINIT but it seems quite inconsistent. I
> precise I'm using the 7.x master branch (I don't know if it works on 5.x or
> not).
>
MINIT wasn't designed to run any php code. You can't create objects and
resources in this stage.
>
> I am writing an extension where I need to read a file tree during the
> MINIT phase. So, I am using php_stream_scandir() to read some directories..
> At this time, php_init_stream_wrappers() has run, so I consider stream
> wrappers are available.
>
> Unfortunately, this is not true because stream wrappers register resources
> in EG(regular_list), which is not initialized before init_compiler() has
> run. If I call zend_hash_init(&(EG(regular_list))) before calling
> php_stream_scandir(), it seems to works. But it is not the solution because
> the hashtable is never destroyed and there are probably other side effects.
> The same potentially applies to EG(persistent_list).
>
> So, does it mean that stream wrappers cannot be used during MINIT, or do
> you know a workaround ? I can revert to the C stdio library but, for
> portability reasons, I'd prefer using the plain wrapper. Every suggestion
> is welcome.
>
It seems, you can't use wrappers. Probably, nobody tried this before :)
You may try to use php_scandir() wrapper.
>
> Another suggestion to help detecting such issues : can we consider, in
> _zend_is_inconsistent(), that a HashTable whose nTableSize is null is
> inconsistent and raises an alert. An uninitialized HashTable generally is
> filled with 0s. Today, using an uninitialized HashTable goes undetected,
> even in debug mode (because HT_OK == 0), and is very hard to track.
>
Uninitialized HashTables are not necessary filled with 0s.
We can add more assert()s, but this is going to be a protection from our
selves.
Anyway, attempts of destruction of uninitialized HashTables most probably
should lead to crash.
Thanks. Dmitry.
>
> Regards
>
> François
>