MINOR: action: Factorize checks on rules calling check_ptr if defined
diff --git a/src/cfgparse.c b/src/cfgparse.c
index 77b9b08..1f56b6e 100644
--- a/src/cfgparse.c
+++ b/src/cfgparse.c
@@ -7449,8 +7449,7 @@
struct switching_rule *rule;
struct server_rule *srule;
struct sticking_rule *mrule;
- struct act_rule *trule;
- struct act_rule *hrqrule;
+ struct act_rule *arule;
struct logsrv *tmplogsrv;
unsigned int next_id;
int nbproc;
@@ -7865,225 +7864,54 @@
}
}
- /* find the target table for 'tcp-request' layer 4 rules */
- list_for_each_entry(trule, &curproxy->tcp_req.l4_rules, list) {
- struct proxy *target;
-
- if (trule->action < ACT_ACTION_TRK_SC0 || trule->action > ACT_ACTION_TRK_SCMAX)
- continue;
-
- if (trule->arg.trk_ctr.table.n)
- target = proxy_tbl_by_name(trule->arg.trk_ctr.table.n);
- else
- target = curproxy;
-
- if (!target) {
- Alert("Proxy '%s': unable to find table '%s' referenced by track-sc%d.\n",
- curproxy->id, trule->arg.trk_ctr.table.n,
- trk_idx(trule->action));
- cfgerr++;
- }
- else if (target->table.size == 0) {
- Alert("Proxy '%s': table '%s' used but not configured.\n",
- curproxy->id, trule->arg.trk_ctr.table.n ? trule->arg.trk_ctr.table.n : curproxy->id);
- cfgerr++;
- }
- else if (!stktable_compatible_sample(trule->arg.trk_ctr.expr, target->table.type)) {
- Alert("Proxy '%s': stick-table '%s' uses a type incompatible with the 'track-sc%d' rule.\n",
- curproxy->id, trule->arg.trk_ctr.table.n ? trule->arg.trk_ctr.table.n : curproxy->id,
- trk_idx(trule->action));
- cfgerr++;
- }
- else {
- free(trule->arg.trk_ctr.table.n);
- trule->arg.trk_ctr.table.t = &target->table;
- /* Note: if we decide to enhance the track-sc syntax, we may be able
- * to pass a list of counters to track and allocate them right here using
- * stktable_alloc_data_type().
- */
- }
- }
-
- /* find the target table for 'tcp-request' layer 5 rules */
- list_for_each_entry(trule, &curproxy->tcp_req.l5_rules, list) {
- struct proxy *target;
-
- if (trule->action < ACT_ACTION_TRK_SC0 || trule->action > ACT_ACTION_TRK_SCMAX)
- continue;
-
- if (trule->arg.trk_ctr.table.n)
- target = proxy_tbl_by_name(trule->arg.trk_ctr.table.n);
- else
- target = curproxy;
-
- if (!target) {
- Alert("Proxy '%s': unable to find table '%s' referenced by track-sc%d.\n",
- curproxy->id, trule->arg.trk_ctr.table.n,
- trk_idx(trule->action));
- cfgerr++;
- }
- else if (target->table.size == 0) {
- Alert("Proxy '%s': table '%s' used but not configured.\n",
- curproxy->id, trule->arg.trk_ctr.table.n ? trule->arg.trk_ctr.table.n : curproxy->id);
- cfgerr++;
- }
- else if (!stktable_compatible_sample(trule->arg.trk_ctr.expr, target->table.type)) {
- Alert("Proxy '%s': stick-table '%s' uses a type incompatible with the 'track-sc%d' rule.\n",
- curproxy->id, trule->arg.trk_ctr.table.n ? trule->arg.trk_ctr.table.n : curproxy->id,
- trk_idx(trule->action));
- cfgerr++;
- }
- else {
- free(trule->arg.trk_ctr.table.n);
- trule->arg.trk_ctr.table.t = &target->table;
- /* Note: if we decide to enhance the track-sc syntax, we may be able
- * to pass a list of counters to track and allocate them right here using
- * stktable_alloc_data_type().
- */
- }
- }
-
- /* find the target table for 'tcp-request' layer 6 rules */
- list_for_each_entry(trule, &curproxy->tcp_req.inspect_rules, list) {
- struct proxy *target;
-
- if (trule->action < ACT_ACTION_TRK_SC0 || trule->action > ACT_ACTION_TRK_SCMAX)
- continue;
-
- if (trule->arg.trk_ctr.table.n)
- target = proxy_tbl_by_name(trule->arg.trk_ctr.table.n);
- else
- target = curproxy;
-
- if (!target) {
- Alert("Proxy '%s': unable to find table '%s' referenced by track-sc%d.\n",
- curproxy->id, trule->arg.trk_ctr.table.n,
- trk_idx(trule->action));
- cfgerr++;
- }
- else if (target->table.size == 0) {
- Alert("Proxy '%s': table '%s' used but not configured.\n",
- curproxy->id, trule->arg.trk_ctr.table.n ? trule->arg.trk_ctr.table.n : curproxy->id);
- cfgerr++;
- }
- else if (!stktable_compatible_sample(trule->arg.trk_ctr.expr, target->table.type)) {
- Alert("Proxy '%s': stick-table '%s' uses a type incompatible with the 'track-sc%d' rule.\n",
- curproxy->id, trule->arg.trk_ctr.table.n ? trule->arg.trk_ctr.table.n : curproxy->id,
- trk_idx(trule->action));
+ /* 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)) {
+ Alert("Proxy '%s': %s.\n", curproxy->id, err);
+ free(err);
cfgerr++;
}
- else {
- free(trule->arg.trk_ctr.table.n);
- trule->arg.trk_ctr.table.t = &target->table;
- /* Note: if we decide to enhance the track-sc syntax, we may be able
- * to pass a list of counters to track and allocate them right here using
- * stktable_alloc_data_type().
- */
- }
}
- /* parse http-request capture rules to ensure id really exists */
- list_for_each_entry(hrqrule, &curproxy->http_req_rules, list) {
- if (hrqrule->action != ACT_CUSTOM ||
- hrqrule->action_ptr != http_action_req_capture_by_id)
- continue;
-
- if (hrqrule->arg.capid.idx >= curproxy->nb_req_cap) {
- Alert("Proxy '%s': unable to find capture id '%d' referenced by http-request capture rule.\n",
- curproxy->id, hrqrule->arg.capid.idx);
+ /* 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)) {
+ Alert("Proxy '%s': %s.\n", curproxy->id, err);
+ free(err);
cfgerr++;
}
}
- /* parse http-response capture rules to ensure id really exists */
- list_for_each_entry(hrqrule, &curproxy->http_res_rules, list) {
- if (hrqrule->action != ACT_CUSTOM ||
- hrqrule->action_ptr != http_action_res_capture_by_id)
- continue;
-
- if (hrqrule->arg.capid.idx >= curproxy->nb_rsp_cap) {
- Alert("Proxy '%s': unable to find capture id '%d' referenced by http-response capture rule.\n",
- curproxy->id, hrqrule->arg.capid.idx);
+ /* 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)) {
+ Alert("Proxy '%s': %s.\n", curproxy->id, err);
+ free(err);
cfgerr++;
}
}
- /* find the target table for 'http-request' layer 7 rules */
- list_for_each_entry(hrqrule, &curproxy->http_req_rules, list) {
- struct proxy *target;
-
- if (hrqrule->action < ACT_ACTION_TRK_SC0 || hrqrule->action > ACT_ACTION_TRK_SCMAX)
- continue;
-
- if (hrqrule->arg.trk_ctr.table.n)
- target = proxy_tbl_by_name(hrqrule->arg.trk_ctr.table.n);
- else
- target = curproxy;
-
- if (!target) {
- Alert("Proxy '%s': unable to find table '%s' referenced by track-sc%d.\n",
- curproxy->id, hrqrule->arg.trk_ctr.table.n,
- trk_idx(hrqrule->action));
- cfgerr++;
- }
- else if (target->table.size == 0) {
- Alert("Proxy '%s': table '%s' used but not configured.\n",
- curproxy->id, hrqrule->arg.trk_ctr.table.n ? hrqrule->arg.trk_ctr.table.n : curproxy->id);
- cfgerr++;
- }
- else if (!stktable_compatible_sample(hrqrule->arg.trk_ctr.expr, target->table.type)) {
- Alert("Proxy '%s': stick-table '%s' uses a type incompatible with the 'track-sc%d' rule.\n",
- curproxy->id, hrqrule->arg.trk_ctr.table.n ? hrqrule->arg.trk_ctr.table.n : curproxy->id,
- trk_idx(hrqrule->action));
+ /* 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)) {
+ Alert("Proxy '%s': %s.\n", curproxy->id, err);
+ free(err);
cfgerr++;
}
- else {
- free(hrqrule->arg.trk_ctr.table.n);
- hrqrule->arg.trk_ctr.table.t = &target->table;
- /* Note: if we decide to enhance the track-sc syntax, we may be able
- * to pass a list of counters to track and allocate them right here using
- * stktable_alloc_data_type().
- */
- }
}
- /* find the target table for 'http-response' layer 7 rules */
- list_for_each_entry(hrqrule, &curproxy->http_res_rules, list) {
- struct proxy *target;
-
- if (hrqrule->action < ACT_ACTION_TRK_SC0 || hrqrule->action > ACT_ACTION_TRK_SCMAX)
- continue;
-
- if (hrqrule->arg.trk_ctr.table.n)
- target = proxy_tbl_by_name(hrqrule->arg.trk_ctr.table.n);
- else
- target = curproxy;
-
- if (!target) {
- Alert("Proxy '%s': unable to find table '%s' referenced by track-sc%d.\n",
- curproxy->id, hrqrule->arg.trk_ctr.table.n,
- trk_idx(hrqrule->action));
- cfgerr++;
- }
- else if (target->table.size == 0) {
- Alert("Proxy '%s': table '%s' used but not configured.\n",
- curproxy->id, hrqrule->arg.trk_ctr.table.n ? hrqrule->arg.trk_ctr.table.n : curproxy->id);
- cfgerr++;
- }
- else if (!stktable_compatible_sample(hrqrule->arg.trk_ctr.expr, target->table.type)) {
- Alert("Proxy '%s': stick-table '%s' uses a type incompatible with the 'track-sc%d' rule.\n",
- curproxy->id, hrqrule->arg.trk_ctr.table.n ? hrqrule->arg.trk_ctr.table.n : curproxy->id,
- trk_idx(hrqrule->action));
+ /* 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)) {
+ Alert("Proxy '%s': %s.\n", curproxy->id, err);
+ free(err);
cfgerr++;
}
- else {
- free(hrqrule->arg.trk_ctr.table.n);
- hrqrule->arg.trk_ctr.table.t = &target->table;
- /* Note: if we decide to enhance the track-sc syntax, we may be able
- * to pass a list of counters to track and allocate them right here using
- * stktable_alloc_data_type().
- */
- }
}
/* move any "block" rules at the beginning of the http-request rules */
@@ -8802,16 +8630,16 @@
* with no inspect-delay
*/
if ((curproxy->cap & PR_CAP_FE) && !curproxy->tcp_req.inspect_delay) {
- list_for_each_entry(trule, &curproxy->tcp_req.inspect_rules, list) {
- if (trule->action == ACT_TCP_CAPTURE &&
- !(trule->arg.cap.expr->fetch->val & SMP_VAL_FE_SES_ACC))
+ list_for_each_entry(arule, &curproxy->tcp_req.inspect_rules, list) {
+ if (arule->action == ACT_TCP_CAPTURE &&
+ !(arule->arg.cap.expr->fetch->val & SMP_VAL_FE_SES_ACC))
break;
- if ((trule->action >= ACT_ACTION_TRK_SC0 && trule->action <= ACT_ACTION_TRK_SCMAX) &&
- !(trule->arg.trk_ctr.expr->fetch->val & SMP_VAL_FE_SES_ACC))
+ if ((arule->action >= ACT_ACTION_TRK_SC0 && arule->action <= ACT_ACTION_TRK_SCMAX) &&
+ !(arule->arg.trk_ctr.expr->fetch->val & SMP_VAL_FE_SES_ACC))
break;
}
- if (&trule->list != &curproxy->tcp_req.inspect_rules) {
+ if (&arule->list != &curproxy->tcp_req.inspect_rules) {
Warning("config : %s '%s' : some 'tcp-request content' rules explicitly depending on request"
" contents were found in a frontend without any 'tcp-request inspect-delay' setting."
" This means that these rules will randomly find their contents. This can be fixed by"