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. > 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