MINOR: action: Use a generic function to check validity of an action rule list
authorChristopher Faulet <cfaulet@haproxy.com>
Thu, 25 Mar 2021 16:19:04 +0000 (17:19 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Tue, 7 Sep 2021 13:18:09 +0000 (15:18 +0200)
The check_action_rules() function is now used to check the validity of an
action rule list. It is used from check_config_validity() function to check
L5/6/7 rulesets.

(cherry picked from commit 42c6cf950111736327863de5e82036a1d51deb04)
[cf: This patch is in fact a fix because the "tcp-resonse content" ruleset
     was not fully configured. It was ignored during Post-parsing
     stage. This patch should fix a bug reported in #1263 by @ HiggTh. It
     must be backported in all stable versions.]
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>

include/haproxy/action.h
src/action.c
src/cfgparse.c

index c7ce92d..216de45 100644 (file)
@@ -74,6 +74,11 @@ static inline void action_build_list(struct list *keywords,
                *p = '\0';
 }
 
+/* Check an action ruleset validity. It returns the number of error encountered
+ * andd err_code is updated if a warning is emitted.
+ */
+int check_action_rules(struct list *rules, struct proxy *px, int *err_code);
+
 /* Find and check the target table used by an action track-sc*. This
  * function should be called during the configuration validity check.
  *
index ee68072..38195b3 100644 (file)
 #include <haproxy/tools.h>
 
 
+/* Check an action ruleset validity. It returns the number of error encountered
+ * andd err_code is updated if a warning is emitted.
+ */
+int check_action_rules(struct list *rules, struct proxy *px, int *err_code)
+{
+       struct act_rule *rule;
+       char *errmsg = NULL;
+       int err = 0;
+
+       list_for_each_entry(rule, rules, list) {
+               if (rule->check_ptr && !rule->check_ptr(rule, px, &errmsg)) {
+                       ha_alert("Proxy '%s': %s.\n", px->id, errmsg);
+                       err++;
+               }
+
+               free(errmsg);
+               errmsg = NULL;
+       }
+
+       return err;
+}
+
 /* Find and check the target table used by an action track-sc*. This
  * function should be called during the configuration validity check.
  *
index 8a05271..5ef7e89 100644 (file)
@@ -34,7 +34,7 @@
 #include <unistd.h>
 
 #include <haproxy/acl.h>
-#include <haproxy/action-t.h>
+#include <haproxy/action.h>
 #include <haproxy/api.h>
 #include <haproxy/auth.h>
 #include <haproxy/backend.h>
@@ -2224,7 +2224,6 @@ int check_config_validity()
                struct switching_rule *rule;
                struct server_rule *srule;
                struct sticking_rule *mrule;
-               struct act_rule *arule;
                struct logsrv *tmplogsrv;
                unsigned int next_id;
                int nbproc;
@@ -2719,65 +2718,14 @@ int check_config_validity()
                        }
                }
 
-               /* check validity for 'tcp-request' layer 4 rules */
-               list_for_each_entry(arule, &curproxy->tcp_req.l4_rules, list) {
-                       err = NULL;
-                       if (arule->check_ptr && !arule->check_ptr(arule, curproxy, &err)) {
-                               ha_alert("Proxy '%s': %s.\n", curproxy->id, err);
-                               free(err);
-                               cfgerr++;
-                       }
-               }
-
-               /* check validity for 'tcp-request' layer 5 rules */
-               list_for_each_entry(arule, &curproxy->tcp_req.l5_rules, list) {
-                       err = NULL;
-                       if (arule->check_ptr && !arule->check_ptr(arule, curproxy, &err)) {
-                               ha_alert("Proxy '%s': %s.\n", curproxy->id, err);
-                               free(err);
-                               cfgerr++;
-                       }
-               }
-
-               /* check validity for 'tcp-request' layer 6 rules */
-               list_for_each_entry(arule, &curproxy->tcp_req.inspect_rules, list) {
-                       err = NULL;
-                       if (arule->check_ptr && !arule->check_ptr(arule, curproxy, &err)) {
-                               ha_alert("Proxy '%s': %s.\n", curproxy->id, err);
-                               free(err);
-                               cfgerr++;
-                       }
-               }
-
-               /* check validity for 'http-request' layer 7 rules */
-               list_for_each_entry(arule, &curproxy->http_req_rules, list) {
-                       err = NULL;
-                       if (arule->check_ptr && !arule->check_ptr(arule, curproxy, &err)) {
-                               ha_alert("Proxy '%s': %s.\n", curproxy->id, err);
-                               free(err);
-                               cfgerr++;
-                       }
-               }
-
-               /* check validity for 'http-response' layer 7 rules */
-               list_for_each_entry(arule, &curproxy->http_res_rules, list) {
-                       err = NULL;
-                       if (arule->check_ptr && !arule->check_ptr(arule, curproxy, &err)) {
-                               ha_alert("Proxy '%s': %s.\n", curproxy->id, err);
-                               free(err);
-                               cfgerr++;
-                       }
-               }
-
-               /* check validity for 'http-after-response' layer 7 rules */
-               list_for_each_entry(arule, &curproxy->http_after_res_rules, list) {
-                       err = NULL;
-                       if (arule->check_ptr && !arule->check_ptr(arule, curproxy, &err)) {
-                               ha_alert("Proxy '%s': %s.\n", curproxy->id, err);
-                               free(err);
-                               cfgerr++;
-                       }
-               }
+               /* check validity for 'tcp-request' layer 4/5/6/7 rules */
+               cfgerr += check_action_rules(&curproxy->tcp_req.l4_rules, curproxy, &err_code);
+               cfgerr += check_action_rules(&curproxy->tcp_req.l5_rules, curproxy, &err_code);
+               cfgerr += check_action_rules(&curproxy->tcp_req.inspect_rules, curproxy, &err_code);
+               cfgerr += check_action_rules(&curproxy->tcp_rep.inspect_rules, curproxy, &err_code);
+               cfgerr += check_action_rules(&curproxy->http_req_rules, curproxy, &err_code);
+               cfgerr += check_action_rules(&curproxy->http_res_rules, curproxy, &err_code);
+               cfgerr += check_action_rules(&curproxy->http_after_res_rules, curproxy, &err_code);
 
                if (curproxy->table && curproxy->table->peers.name) {
                        struct peers *curpeers;