summaryrefslogtreecommitdiff
path: root/ext/spl/spl_iterators.c
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2014-10-15 08:32:54 +0200
committerAnatol Belski <ab@php.net>2014-10-15 08:32:54 +0200
commit382f95e6127d52b079d172ccd017cf306402e015 (patch)
treedcc5d8f6f2b1390a3d93a5be5994d625d260bfd9 /ext/spl/spl_iterators.c
parent766eb0103fe8f59c00ddadc5c5767093ee35b2e8 (diff)
parent01d17228dc62ea30b7ad25835f049ccd1998b5f2 (diff)
downloadphp-git-382f95e6127d52b079d172ccd017cf306402e015.tar.gz
Merge remote-tracking branch 'origin/master' into native-tls
* origin/master: (25 commits) Fix return code (merges are hard :( ) fix bad merge Fix bug #68113 (Heap corruption in exif_thumbnail()) Fix bug #68089 - do not accept options with embedded \0 Fixed bug #68044: Integer overflow in unserialize() (32-bits only) Fix bug #68027 - fix date parsing in XMLRPC lib Fix bug #68113 (Heap corruption in exif_thumbnail()) Fix bug #68089 - do not accept options with embedded \0 Fixed bug #68044: Integer overflow in unserialize() (32-bits only) Fix bug #68027 - fix date parsing in XMLRPC lib Fix bug #68113 (Heap corruption in exif_thumbnail()) Fix bug #68089 - do not accept options with embedded \0 Fixed bug #68044: Integer overflow in unserialize() (32-bits only) Fix bug #68027 - fix date parsing in XMLRPC lib Fixed bug #68128 Added API function to retrive current custom heap handlers update NEWS and UPGRADING Allow to substitute storage layer in memory manager. Upated NEWS Address issues raised by @nikic ...
Diffstat (limited to 'ext/spl/spl_iterators.c')
-rw-r--r--ext/spl/spl_iterators.c43
1 files changed, 36 insertions, 7 deletions
diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c
index f47093bf4c..8b09e3ef37 100644
--- a/ext/spl/spl_iterators.c
+++ b/ext/spl/spl_iterators.c
@@ -2037,8 +2037,10 @@ SPL_METHOD(RegexIterator, accept)
if (Z_TYPE(intern->current.data) == IS_UNDEF) {
RETURN_FALSE;
+ } else if (Z_TYPE(intern->current.data) == IS_ARRAY) {
+ RETURN_FALSE;
}
-
+
if (intern->u.regex.flags & REGIT_USE_KEY) {
subject_ptr = &intern->current.key;
} else {
@@ -2074,8 +2076,7 @@ SPL_METHOD(RegexIterator, accept)
ZVAL_UNDEF(&intern->current.data);
php_pcre_match_impl(intern->u.regex.pce, subject, subject_len, &zcount,
&intern->current.data, intern->u.regex.mode == REGIT_MODE_ALL_MATCHES, intern->u.regex.use_flags, intern->u.regex.preg_flags, 0 TSRMLS_CC);
- count = zend_hash_num_elements(Z_ARRVAL(intern->current.data));
- RETVAL_BOOL(count > 0);
+ RETVAL_BOOL(Z_LVAL(zcount) > 0);
break;
case REGIT_MODE_SPLIT:
@@ -2254,7 +2255,7 @@ SPL_METHOD(RecursiveRegexIterator, __construct)
SPL_METHOD(RecursiveRegexIterator, getChildren)
{
spl_dual_it_object *intern;
- zval retval, regex;
+ zval retval;
if (zend_parse_parameters_none() == FAILURE) {
return;
@@ -2264,13 +2265,40 @@ SPL_METHOD(RecursiveRegexIterator, getChildren)
zend_call_method_with_0_params(&intern->inner.zobject, intern->inner.ce, NULL, "getchildren", &retval);
if (!EG(exception)) {
- ZVAL_STR_COPY(&regex, intern->u.regex.regex);
- spl_instantiate_arg_ex2(Z_OBJCE_P(getThis()), return_value, &retval, &regex TSRMLS_CC);
- zval_ptr_dtor(&regex);
+ zval args[5];
+
+ ZVAL_COPY(&args[0], &retval);
+ ZVAL_STR_COPY(&args[1], intern->u.regex.regex);
+ ZVAL_LONG(&args[2], intern->u.regex.mode);
+ ZVAL_LONG(&args[3], intern->u.regex.flags);
+ ZVAL_LONG(&args[4], intern->u.regex.preg_flags);
+
+ spl_instantiate_arg_n(Z_OBJCE_P(getThis()), return_value, 5, args TSRMLS_CC);
+
+ zval_ptr_dtor(&args[1]);
}
zval_ptr_dtor(&retval);
} /* }}} */
+SPL_METHOD(RecursiveRegexIterator, accept)
+{
+ spl_dual_it_object *intern;
+
+ if (zend_parse_parameters_none() == FAILURE) {
+ return;
+ }
+
+ SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis());
+
+ if (Z_TYPE(intern->current.data) == IS_UNDEF) {
+ RETURN_FALSE;
+ } else if (Z_TYPE(intern->current.data) == IS_ARRAY) {
+ RETURN_BOOL(zend_hash_num_elements(Z_ARRVAL(intern->current.data)) > 0);
+ }
+
+ zend_call_method_with_0_params(getThis(), spl_ce_RegexIterator, NULL, "accept", return_value);
+}
+
#endif
/* {{{ spl_dual_it_dtor */
@@ -2456,6 +2484,7 @@ ZEND_END_ARG_INFO();
static const zend_function_entry spl_funcs_RecursiveRegexIterator[] = {
SPL_ME(RecursiveRegexIterator, __construct, arginfo_rec_regex_it___construct, ZEND_ACC_PUBLIC)
+ SPL_ME(RecursiveRegexIterator, accept, arginfo_recursive_it_void, ZEND_ACC_PUBLIC)
SPL_ME(RecursiveFilterIterator, hasChildren, arginfo_recursive_it_void, ZEND_ACC_PUBLIC)
SPL_ME(RecursiveRegexIterator, getChildren, arginfo_recursive_it_void, ZEND_ACC_PUBLIC)
PHP_FE_END