]> granicus.if.org Git - php/commitdiff
Fix (*NO_JIT) usage when JIT is enabled
authorAnatol Belski <ab@php.net>
Thu, 16 Nov 2017 13:12:05 +0000 (14:12 +0100)
committerAnatol Belski <ab@php.net>
Thu, 16 Nov 2017 13:12:05 +0000 (14:12 +0100)
If (*NO_JIT) is put into the pattern, the JIT compilation will still
succeed but produce no code. The pattern will still have to be
interpreted and is not suitable for the JIT fast path. This means,
we still need to check the pattern info after JIT compilation and only
set the flags when the JIT code was produced.

ext/pcre/php_pcre.c
ext/pcre/tests/no_jit_bug70110.phpt [new file with mode: 0644]

index 5386077f8cbf15ab211ed2738067a29f18accd22..615cece7cf3de4fe95d57a04ade395ed14e433e2 100644 (file)
@@ -726,7 +726,10 @@ PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache(zend_string *regex)
                /* Enable PCRE JIT compiler */
                rc = pcre2_jit_compile(re, PCRE2_JIT_COMPLETE);
                if (EXPECTED(rc >= 0)) {
-                       poptions |= PREG_JIT;
+                       size_t jit_size = 0;
+                       if (!pcre2_pattern_info(re, PCRE2_INFO_JITSIZE, &jit_size) && jit_size > 0) {
+                               poptions |= PREG_JIT;
+                       }
                } else {
                        pcre2_get_error_message(rc, error, sizeof(error));
                        php_error_docref(NULL, E_WARNING, "JIT compilation failed: %s", error);
diff --git a/ext/pcre/tests/no_jit_bug70110.phpt b/ext/pcre/tests/no_jit_bug70110.phpt
new file mode 100644 (file)
index 0000000..d1ce7ab
--- /dev/null
@@ -0,0 +1,16 @@
+--TEST--
+Test (*NO_JIT) doesn't crash when JIT enabled
+--SKIPIF--
+<?php if (!PCRE_JIT_SUPPORT) die("skip pcre jit support required"); ?>
+--FILE--
+<?php
+
+var_dump(preg_match('/(*NO_JIT)^(A{1,2}B)+$$/',str_repeat('AB',8192)));
+var_dump(preg_match('~(*NO_JIT)(a)*~', str_repeat('a', 5431), $match))
+
+?>
+==DONE==
+--EXPECTF--
+int(1)
+int(1)
+==DONE==