@@ -169,13 +169,14 @@ static PHP_MSHUTDOWN_FUNCTION(pcre)
169
169
/* {{{ static pcre_clean_cache */
170
170
static int pcre_clean_cache (void * data , void * arg TSRMLS_DC )
171
171
{
172
+ pcre_cache_entry * pce = (pcre_cache_entry * ) data ;
172
173
int * num_clean = (int * )arg ;
173
174
174
- if (* num_clean > 0 ) {
175
+ if (* num_clean > 0 && ! pce -> refcount ) {
175
176
(* num_clean )-- ;
176
- return 1 ;
177
+ return ZEND_HASH_APPLY_REMOVE ;
177
178
} else {
178
- return 0 ;
179
+ return ZEND_HASH_APPLY_KEEP ;
179
180
}
180
181
}
181
182
/* }}} */
@@ -446,6 +447,7 @@ PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache(char *regex, int regex_le
446
447
new_entry .locale = pestrdup (locale , 1 );
447
448
new_entry .tables = tables ;
448
449
#endif
450
+ new_entry .refcount = 0 ;
449
451
450
452
/*
451
453
* Interned strings are not duplicated when stored in HashTable,
@@ -550,8 +552,10 @@ static void php_do_pcre_match(INTERNAL_FUNCTION_PARAMETERS, int global) /* {{{ *
550
552
RETURN_FALSE ;
551
553
}
552
554
555
+ pce -> refcount ++ ;
553
556
php_pcre_match_impl (pce , subject , subject_len , return_value , subpats ,
554
557
global , ZEND_NUM_ARGS () >= 4 , flags , start_offset TSRMLS_CC );
558
+ pce -> refcount -- ;
555
559
}
556
560
/* }}} */
557
561
@@ -1017,14 +1021,18 @@ PHPAPI char *php_pcre_replace(char *regex, int regex_len,
1017
1021
int * result_len , int limit , int * replace_count TSRMLS_DC )
1018
1022
{
1019
1023
pcre_cache_entry * pce ; /* Compiled regular expression */
1024
+ char * result ; /* Function result */
1020
1025
1021
1026
/* Compile regex or get it from cache. */
1022
1027
if ((pce = pcre_get_compiled_regex_cache (regex , regex_len TSRMLS_CC )) == NULL ) {
1023
1028
return NULL ;
1024
1029
}
1025
-
1026
- return php_pcre_replace_impl (pce , subject , subject_len , replace_val ,
1030
+ pce -> refcount ++ ;
1031
+ result = php_pcre_replace_impl (pce , subject , subject_len , replace_val ,
1027
1032
is_callable_replace , result_len , limit , replace_count TSRMLS_CC );
1033
+ pce -> refcount -- ;
1034
+
1035
+ return result ;
1028
1036
}
1029
1037
/* }}} */
1030
1038
@@ -1511,7 +1519,9 @@ static PHP_FUNCTION(preg_split)
1511
1519
RETURN_FALSE ;
1512
1520
}
1513
1521
1522
+ pce -> refcount ++ ;
1514
1523
php_pcre_split_impl (pce , subject , subject_len , return_value , limit_val , flags TSRMLS_CC );
1524
+ pce -> refcount -- ;
1515
1525
}
1516
1526
/* }}} */
1517
1527
@@ -1794,8 +1804,10 @@ static PHP_FUNCTION(preg_grep)
1794
1804
if ((pce = pcre_get_compiled_regex_cache (regex , regex_len TSRMLS_CC )) == NULL ) {
1795
1805
RETURN_FALSE ;
1796
1806
}
1797
-
1807
+
1808
+ pce -> refcount ++ ;
1798
1809
php_pcre_grep_impl (pce , input , return_value , flags TSRMLS_CC );
1810
+ pce -> refcount -- ;
1799
1811
}
1800
1812
/* }}} */
1801
1813
0 commit comments