summaryrefslogtreecommitdiff
path: root/ext/pcre/php_pcre.c
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2017-12-05 17:40:00 +0100
committerAnatol Belski <ab@php.net>2017-12-05 17:40:00 +0100
commit75a2ee7f7bad4d3bc7bc60c181eabcc6d58c7937 (patch)
treee5e4f9ade04f73d8e35c596cf201f645bc659e16 /ext/pcre/php_pcre.c
parented2434a6aa68d3fe01fc6213f3c1a386dbe2a558 (diff)
downloadphp-git-75a2ee7f7bad4d3bc7bc60c181eabcc6d58c7937.tar.gz
Fixed bug #75601 Thread race in PCRE JIT support
Diffstat (limited to 'ext/pcre/php_pcre.c')
-rw-r--r--ext/pcre/php_pcre.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c
index aa2695ea2c..64db5da0f6 100644
--- a/ext/pcre/php_pcre.c
+++ b/ext/pcre/php_pcre.c
@@ -68,6 +68,18 @@ PHPAPI ZEND_DECLARE_MODULE_GLOBALS(pcre)
#define PCRE_JIT_STACK_MAX_SIZE (64 * 1024)
ZEND_TLS pcre_jit_stack *jit_stack = NULL;
#endif
+#if defined(ZTS) && defined(HAVE_PCRE_JIT_SUPPORT)
+static MUTEX_T pcre_mt = NULL;
+#define php_pcre_mutex_alloc() if (tsrm_is_main_thread() && !pcre_mt) pcre_mt = tsrm_mutex_alloc();
+#define php_pcre_mutex_free() if (tsrm_is_main_thread() && pcre_mt) tsrm_mutex_free(pcre_mt);
+#define php_pcre_mutex_lock() tsrm_mutex_lock(pcre_mt);
+#define php_pcre_mutex_unlock() tsrm_mutex_unlock(pcre_mt);
+#else
+#define php_pcre_mutex_alloc()
+#define php_pcre_mutex_free()
+#define php_pcre_mutex_lock()
+#define php_pcre_mutex_unlock()
+#endif
static void pcre_handle_exec_error(int pcre_code) /* {{{ */
{
@@ -190,6 +202,8 @@ static PHP_MINIT_FUNCTION(pcre)
{
REGISTER_INI_ENTRIES();
+ php_pcre_mutex_alloc();
+
REGISTER_LONG_CONSTANT("PREG_PATTERN_ORDER", PREG_PATTERN_ORDER, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("PREG_SET_ORDER", PREG_SET_ORDER, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("PREG_OFFSET_CAPTURE", PREG_OFFSET_CAPTURE, CONST_CS | CONST_PERSISTENT);
@@ -217,6 +231,8 @@ static PHP_MSHUTDOWN_FUNCTION(pcre)
{
UNREGISTER_INI_ENTRIES();
+ php_pcre_mutex_free();
+
return SUCCESS;
}
/* }}} */
@@ -226,7 +242,9 @@ static PHP_MSHUTDOWN_FUNCTION(pcre)
static PHP_RINIT_FUNCTION(pcre)
{
if (PCRE_G(jit) && jit_stack == NULL) {
+ php_pcre_mutex_lock();
jit_stack = pcre_jit_stack_alloc(PCRE_JIT_STACK_MIN_SIZE,PCRE_JIT_STACK_MAX_SIZE);
+ php_pcre_mutex_unlock();
}
return SUCCESS;