summaryrefslogtreecommitdiff
path: root/ext/pcre
diff options
context:
space:
mode:
authorSergei Turchanov <turchanov@farpost.com>2019-10-08 17:55:07 +1000
committerNikita Popov <nikita.ppv@gmail.com>2019-10-08 16:11:55 +0200
commita8f60ac9dd3ba8fed24370799603b92487fdf362 (patch)
tree8a3ccd6f61297728d6ffca60742b12b07598a595 /ext/pcre
parent46894580b06c1ba630a804ff0bbb9e61076720f4 (diff)
downloadphp-git-a8f60ac9dd3ba8fed24370799603b92487fdf362.tar.gz
Add pcre_get_compiled_regex_cache_ex() with local_aware flag
A new function `pcre_get_compiled_regex_cache_ex()` is introduced, which allows to compile regexp pattern using the "C" locale instead of a current locale. This will be needed to replace setlocale() usage in fileinfo, which is not thread-safe.
Diffstat (limited to 'ext/pcre')
-rw-r--r--ext/pcre/php_pcre.c12
-rw-r--r--ext/pcre/php_pcre.h1
2 files changed, 11 insertions, 2 deletions
diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c
index d7d186540a..f919faa298 100644
--- a/ext/pcre/php_pcre.c
+++ b/ext/pcre/php_pcre.c
@@ -322,7 +322,7 @@ static zend_always_inline int calculate_unit_length(pcre_cache_entry *pce, char
/* {{{ pcre_get_compiled_regex_cache
*/
-PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache(zend_string *regex)
+PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache_ex(zend_string *regex, int locale_aware)
{
pcre *re = NULL;
pcre_extra *extra;
@@ -344,7 +344,7 @@ PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache(zend_string *regex)
zend_string *key;
#if HAVE_SETLOCALE
- if (BG(locale_string) &&
+ if (locale_aware && BG(locale_string) &&
(ZSTR_LEN(BG(locale_string)) != 1 && ZSTR_VAL(BG(locale_string))[0] != 'C')) {
key = zend_string_alloc(ZSTR_LEN(regex) + ZSTR_LEN(BG(locale_string)) + 1, 0);
memcpy(ZSTR_VAL(key), ZSTR_VAL(BG(locale_string)), ZSTR_LEN(BG(locale_string)) + 1);
@@ -636,6 +636,14 @@ PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache(zend_string *regex)
}
/* }}} */
+/* {{{ pcre_get_compiled_regex_cache
+ */
+PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache(zend_string *regex)
+{
+ return pcre_get_compiled_regex_cache_ex(regex, 1);
+}
+/* }}} */
+
/* {{{ pcre_get_compiled_regex
*/
PHPAPI pcre* pcre_get_compiled_regex(zend_string *regex, pcre_extra **extra, int *preg_options)
diff --git a/ext/pcre/php_pcre.h b/ext/pcre/php_pcre.h
index 137cce5a9e..62edb29da8 100644
--- a/ext/pcre/php_pcre.h
+++ b/ext/pcre/php_pcre.h
@@ -57,6 +57,7 @@ typedef struct {
} pcre_cache_entry;
PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache(zend_string *regex);
+PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache_ex(zend_string *regex, int locale_aware);
PHPAPI void php_pcre_match_impl( pcre_cache_entry *pce, char *subject, int subject_len, zval *return_value,
zval *subpats, int global, int use_flags, zend_long flags, zend_long start_offset);