@@ -2692,7 +2692,7 @@ PHP_FUNCTION(extract)
26922692}
26932693/* }}} */
26942694
2695- static void php_compact_var (HashTable * eg_active_symbol_table , zval * return_value , zval * entry , uint32_t pos ) /* {{{ */
2695+ static zend_result php_compact_var (HashTable * eg_active_symbol_table , zval * return_value , zval * entry , uint32_t pos ) /* {{{ */
26962696{
26972697 zval * value_ptr , data ;
26982698
@@ -2710,34 +2710,43 @@ static void php_compact_var(HashTable *eg_active_symbol_table, zval *return_valu
27102710 }
27112711 } else {
27122712 php_error_docref_unchecked (NULL , E_WARNING , "Undefined variable $%S" , Z_STR_P (entry ));
2713+ /* A user error handler may have thrown. */
2714+ return EG (exception ) ? FAILURE : SUCCESS ;
27132715 }
27142716 } else if (Z_TYPE_P (entry ) == IS_ARRAY ) {
2717+ zend_result result = SUCCESS ;
2718+
27152719#ifdef ZEND_CHECK_STACK_LIMIT
27162720 if (UNEXPECTED (zend_call_stack_overflowed (EG (stack_limit )))) {
27172721 zend_call_stack_size_error ();
2718- return ;
2722+ return FAILURE ;
27192723 }
27202724#endif
27212725 if (Z_REFCOUNTED_P (entry )) {
27222726 if (Z_IS_RECURSIVE_P (entry )) {
27232727 zend_throw_error (NULL , "Recursion detected" );
2724- return ;
2728+ return FAILURE ;
27252729 }
27262730 Z_PROTECT_RECURSION_P (entry );
27272731 }
27282732 ZEND_HASH_FOREACH_VAL (Z_ARRVAL_P (entry ), value_ptr ) {
2729- php_compact_var (eg_active_symbol_table , return_value , value_ptr , pos );
2730- if ( UNEXPECTED ( EG ( exception ))) {
2733+ if ( UNEXPECTED ( php_compact_var (eg_active_symbol_table , return_value , value_ptr , pos ) == FAILURE )) {
2734+ result = FAILURE ;
27312735 break ;
27322736 }
27332737 } ZEND_HASH_FOREACH_END ();
27342738 if (Z_REFCOUNTED_P (entry )) {
27352739 Z_UNPROTECT_RECURSION_P (entry );
27362740 }
2741+
2742+ return result ;
27372743 } else {
27382744 php_error_docref (NULL , E_WARNING , "Argument #%d must be string or array of strings, %s given" , pos , zend_zval_value_name (entry ));
2739- return ;
2745+ /* A user error handler may have thrown. */
2746+ return EG (exception ) ? FAILURE : SUCCESS ;
27402747 }
2748+
2749+ return SUCCESS ;
27412750}
27422751/* }}} */
27432752
@@ -2769,8 +2778,7 @@ PHP_FUNCTION(compact)
27692778 }
27702779
27712780 for (i = 0 ; i < num_args ; i ++ ) {
2772- php_compact_var (symbol_table , return_value , & args [i ], i + 1 );
2773- if (UNEXPECTED (EG (exception ))) {
2781+ if (UNEXPECTED (php_compact_var (symbol_table , return_value , & args [i ], i + 1 ) == FAILURE )) {
27742782 RETURN_THROWS ();
27752783 }
27762784 }
0 commit comments