From d5ab8b7b79dc44b1ffba0ed4b5a65634c1670dce Mon Sep 17 00:00:00 2001 From: denisbaranov Date: Wed, 20 Nov 2019 16:45:37 +0200 Subject: [PATCH] Fix endless recursion in the function um_check_conditions_on_submit() --- includes/core/um-actions-form.php | 38 ++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/includes/core/um-actions-form.php b/includes/core/um-actions-form.php index 2d867b7f..501d30a6 100644 --- a/includes/core/um-actions-form.php +++ b/includes/core/um-actions-form.php @@ -261,7 +261,21 @@ function um_submit_form_errors_hook( $args ) { add_action( 'um_submit_form_errors_hook', 'um_submit_form_errors_hook', 10 ); -function um_check_conditions_on_submit( $condition, $fields, $args ) { +/** + * Error processing: Conditions + * @staticvar int $counter + * @param array $condition + * @param array $fields + * @param array $args + * @param boolean $reset + * @return boolean + * @throws Exception + */ +function um_check_conditions_on_submit( $condition, $fields, $args, $reset = false ) { + static $counter = 0; + if ( $reset ) { + $counter = 0; + } $continue = false; list( $visibility, $parent_key, $op, $parent_value ) = $condition; @@ -273,7 +287,11 @@ function um_check_conditions_on_submit( $condition, $fields, $args ) { if ( ! empty( $fields[ $parent_key ]['conditions'] ) ) { foreach ( $fields[ $parent_key ]['conditions'] as $parent_condition ) { - $continue = um_check_conditions_on_submit( $parent_condition, $fields, $args ); + if ( 64 > $counter++ ) { + $continue = um_check_conditions_on_submit( $parent_condition, $fields, $args ); + } else { + throw new Exception( 'Endless recursion in the function ' . __FUNCTION__, 512 ); + } if ( ! empty( $continue ) ) { return $continue; } @@ -411,11 +429,19 @@ function um_submit_form_errors_hook_( $args ) { $array = apply_filters( 'um_get_custom_field_array', $array, $fields ); if ( ! empty( $array['conditions'] ) ) { - foreach ( $array['conditions'] as $condition ) { - $continue = um_check_conditions_on_submit( $condition, $fields, $args ); - if ( $continue === true ) { - continue 2; + try { + foreach ( $array['conditions'] as $condition ) { + $continue = um_check_conditions_on_submit( $condition, $fields, $args, true ); + if ( $continue === true ) { + continue 2; + } } + } catch ( Exception $e ) { + UM()->form()->add_error( $key, sprintf( __( '%s - wrong conditions.', 'ultimate-member' ), $array['title'] ) ); + $notice = '
' . sprintf( __( '%s - wrong conditions.', 'ultimate-member' ), $array['title'] ) . '
'; + add_action( 'um_after_profile_fields', function() use ( $notice ) { + echo $notice; + }, 900 ); } }