]> granicus.if.org Git - php/commitdiff
Add pcre_get_compiled_regex_cache_ex() with local_aware flag
authorSergei Turchanov <turchanov@farpost.com>
Tue, 8 Oct 2019 07:55:07 +0000 (17:55 +1000)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 8 Oct 2019 14:11:55 +0000 (16:11 +0200)
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.

ext/pcre/php_pcre.c
ext/pcre/php_pcre.h

index d7d186540ab23a8c4a50957d275e91e1e058f78e..f919faa298e13402b2bef85e9abc6338cf44137f 100644 (file)
@@ -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)
index 137cce5a9e7d0d6e3cafff3c21d17df3eb820750..62edb29da88c570642bc643147c356356f9b5754 100644 (file)
@@ -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);