helly Wed Oct 12 18:52:15 2005 EDT Modified files: /php-src/ext/spl spl_iterators.c spl_iterators.h Log: - Use pcre_cache_entry* rather than pcre* directly for refcounting # This prevents a theoretical crash when using too many regexes http://cvs.php.net/diff.php/php-src/ext/spl/spl_iterators.c?r1=1.91&r2=1.92&ty=u Index: php-src/ext/spl/spl_iterators.c diff -u php-src/ext/spl/spl_iterators.c:1.91 php-src/ext/spl/spl_iterators.c:1.92 --- php-src/ext/spl/spl_iterators.c:1.91 Mon Oct 10 20:18:31 2005 +++ php-src/ext/spl/spl_iterators.c Wed Oct 12 18:52:08 2005 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_iterators.c,v 1.91 2005/10/11 00:18:31 helly Exp $ */ +/* $Id: spl_iterators.c,v 1.92 2005/10/12 22:52:08 helly Exp $ */ #ifdef HAVE_CONFIG_H # include "config.h" @@ -903,16 +903,16 @@ case DIT_RegExIterator: case DIT_RecursiveRegExIterator: { char *regex; - int len; + int len, poptions, coptions; + pcre_extra *extra; intern->u.regex.flags = 0; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Os|l", &zobject, ce_inner, ®ex, &len, &intern->u.regex.flags) == FAILURE) { php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); return NULL; } - intern->u.regex.extra = NULL; - intern->u.regex.options = 0; - intern->u.regex.re = pcre_get_compiled_regex(regex, &intern->u.regex.extra, &intern->u.regex.options TSRMLS_CC); + intern->u.regex.pce = pcre_get_compiled_regex_cache(regex, len, &extra, &poptions, &coptions TSRMLS_CC); + intern->u.regex.pce->refcount++; break;; } #endif @@ -1265,6 +1265,7 @@ char *subject, tmp[32]; int subject_len, use_copy = 0; zval subject_copy; + pcre_extra *extra; intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); @@ -1287,7 +1288,8 @@ } } - count = pcre_exec(intern->u.regex.re, intern->u.regex.extra, subject, subject_len, 0, 0, NULL, 0); + extra = intern->u.regex.pce->extra; + count = pcre_exec(intern->u.regex.pce->re, extra, subject, subject_len, 0, 0, NULL, 0); if (use_copy) { zval_dtor(&subject_copy); @@ -1331,10 +1333,10 @@ } } -#if MBO_0 +#if HAVE_PCRE || HAVE_BUNDLED_PCRE if (object->dit_type == DIT_RegExIterator || object->dit_type == DIT_RecursiveRegExIterator) { - if (object->u.regex.re) { - /* actually there's no way to get rid of this early */ + if (object->u.regex.pce) { + object->u.regex.pce->refcount--; } } #endif http://cvs.php.net/diff.php/php-src/ext/spl/spl_iterators.h?r1=1.26&r2=1.27&ty=u Index: php-src/ext/spl/spl_iterators.h diff -u php-src/ext/spl/spl_iterators.h:1.26 php-src/ext/spl/spl_iterators.h:1.27 --- php-src/ext/spl/spl_iterators.h:1.26 Mon Oct 10 20:18:31 2005 +++ php-src/ext/spl/spl_iterators.h Wed Oct 12 18:52:09 2005 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_iterators.h,v 1.26 2005/10/11 00:18:31 helly Exp $ */ +/* $Id: spl_iterators.h,v 1.27 2005/10/12 22:52:09 helly Exp $ */ #ifndef SPL_ITERATORS_H #define SPL_ITERATORS_H @@ -125,9 +125,7 @@ #if HAVE_PCRE || HAVE_BUNDLED_PCRE struct { int flags; - pcre *re; - pcre_extra *extra; - int options; + pcre_cache_entry *pce; } regex; #endif } u;
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php