summaryrefslogtreecommitdiff
path: root/ext/pcre/php_pcre.c
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2016-03-21 17:15:44 +0100
committerAnatol Belski <ab@php.net>2016-03-21 17:31:26 +0100
commite23a41225fc4ea099b88e7fc450459173443d98f (patch)
tree4ffe214aa897e1e6f1221099de3bf82319e3adad /ext/pcre/php_pcre.c
parentcb240fe711ed1f42c539d17d0db8466b7d7e5e85 (diff)
downloadphp-git-e23a41225fc4ea099b88e7fc450459173443d98f.tar.gz
Increase PCRE JIT stack size
It is done by implementing the custom stack usage. This makes the JIT with mode on more compatible with the JIT mode off. Until now, the default PCRE JIT stack was used which is 32kb big by default. There are situations where some patterns would fail with JIT while working correctly without JIT. The starting size of the JIT stack is still set to 32kb, while the max is set to the permissive 256kb (and can be increased up to 1mb). As until now no suchlike bugs regarding JIT were reported, it is expected, that the stack usage will stay by 32kb in most cases. Though providing the custom stack, applications will have more room for some sporadic stack increase, thus more compatibility.
Diffstat (limited to 'ext/pcre/php_pcre.c')
-rw-r--r--ext/pcre/php_pcre.c35
1 files changed, 34 insertions, 1 deletions
diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c
index a522109f3e..128089c0bd 100644
--- a/ext/pcre/php_pcre.c
+++ b/ext/pcre/php_pcre.c
@@ -62,6 +62,11 @@ enum {
PHPAPI ZEND_DECLARE_MODULE_GLOBALS(pcre)
+#ifdef PCRE_STUDY_JIT_COMPILE
+#define PCRE_JIT_STACK_MIN_SIZE (32 * 1024)
+#define PCRE_JIT_STACK_MAX_SIZE (256 * 1024)
+ZEND_TLS pcre_jit_stack *jit_stack = NULL;
+#endif
static void pcre_handle_exec_error(int pcre_code) /* {{{ */
{
@@ -129,6 +134,16 @@ static PHP_GINIT_FUNCTION(pcre) /* {{{ */
static PHP_GSHUTDOWN_FUNCTION(pcre) /* {{{ */
{
zend_hash_destroy(&pcre_globals->pcre_cache);
+
+#ifdef PCRE_STUDY_JIT_COMPILE
+ /* Stack may only be destroyed when no cached patterns
+ possibly associated with it do exist. */
+ if (jit_stack) {
+ pcre_jit_stack_free(jit_stack);
+ jit_stack = NULL;
+ }
+#endif
+
}
/* }}} */
@@ -197,6 +212,19 @@ static PHP_MSHUTDOWN_FUNCTION(pcre)
}
/* }}} */
+/* {{{ PHP_RINIT_FUNCTION(pcre) */
+static PHP_RINIT_FUNCTION(pcre)
+{
+#ifdef PCRE_STUDY_JIT_COMPILE
+ if (PCRE_G(jit)) {
+ jit_stack = pcre_jit_stack_alloc(PCRE_JIT_STACK_MIN_SIZE,PCRE_JIT_STACK_MAX_SIZE);
+ }
+#endif
+
+ return SUCCESS;
+}
+/* }}} */
+
/* {{{ static pcre_clean_cache */
static int pcre_clean_cache(zval *data, void *arg)
{
@@ -461,6 +489,11 @@ PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache(zend_string *regex)
extra->flags |= PCRE_EXTRA_MATCH_LIMIT | PCRE_EXTRA_MATCH_LIMIT_RECURSION;
extra->match_limit = (unsigned long)PCRE_G(backtrack_limit);
extra->match_limit_recursion = (unsigned long)PCRE_G(recursion_limit);
+#ifdef PCRE_STUDY_JIT_COMPILE
+ if (PCRE_G(jit) && jit_stack) {
+ pcre_assign_jit_stack(extra, NULL, jit_stack);
+ }
+#endif
}
if (error != NULL) {
php_error_docref(NULL, E_WARNING, "Error while studying pattern");
@@ -2199,7 +2232,7 @@ zend_module_entry pcre_module_entry = {
pcre_functions,
PHP_MINIT(pcre),
PHP_MSHUTDOWN(pcre),
- NULL,
+ PHP_RINIT(pcre),
NULL,
PHP_MINFO(pcre),
PHP_PCRE_VERSION,