From 0abb0d894b8e7088b0b9b0247f37ec6ca019975d Mon Sep 17 00:00:00 2001 From: Fabian Keil Date: Wed, 23 Sep 2020 19:08:14 +0200 Subject: [PATCH] cgi_edit_actions_submit(): Check the toggle state of filters until no filters are left Previously we would stop looking after the first filter index wasn't found in the request URL. This worked in case of "split-large-forms 0" but resulted in filter state being ignored in case of "split-large-forms 1" which leads to request URLs that only contain a subset of the filters. Reported by withoutname in #921. --- cgiedit.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/cgiedit.c b/cgiedit.c index a9e4b0eb..64c8dc11 100644 --- a/cgiedit.c +++ b/cgiedit.c @@ -2940,6 +2940,51 @@ jb_err cgi_edit_actions_for_url(struct client_state *csp, } +/********************************************************************* + * + * Function : get_number_of_filters + * + * Description : Counts the number of filter available. + * + * Parameters : + * 1 : csp = Current client state (buffers, headers, etc...) + * + * Returns : Number of filters available. + * + *********************************************************************/ +static int get_number_of_filters(const struct client_state *csp) +{ + int i; + struct re_filterfile_spec *b; + struct file_list *fl; + int number_of_filters = 0; + + for (i = 0; i < MAX_AF_FILES; i++) + { + fl = csp->rlist[i]; + if ((NULL == fl) || (NULL == fl->f)) + { + /* + * Either there are no filter files left or this + * filter file just contains no valid filters. + * + * Continue to be sure we don't miss valid filter + * files that are chained after empty or invalid ones. + */ + continue; + } + + for (b = fl->f; b != NULL; b = b->next) + { + number_of_filters++; + } + } + + return number_of_filters; + +} + + /********************************************************************* * * Function : cgi_edit_actions_submit @@ -2978,6 +3023,7 @@ jb_err cgi_edit_actions_submit(struct client_state *csp, const char * action_set_name; struct file_list * fl; struct url_actions * b; + int number_of_filters; if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS)) { @@ -3066,7 +3112,9 @@ jb_err cgi_edit_actions_submit(struct client_state *csp, } } - for (filter_identifier = 0; !err; filter_identifier++) + number_of_filters = get_number_of_filters(csp); + + for (filter_identifier = 0; filter_identifier < number_of_filters && !err; filter_identifier++) { char key_value[30]; char key_name[30]; @@ -3095,8 +3143,8 @@ jb_err cgi_edit_actions_submit(struct client_state *csp, if (name == NULL) { - /* End of list */ - break; + /* The filter identifier isn't present. Try the next one. */ + continue; } type = get_char_param(parameters, key_type); -- 2.39.2