@@ -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
@@ -988,14 +992,18 @@ PHPAPI char *php_pcre_replace(char *regex, int regex_len,
988
992
int * result_len , int limit , int * replace_count TSRMLS_DC )
989
993
{
990
994
pcre_cache_entry * pce ; /* Compiled regular expression */
995
+ char * result ; /* Function result */
991
996
992
997
/* Compile regex or get it from cache. */
993
998
if ((pce = pcre_get_compiled_regex_cache (regex , regex_len TSRMLS_CC )) == NULL ) {
994
999
return NULL ;
995
1000
}
996
-
997
- return php_pcre_replace_impl (pce , subject , subject_len , replace_val ,
1001
+ pce -> refcount ++ ;
1002
+ result = php_pcre_replace_impl (pce , subject , subject_len , replace_val ,
998
1003
is_callable_replace , result_len , limit , replace_count TSRMLS_CC );
1004
+ pce -> refcount -- ;
1005
+
1006
+ return result ;
999
1007
}
1000
1008
/* }}} */
1001
1009
@@ -1476,7 +1484,9 @@ static PHP_FUNCTION(preg_split)
1476
1484
RETURN_FALSE ;
1477
1485
}
1478
1486
1487
+ pce -> refcount ++ ;
1479
1488
php_pcre_split_impl (pce , subject , subject_len , return_value , limit_val , flags TSRMLS_CC );
1489
+ pce -> refcount -- ;
1480
1490
}
1481
1491
/* }}} */
1482
1492
@@ -1756,8 +1766,10 @@ static PHP_FUNCTION(preg_grep)
1756
1766
if ((pce = pcre_get_compiled_regex_cache (regex , regex_len TSRMLS_CC )) == NULL ) {
1757
1767
RETURN_FALSE ;
1758
1768
}
1759
-
1769
+
1770
+ pce -> refcount ++ ;
1760
1771
php_pcre_grep_impl (pce , input , return_value , flags TSRMLS_CC );
1772
+ pce -> refcount -- ;
1761
1773
}
1762
1774
/* }}} */
1763
1775
0 commit comments