On Mon, Mar 21, 2016 at 7:41 PM, Anatol Belski <anatol....@belski.net>
wrote:

> Hi,
>
> > -----Original Message-----
> > From: David Zuelke [mailto:d...@heroku.com]
> > Sent: Monday, March 21, 2016 12:30 AM
> > To: Anatol Belski <anatol....@belski.net>
> > Cc: Christoph Becker <cmbecke...@gmx.de>; Pierre Joye
> > <pierre....@gmail.com>; PHP internals <internals@lists.php.net>
> > Subject: Re: [PHP-DEV] PCRE JIT stack size limit
> >
> >
> > > On 20.03.2016, at 22:41, Anatol Belski <anatol....@belski.net> wrote:
> > >
> > > Hi,
> > >
> > >> -----Original Message-----
> > >> From: David Zuelke [mailto:d...@heroku.com]
> > >> Sent: Sunday, March 20, 2016 10:10 PM
> > >> To: Anatol Belski <anatol....@belski.net>
> > >> Cc: Christoph Becker <cmbecke...@gmx.de>; Pierre Joye
> > >> <pierre....@gmail.com>; PHP internals <internals@lists.php.net>
> > >> Subject: Re: [PHP-DEV] PCRE JIT stack size limit
> > >>
> > >>> On 17.03.2016, at 05:22, David Zuelke <d...@heroku.com> wrote:
> > >>>
> > >>>> On 16.03.2016, at 21:38, Anatol Belski <anatol....@belski.net>
> wrote:
> > >>>>
> > >>>> Hi,
> > >>>>
> > >>>>> -----Original Message-----
> > >>>>> From: David Zuelke [mailto:d...@heroku.com]
> > >>>>> Sent: Tuesday, March 15, 2016 11:58 PM
> > >>>>> To: Anatol Belski <anatol....@belski.net>
> > >>>>> Cc: Christoph Becker <cmbecke...@gmx.de>; Pierre Joye
> > >>>>> <pierre....@gmail.com>; PHP internals <internals@lists.php.net>
> > >>>>> Subject: Re: [PHP-DEV] PCRE JIT stack size limit
> > >>>>>
> > >>>>> Sure. So composer creates patterns to parse a file dynamically; I
> > >>>>> have not figured out why it only happens for some composer.json
> > >>>>> files (or maybe it happens for all of them and I just have not
> > >>>>> noticed), but this example here I extracted from a reproducibly
> > >>>>> failing "composer require" run; it runs into the JIT stack size
> > >>>>> limit
> > > on PHP 7
> > >> while it works fine on 5.x:
> > >>>>>
> > >>>>> https://gist.github.com/dzuelke/cc64a630c14416eda3e9
> > >>>>>
> > >>>> I've just tried this on Debian Jessie and on Windows with the
> > >>>> latest
> > > 7.0.x
> > >> builds, in both cases the error is PREG_BACKTRACK_LIMIT_ERROR. I'd be
> > >> next asking you to check the configuration. Runtime like system or
> > >> ini, or
> > > build config
> > >> can affect this. Anyway, I don't see an issue with PCRE JIT at the
> moment.
> > >>>
> > >>> Sorry, I simplified the example too far. Updated it again to throw a
> > >>> JIT
> > > stack
> > >> limit error again (but works fine with "php -dpcre.jit=0"):
> > >>>
> > >>> https://gist.github.com/dzuelke/cc64a630c14416eda3e9/de7b7293798ac57
> > >>> b4
> > >>> f75d822dc22a625be0fe9df
> > >>
> > >> Were you able to reproduce this? :)
> > >>
> > > Yes, it is reproducible. I was just investigating on another issue
> > > https://bugs.exim.org/show_bug.cgi?id=1803 which now seems unrelated.
> > > With the JIT stack - we can try to use a custom stack to increase its
> > > size by allocating a custom jit stack of an increased sizeas a
> > > workaround. If that works, it should be fine. I'll be working on a
> > > patch next week, then we can see this option makes sense. More on the
> > > topic is readable here
> > http://www.pcre.org/original/doc/html/pcrejit.html#stackcontrol .
> >
> > That sounds good. I suspect a significantly larger stack size than the
> PCRE
> > default of 32k will do the job for most cases. Arguably, what Composer
> uses
> > there is not a trivial pattern with all the nesting going on, but I was
> unable to
> > simplify it when I took a few minutes the other day, and while the
> > composer.json where the bug occurs is generated by code, I don't think it
> > qualifies as an extreme case.
> >
> I've just pushed a fix for this issue, could you please check? A global
> stack space
> Is used in a thread safe manner. I was first setting max to 256K, then
> decreased it
> To 64K for now. My tests on Linux and Windows show your snippet passing,
> Travis is good as well.
>
> > I guess though that some day, someone with a more complex pattern and/or
> > subject string will come with the same problem and say "this fails for
> me,
> the
> > 256k stack limit you set in PHP is not enough", so maybe an INI option
> should
> > exist? Although that's not terribly useful if one program needs it for
> one
> pattern.
> > Flags don't work well for this (unless it's e.g. a numeric one indicating
> multiples
> > of 128k or something, but that's also terrible).
> >
> The issue I have with more increasing the stack is that - while as we see
> till today
> the default stack size of 32K is enough in the common case, the max of it
> will be
> reserved. So the real usage will most likely stay under 32K, but the whole
> of max
> (say 64K now) will be unusable by anything else.
>

Are you sure about that? The documentation says "The arguments are a
starting size for the stack, and a maximum size to which it is allowed to
grow." Unless I'm misunderstanding something, it should not be allocating
the maximum size right away.

Nikita


> > Or change the pcre_match (et al) implementations to retry without JIT if
> the
> > error occurs?
> >
> Yes, this were thinkable and doable within the scope of 7.0. A new INI
> option were
> however something for 7.1. The common case, at least till now, shows we
> beat
> more than 99% of PCRE usage with no compatibility issue. I'd plea
> therefore,
> to
> keep this simple for now and see whether the real life brings more issues
> with
> common projects.
>
> Regards
>
> Anatol
>
>
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>

Reply via email to